正如许多人在StackExchange和其他地方所述,Linux的典型内核/ mmu页面大小为4 KiB.我已经验证我的操作系统/架构(RHEL 6.6,Intel Xeon E5-2690)就是这种情况.
现在除其他外,vmstat -s命令报告“paged in”和“pages page out out”,它们是在启动时从0开始的计数器.我已经确认,在任何给定时刻,这些值都与/ proc / vmstat中的pgpgin和pgpgout条目的值完全相同(vmstat命令是从/ proc / vmstat获取它们吗?).其他命令,特别是sar -B报告pgpgin / s和pgpgout / s作为在特定时间间隔内每秒分页输入/输出的Kibibytes.
在最近的测试中,我已经看到来自sar的pgpgin / s和pgpgout / s值也完全对应于从指定间隔的vmstat值计算的速率.这使我得出结论,vmstat报告的页面大小为1 KiB.因此,/ proc / vmstat的pgpgin / out值是自引导以来分页入/出的KiB数.
我的问题是:
>这是一个有效的结论吗?
>如果是这样,为什么vmstat和其他工具在1 KiB页面中报告而不是作为操作系统和体系结构的“通用货币”的4 KiB页面?特别是,vmstat说“页面输入/输出”,而不是“KiBs页面输入/输出”.这令人困惑.
解决方法
关于/ proc / vmstat中的计数器,似乎更新这些值的函数是Linux / block / blk-core.c中的submit_bio.
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之间的类似设置.