我必須在C(或C++)中編寫一個程序Linux
,它將測試不同文件系統上的寫入和讀取速度。我必須確保所有數據都寫入磁盤(不在緩存中)。測試NTFS,FAT,EXT4上的寫入/讀取速度
所以我的第一個問題 - 我應該用什麼函數來打開一個新文件?我之前使用open
函數,參數爲O_DIRECT
和O_SYNC
,除了一件事情之外,一切都很好 - 寫入像1KB這樣的小文件非常慢,類似0.01MB/s。
我試圖用fopen
函數來代替open
,並fflush
功能,以確保所有數據直接寫入磁盤,和我第一次測試了FAT32
文件系統。 1000個1KB的文件在5秒內寫入磁盤(這裏是SD卡)。例如0.18MB/s,我認爲這是正確的。
現在問題發生在測試EXT4
和NTFS
文件系統時。在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
每寫,所以這是問題。
有沒有辦法在寫完所有文件後最後調用它?或者每隔幾秒鐘?我是否必須使用不同的線程?
看那'fsync'功能。它確保文件描述符後面的文件正確地同步到磁盤。 O_DIRECT和O_SYNC都可能會給你帶來更糟的總體性能。 – Art 2013-04-11 14:51:58
根據您需要這樣做的原因,您最好使用現有的性能測試。看看[IOZone](http://www.iozone.org/)。信息源是可用的,所以如果你想看看其他人如何接近特定的測試,你有一個良好的測試參考。 – 2013-04-11 14:53:02
請不要重新發明輪子。 – devnull 2013-04-11 14:56:14