Linux 上的后台刷新发生在待处理的写入数据过多(可通过 /proc/sys/vm/dirty_background_ratio 调整)或挂起写入超时(/proc/sys/vm/dirty_expire_centisecs)时。除非达到另一个限制 (/proc/sys/vm/dirty_ratio),否则可能会缓存更多写入的数据。进一步的写入将阻塞。
理论上,这应该创建一个后台进程写出脏页,而不会干扰其他进程。实际上,它确实会干扰任何进行非缓存读取或同步写入的进程。很糟糕。这是因为后台刷新实际上以 100% 的设备速度写入,此时任何其他设备请求都会被延迟(因为路上的所有队列和写入缓存都已填满)。
有没有办法限制刷新过程每秒执行的请求数量,或者以其他方式有效地优先考虑其他设备 I/O?
在使用 sysbench 进行大量基准测试后,我得出了以下结论:
为了生存(在性能方面)一种情况
只需转储所有电梯、队列和脏页缓存。脏页的正确位置是在该硬件写入缓存的 RAM 中。
尽可能低地调整dirty_ratio(或新的dirty_bytes),但要注意顺序吞吐量。在我的特定情况下,15 MB 是最佳的 (
echo 15000000 > dirty_bytes
)。这更像是一种破解而不是解决方案,因为千兆字节的 RAM 现在仅用于读取缓存而不是脏缓存。为了让脏缓存在这种情况下正常工作,Linux 内核后台刷新器需要对底层设备接受请求的速度进行平均,并相应地调整后台刷新。不容易。
用于比较的规格和基准:
在将零写入磁盘时进行测试
dd
,sysbench 显示出巨大的成功,将 10 个线程 fsync 写入 16 kB 从 33 提高到 700 IOPS(空闲限制:1500 IOPS)和单线程从 8 到 400 IOPS。在没有负载的情况下,IOPS 不受影响(~1500)并且吞吐量略有下降(从 251 MB/s 到 216 MB/s)。
dd
称呼:对于 sysbench,test_file.0 准备好不稀疏:
sysbench 调用 10 个线程:
sysbench 调用一个线程:
较小的块大小显示出更大的数字。
--file-block-size=4096 1 GB 脏字节:
--file-block-size=4096 15 MB 脏字节:
--file-block-size=4096 在空闲系统上具有 15 MB 的脏字节:
sysbench 0.4.12:多线程系统评估基准
测试系统:
总而言之,我现在确信这种配置在空闲、高负载甚至全负载情况下对于数据库流量会表现良好,否则这些流量会被顺序流量饿死。顺序吞吐量高于两个千兆链路无论如何都可以提供的吞吐量,因此减少一点也没问题。
尽管调整内核参数可以解决问题,但实际上您的性能问题可能是 Adaptec 5405Z 控制器上的错误导致的,该错误已在 2012 年 2 月 1 日的固件更新中修复。发行说明说“修复了固件在高 I/O 压力期间可能挂起的问题。” 也许像您那样分散 I/O 足以防止触发此错误,但这只是一个猜测。
以下是发行说明:http: //download.adaptec.com/pdfs/readme/relnotes_arc_fw-b18937_asm-18837.pdf
即使您的特定情况并非如此,我认为这可能会使将来遇到此帖子的用户受益。我们在 dmesg 输出中看到了一些类似以下的消息,最终导致我们进行固件更新:
以下是具有高 I/O 挂起修复的固件的发行说明中列出的 Adaptec RAID 控制器的型号:2045、2405、2405Q、2805、5085、5405、5405Z、5445、5445Z、5805、 5805Q、5805Z、5805ZQ、51245、51645、52445。
包含“WBT”的内核:
WBT 不需要切换到新的 blk-mq 块层。也就是说,它不适用于 CFQ 或 BFQ I/O 调度程序。您可以将 WBT 与截止日期 / mq-deadline / noop / none 调度程序一起使用。我相信它也适用于新的“kyber”I/O 调度程序。
除了缩放队列大小以控制延迟外,WBT 代码还将后台写回请求的数量限制为计算的队列限制的比例。
运行时配置位于
/sys/class/block/*/queue/wbt_lat_usec
.要查找的构建配置选项是
WBT 的作者 100% 确认了您的问题陈述 - 干得好 :-)。
/proc/meminfo 中 Dirty 的平均值是多少?这通常不应超过您的 /proc/sys/vm/dirty_ratio。在专用文件服务器上,我将dirty_ratio 设置为非常高的内存百分比(90),因为我永远不会超过它。你的dirty_ration太低了,当你击中它时,一切都崩溃了,提高它。