2013-04-08 11 views
6

Bir rhel 6 platformunda basit bir disk performansı testi yapmak istiyorum. Sadece diske 1G bayt yazmak. Dosyanın ilk bağlanmamış olup olmadığını buldum, kesilmesinden çok daha hızlı olurdu. 15s'e karşı 1.5s idi.fwrite() dosyası daha hızlı bir şekilde kaldırırsa() dosyayı kırpmadan önce

Neden? Unlink() 'un son sabit bağlantının dosyayı 0'a keseceğini ve inode'u sileceğini düşündüm. Neden kırıklar kesilmeden daha hızlıydı?

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int 
main(int argc, char* argv[]) 
{ 
    if (argc < 2) { 
     return -1; 
    } 

    char buf[1024]; 

    srand(time(0)); 

    int i; 
    for (i = 0; i < 1024; ++i) { 
     buf[i] = rand(); 
    } 

    /* unlink(argv[1]); */ 
    FILE* fp = fopen(argv[1], "wb+"); 
    if (fp == NULL) { 
     perror("fopen"); 
     return -1; 
    } 

    for (i = 0; i < 1024 * 1024; ++i) { 
     if (fwrite(buf, 1024, 1, fp) != 1) { 
      perror("fwrite"); 
      return -1; 
     } 
    } 

    return 0; 
} 

cevap

5

dosyaları silmek ve tembel kendi alan açmak diske ve dosya sistemi üzerinde yeterli boş alan, bir dosya silme kesiliyor daha hızlı görünebilir. Sadece inode'u silinmiş olarak işaretleyebilir ve dosyayı arka planda veya daha sonra silebilir ve yeni yazılar için hemen hemen yeni bir inode yaratabilirsiniz.

+0

Alexey, cevabınız için teşekkürler. Bununla ilgili aynı düşünceye sahiptim ama emin değilim. Ama yine de neden kırpmanın bu şekilde uygulanmadığını anlamıyorum. Bir dosya sıfıra kesilirse, neden kesilmiş blokları yeni bir inode'a taşımayın ve bir sonraki yazım için geçerli inode'u temiz tutun? – Zhongzhi

+0

Kesinlikle bilmiyorum. Gerçekten, sorunuzun cevabı dosya sisteminin uygulanmasına bağlıdır. Bunu daha fazla araştırmak, dosya sistemi belgelerine veya kaynak koduna bakmak ve web'deki performans tartışmalarına bakmak isteyebilirsiniz. –

+1

@Zhongzhi "neden kesilmiş blokları yeni bir inode'a taşımayın" - Ne yeni inode? Programın geri kalanını sisteminizin masrafı pahasına daha hızlı yapmak için bir inode tahsis etmek berbat bir fikir ve FS kodunun anlamsız bir komplikasyondur. Bu, bir dosyaya olan son bağlantıyı sildikten sonra engellemenin engellemenin, zaman uyumsuz olarak geri yüklendiği için, deleterde ücretlendirilmemesi gerçeğinden oldukça farklıdır. –

İlgili konular