嗨,内核 I/O 专家,
pgpgin
我有一个关于和pgpgout
计数器的问题/proc/vmstat
,特别是pgpgin
。我一直在探索性能监控工具,例如vmstat
和,它们是用于观察 I/O 性能的非常实用的命令行工具。在检查它们的代码时,我注意到这些工具使用和iotop
计数器报告“当前 I/O”,而不是像 和 等工具那样直接从块设备读取当前 I/O 统计信息。pgpgin
pgpgout
fio
第一个问题:我想了解和计数器与实际 I/O 带宽之间的确切关系pgpgin
pgpgout
。为什么这些工具依赖与分页相关的计数器来表示 I/O 活动? pgpgin 和 pgpgout 究竟是如何更新的,哪些系统组件负责这些更新?简而言之,您能解释一下这些计数器何时以及为何反映磁盘 I/O 操作吗?
第二个问题(边缘情况):是否存在pgpgin
带宽与实际磁盘带宽不准确对应的特定场景或边缘情况?
fio
在使用轮询对 SSD 读取性能进行基准测试时io_uring
,我发现 (和 SSD 统计数据)报告的 I/O 带宽fio
明显低于 指示的带宽pgpgin
。这种差异促使我调查如何pgpgin
反映 I/O 活动(因此是上面的第一个问题)。
我已经确认这种不匹配是一致的,而不是由于瞬态系统噪声造成的。
任何有关这些计数器、其更新机制以及它们与实际 I/O 性能的关系的见解都将不胜感激。谢谢!
尽管名称
pgpgin
和pgpgout
与页面没有直接关系,但它们分别计算提交给块层进行读取和写入的扇区。它们仅在 中更新submit_bio
,定义在 中block/blk-core.c
:因此,使用这些计数器的工具会测量提交给块层的实际 I/O。这并不一定与提交给物理设备的 I/O 相匹配:值得注意的是,块层维护着可以合并操作的队列。
但这可能无法解释您所看到的所有差异......