要问的第一个问题是,您遇到的问题到底是什么?内核将定期刷新脏(未写入的缓存)缓冲区 - 这是因为这样做往往比同步刷新更快(对应用程序的延迟影响更小)。不利的一面是,如果您达到内核对脏数据的限制,这意味着更大的延迟会受到影响(并且在不干净的关闭后可能会丢失更多的数据)。
如果要确保数据尽快到达磁盘,则只需使用该O_SYNC
选项打开文件。这将立即将数据刷新到磁盘write()
。当然,这意味着显着的性能损失,但另一方面,您可以完全控制何时刷新数据。
如果在同步进行时吞吐量下降,很可能是您尝试写入的速度超过了磁盘的支持速度,并达到了脏页内存限制。不幸的是,这意味着硬件根本达不到你试图推动它的写入速率——你需要写得更慢,或者在更快的媒体上缓冲数据(或者添加更多的 RAM!)。
另请注意,您的“智能 fsync”正是内核实现的 - 当以下情况之一为真时,它将刷新页面: * 内存中有太多脏数据。/proc/sys/vm/dirty_background_bytes
当脏数据总量超过,或者总内存的百分比超过 时, 异步触发(不阻塞写入)/proc/sys/vm/dirty_background_ratio
。当数据总量超过或总内存的百分比 超过 时同步触发(write()
长时间阻塞您的应用程序) 。* 脏数据在内存中的等待时间过长。守护进程每厘秒(1/100 秒)检查旧的脏块 ,如果块在内存中的时间超过 ./proc/sys/vm/dirty_bytes
/proc/sys/vm/dirty_ratio
pdflush
/proc/sys/vm/dirty_writeback_centisecs
/proc/sys/vm/dirty_expire_centisecs
调整这些参数可能会有所帮助,但您最好弄清楚为什么默认值不能保持原样。