【问题标题】:Testing write/read speed on NTFS, FAT, EXT4在 NTFS、FAT、EXT4 上测试写入/读取速度
【发布时间】:2013-04-11 14:46:51
【问题描述】:

我必须在Linux 中用C(或C++)编写一个程序来测试不同文件系统上的读写速度。我必须确保所有数据都写入磁盘(不在缓存中)。

所以我的第一个问题 - 我应该使用什么函数来打开一个新文件?我在open 之前使用了带有参数O_DIRECTO_SYNC 的函数,一切都很好,除了一件事——写1KB 这样的小文件非常慢,比如0.01MB/s。

我尝试使用fopen 函数而不是openfflush 函数来确保所有数据都直接写入磁盘,我首先在FAT32 文件系统上对其进行了测试。在 5 秒内将 1000 个 1KB 的文件写入磁盘(此处为 SD 卡)。大约 0.18MB/s,我认为这是正确的。

现在测试EXT4NTFS 文件系统时会出现问题。在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,所以这就是问题所在。

当所有文件都写完后,有什么方法可以在最后调用它吗?或者也许每隔几秒钟?我必须使用不同的线程吗?

【问题讨论】:

  • 查看fsync函数。它确保文件描述符后面的文件正确同步到磁盘。 O_DIRECT 和 O_SYNC 都可能会给您带来更差的总体性能。
  • 根据您需要这样做的原因,您最好使用现有的性能测试。看看IOZone。该资源是可用的,因此如果您想查看其他人如何进行特定测试,您有一个经过良好测试的参考。
  • 请不要重新发明轮子。
  • @CaptainObvlious 谢谢我会检查它
  • Bonnie++,如果您为自己的平台自定义构建它可能会更容易。

标签: c++ c benchmarking fat32 ext4


【解决方案1】:

请参阅How do I ensure data is written to disk before closing fstream?,但我认为您无法确保数据实际上在磁盘上,而不是在磁盘控制器的缓存中,甚至在驱动器的板载缓存中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多