2013-04-11 830 views
1

我必須在C(或C++)中編寫一個程序Linux,它將測試不同文件系統上的寫入和讀取速度。我必須確保所有數據都寫入磁盤(不在緩存中)。測試NTFS,FAT,EXT4上的寫入/讀取速度

所以我的第一個問題 - 我應該用什麼函數來打開一個新文件?我之前使用open函數,參數爲O_DIRECTO_SYNC,除了一件事情之外,一切都很好 - 寫入像1KB這樣的小文件非常慢,類似0.01MB/s。

我試圖用fopen函數來代替open,並fflush功能,以確保所有數據直接寫入磁盤,和我第一次測試了FAT32文件系統。 1000個1KB的文件在5秒內寫入磁盤(這裏是SD卡)。例如0.18MB/s,我認爲這是正確的。

現在問題發生在測試EXT4NTFS文件系統時。在EXT4。在測試100KB傳輸速度爲180MB/s(非常錯誤,我的SD卡傳輸速率只有20MB/s)時,1KB文件寫入了12MB/s(錯誤)的文件。

我實際上是寫文件的代碼如下所示:

clock_gettime(CLOCK_REALTIME, &ts); 

for (int i = 0; i < amount; ++i) 
{ 
    p = fopen(buffer2, "w+"); 

    fwrite(buff, size*1024, 1, p); 
    if (fflush(p) != 0) { cout << "fflush error"; return 0; } 

    fclose(p); 
} 

clock_gettime(CLOCK_REALTIME, &ts2); 

time2 = diff2(ts,ts2); 

僅適用於FAT32文件系統好。第二個代碼(前中)看起來是這樣的:

for (int i = 0; i < amount; ++i) 
{ 
    int fd = open(buffer2, O_WRONLY | O_CREAT, 0777); 
    if (error(fd, "open")) return false; 

    if ((write(fd, buff, size*1024)) < 0) { perror("write error"); return 0; } 

    if ((fsync(fd)) == -1) { perror("fsync"); return 0; } 

    close(fd); 
} 

適用於所有的文件系統,但小文件寫入速度極慢。 也許我應該爲不同的文件系統使用不同的代碼?有任何想法嗎?

EDIT

我發現爲什麼寫小文件很慢。這是因爲fsync函數,並且在不同的文件系統上需要不同的時間。我打電話給fsync每寫,所以這是問題。

有沒有辦法在寫完所有文件後最後調用它?或者每隔幾秒鐘?我是否必須使用不同的線程?

+1

看那'fsync'功能。它確保文件描述符後面的文件正確地同步到磁盤。 O_DIRECT和O_SYNC都可能會給你帶來更糟的總體性能。 – Art 2013-04-11 14:51:58

+3

根據您需要這樣做的原因,您最好使用現有的性能測試。看看[IOZone](http://www.iozone.org/)。信息源是可用的,所以如果你想看看其他人如何接近特定的測試,你有一個良好的測試參考。 – 2013-04-11 14:53:02

+0

請不要重新發明輪子。 – devnull 2013-04-11 14:56:14

回答