Io EXT4性能较低的连续写入

Io EXT4性能较低的连续写入,io,fwrite,ext4,Io,Fwrite,Ext4,我正在使用一个C程序,它可以做很多事情,但在某些方面,它可以编写一个完整的硬盘,在一个固定大小的文件上多次调用fwrite 电话是这样的: fwrite(some_memory,size_element,total_elements,file); 当我测量这个电话的挂机时间时,每个电话都比前一个要长一点。因此,例如,如果要写入900MB的数据块,第一次调用(磁盘为空)在7秒内结束,但最后一次调用需要10~11秒(磁盘几乎已满) 这是预期的行为吗?是否有任何方法可以独立于磁盘当前容量获得

我正在使用一个C程序,它可以做很多事情,但在某些方面,它可以编写一个完整的硬盘,在一个固定大小的文件上多次调用fwrite

电话是这样的:

    fwrite(some_memory,size_element,total_elements,file);
当我测量这个电话的挂机时间时,每个电话都比前一个要长一点。因此,例如,如果要写入900MB的数据块,第一次调用(磁盘为空)在7秒内结束,但最后一次调用需要10~11秒(磁盘几乎已满)

这是预期的行为吗?是否有任何方法可以独立于磁盘当前容量获得一致的写入时间?
我使用的是EXT4 wd绿色2TB卷

我认为这是意料之中的,因为内核的写回缓存很可能会满足您的早期调用,因此返回速度会稍快一些,因为在fwrite返回时,并非所有数据都已到达磁盘。但是,我不知道与您试图写入的900MB数据相比,您的系统有多少内存,所以这只是一个猜测

如果内核的缓存变满(例如,因为磁盘无法跟上),那么用户空间程序将被阻塞,直到它足够空并且能够接受更多的数据泄漏桶样式。只有当所有数据都进入缓存后,fwrite才能完成。但是,此时,您可能正在执行另一个fwrite调用,该调用会再次加满缓存,并且随后的调用将被迫等待更长的时间,因为缓存尚未完全清空。我想你会到达一个固定的点

要查看缓存是否真的在行为背后,您可以在每次写入后发出fsync(破坏您的性能),并从提交fwrite到完成fsync花费时间,看看差异是否如此之大

您可以做的另一件事可能会有所帮助,那就是预先分配文件的完整大小,这样文件系统就不会在新数据追加到末尾时被迫对其进行重新填充(这应该减少元数据操作并防止碎片化)

考虑到您正在编写的大量数据,中的脏旋钮也可能会起作用