我们可以通过 iostat -x -d 查看一些参数,rrqm/s 和 wrqm/s 代表每秒 I/O 请求的合并量。还有一个内核参数控制 I/O 的合并量:
/sys/class/block/设备名称/queue/nomerges
根据内核文档:
这使用户能够禁用块层中与 IO 合并请求相关的查找逻辑。默认情况下 (0) 启用所有合并。设置为 1 时,只会尝试简单的一次合并。设置为 2 时,不会尝试任何合并算法(包括一次或更复杂的树/哈希查找)。
0 和 2 的含义很容易理解,但说到“one-hit”的 1,我在 google 上搜索了一下,却没有找到具体的语义定义。所以请帮忙解释一下 nomerges 中 1 到底是什么意思。谢谢。
答案1
0 不仅对相邻请求进行简单检查,还会在数据结构中进行查找,1 只进行简单检查,2 不进行合并。请查看 block/elevator.c 中的 elv_merge() 实现。
您需要测试您的重度随机 I/O 工作负载,以确定禁用合并是否会使其受益。选项 2 的合并显示,与选项 1 相比,选项 2 的每 CPU 时间吞吐量提高了百分之几:块:为块 I/O 添加了更严格的无合并语义
即使选项 0 也很便宜,而且许多请求都是相邻的。您可能不需要更改这一点。