CentOS使用同步写入还是异步写入?有什么办法可以检查或改变这个吗?
答案1
默认情况下,所有写入都是异步的。
O_DIRECT|O_SYNC
open(2)
您可以将它们配置为在应用程序级别标志或文件系统一级(-o sync
mount 命令的选项)同步。
答案2
根据红帽(相当旧)的页面12.5。验证异步 I/O 使用情况,使用 libaio 支持异步 I/O。应用程序要么与该库链接,要么不与该库链接。没有提到启用或禁用:应用程序只是使用图书馆。该页面显示您可以通过检查来验证使用情况/proc/slabinfo
。
在我的 CentOS 6 机器中,有 2466 个文件/usr/bin
,只有 3 个与 libaio 链接:
- 重播
- qemu-img
- qemu-io
有一些程序使用此功能,但不多。有些人将其与缓冲区缓存混淆。
进一步阅读:
UNIX 和 Linux 系统中的 I/O 操作通常会经过文件系统缓存。尽管这本身并不代表问题,但这种额外的处理确实需要资源。绕过文件系统缓存可降低 CPU 要求,并释放文件系统缓存以用于其他非数据库文件操作。针对原始设备的操作会自动绕过文件系统缓存。
答案3
作为 /u/jiliagre提及,您可以通过每个设备的标志强制O_SYNC
打开文件或在挂载时-o sync
(您可以使用 重新挂载大多数打开的挂载点mount -o remount,sync <mtpt>
。或者,您可以告诉系统在每次执行写入时立即安排刷新(这“会弄脏”)页面”)。
当同步模式未启用时,复杂的写回算法就会发挥作用。写回算法的设计目的是限制IO操作。它假设用户更喜欢系统仅偶尔执行磁盘刷新:要么在截止日期之后,要么当存在要刷新的“脏”页阈值时。为了进行刷新,它只是向内核线程分配一些工作并“唤醒”内核线程pdflush
。
sysctl
您可以通过和操作一些系统变量/proc/
来控制写回的行为。您主要感兴趣的是:
vm.dirty_background_ratio = 0
这本质上迫使每个脏写被唤醒并被刷新;和/或
vm.dirty_writeback_centisecs = 1
这确保脏页每 1/100 秒刷新一次。您可能想将后者设置为 0,但这实际上会禁用计时器。您可能也想设置vm.dirty_ratio
为 0,但至少在 2.6.25 中,该值的上限较低为 5%,在这里对您没有帮助。
注意事项#1:写回算法采用速率限制行为。我不完全确定该算法,因为它很复杂,但是如果要将这么多页面刷新到磁盘,则会在设定的数量上调用 pdflush,然后在下一秒调度 pdflush。我认为,如果在发送到 pdflushed 的第一个块之后,另一个页面被弄脏,那么将立即在 1 秒计时器之前安排另一个块。
注意事项#2:它仍然不会完全同步,因为 pdflush 将其数据发送到块级 IO 调度程序,该调度程序将写入操作推送到“队列”中。但我不确定这与同步模式有什么不同。
PS:别忘了点个赞哦这个美丽的答案。