正如许多人在 StackExchange 和其他地方所述,Linux 的典型内核/mmu 页面大小为 4 KiB。我已验证我的操作系统/架构(RHEL 6.6、Intel Xeon E5-2690)确实如此。
现在,除其他事项外,该命令还报告“调入页面”和“调出页面”,它们是启动时从 0 开始的计数器。我已确认,在任何给定时刻,这些值都与和中的条目vmstat -s
的值完全相同pgpgin
pgpgout
/proc/vmstat
(vmstat 命令从哪里获取它们/proc/vmstat
?)。其他命令,特别是sar -B
报告pgpgin/s
和pgpgout/s
特定间隔期间每秒分页输入/输出的 Kibibytes 数。
在最近的测试中,我发现sar 中的pgpgin/s
和pgpgout/s
值也与根据 vmstat 值计算出的指定时间间隔内的速率完全对应。这使我得出结论,vmstat 报告的是 1 KiB 大小的页面的值。pgpgin/out
因此/proc/vmstat
是自启动以来分页输入/输出的 KiB 数量。
我的问题是:
- 这是一个有效的结论吗?
- 如果是这样,为什么 vmstat 和其他工具会以 1 KiB 页而不是作为操作系统和架构的“通用货币”的 4 KiB 页进行报告?特别是,vmstat 说的是“
pages paged in/out
”,而不是“KiBs paged in/out
”。这令人困惑。
答案1
关于/proc/vmstat
函数中的计数器,似乎更新这些值是submit_bio
在Linux/block/blk-core.c
。
2067 blk_qc_t submit_bio(struct bio *bio)
2068 {
...
2079 count = bio_sectors(bio);
2080
2081 if (op_is_write(bio_op(bio))) {
2082 count_vm_events(PGPGOUT, count);
2083 } else {
2084 task_io_account_read(bio->bi_iter.bi_size);
2085 count_vm_events(PGPGIN, count);
2086 }
...
2100 }
2101 EXPORT_SYMBOL(submit_bio);
bio_sectors
是一个宏Linux/include/linux/bio.h
64 #define bio_sectors(bio) ((bio)->bi_iter.bi_size >> 9)
在我看来,这似乎表明这些数字是以扇区大小 (512) 字节来计算的。假设您将字节数右移 9,最终会得到该值。
无论如何,这似乎是内核 2.6.27 - 4.0.x 之间的类似设置。