我必须在Linux
中用C(或C ++)编写一个程序,它将测试不同文件系统上的写入和读取速度。我必须确保所有数据都写入磁盘(而不是缓存)。
所以我的第一个问题 - 我应该用什么功能打开一个新文件?我在open
函数之前使用了参数O_DIRECT
和O_SYNC
,一切都很好,除了一件事 - 编写像1KB这样的小文件非常慢,类似于0.01MB / s。
我尝试使用fopen
函数代替open
和fflush
函数来确保所有数据都直接写入磁盘,并且我首先在FAT32
上测试了它文件系统。在5秒内将1000个1KB的文件写入磁盘(此处为SD卡)。像0.18MB / s,我认为这是正确的。
现在,在测试EXT4
和NTFS
文件系统时会出现问题。在EXT4
。 1KB文件被写成12MB / s(错误),当测试100KB传输是180MB / s(非常错误,我的SD卡传输速率只有20MB / 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
,所以这就是问题所在。
当所有文件都被写入时,有没有办法在最后调用它?或者也许每隔几秒钟?我必须使用不同的线程吗?
答案 0 :(得分:1)
请参阅How do I ensure data is written to disk before closing fstream?,但我认为您无法确保数据实际位于磁盘上,而不是磁盘控制器中的缓存中,甚至是驱动器的板载缓存中