我在linux 2.6内核上使用ext4。我有字节数组的记录,范围从几百到16MB。对于每个记录使用write()的应用程序是否有任何好处,而不是说缓冲X MB然后在X MB上使用write()?
如果缓冲有好处,那么ext4的好处是什么。此问题适用于已在ext4中分析多块分配器行为的人。
我的理解是文件系统将缓冲多个pagesize并尝试在磁盘上刷新它们。如果提供给write()的缓冲区大于文件系统缓冲区会发生什么?这是强制文件系统刷新到磁盘()
答案 0 :(得分:0)
“正确”答案取决于您真正想要对数据做什么。
write(2)被设计为内核空间的单行程,并提供对I / O的良好控制。但是,除非使用O_SYNC打开文件,否则数据仅进入内核缓存,而不是磁盘。 O_SYNC更改它以确保文件同步到磁盘。实际写入磁盘是由内核缓存发出的,而ext4将尝试分配大缓冲区来写入以最小化碎片,iirc。通常,使用缓冲或O_SYNC文件的 write(2)是控制数据是否进入内核或是否仍在应用程序缓存中的好方法。
但是,对于编写大量记录,您可能对 writev(2)感兴趣,后者从缓冲区列表中写入数据。与 write(2)类似,它是一个原子调用(当然,这只是在OS语义中,实际上不在磁盘上,除非再次使用直接I / O)。