在 Linux 上,vmstat 命令和/或 /proc/vmstat 报告的页面大小是多少?

Mar*_*c C 7 linux vmstat paging

正如许多人在 StackExchange 和其他地方所说的那样,Linux 的典型内核/mmu 页面大小是 4 KiB。我已经确认我的操作系统/架构(RHEL 6.6,Intel Xeon E5-2690)就是这种情况。

现在,除其他外,该vmstat -s命令报告“页面调入”和“页面调出”,它们是在启动时从 0 开始的计数器。我已经确认,在任何给定的时刻,这些值都与在pgpginpgpgout条目中找到的值完全相等/proc/vmstat(vmstat 命令是否从/proc/vmstat?)。其他命令,特别是sar -B报告pgpgin/spgpgout/s作为特定时间间隔内每秒调入/调出的 Kibibytes。

在最近的测试中,我看到pgpgin/spgpgout/s来自 sar 的值也完全对应于从 vmstat 值计算出的特定时间间隔的速率。这使我得出结论,vmstat 报告大小为 1 KiB 的页面的值。因此, 的pgpgin/out/proc/vmstat是自启动以来调入/调出的 KiB 数。

我的问题是:

  1. 这是一个有效的结论吗,以及
  2. 如果是这样,为什么 vmstat 和其他工具以 1 KiB 页而不是作为操作系统和体系结构的“通用货币”的 4 KiB 页报告?特别是,vmstat 说的是“ pages paged in/out”,而不是“ KiBs paged in/out”。这令人困惑。

Mat*_*Ife 4

关于/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);
Run Code Online (Sandbox Code Playgroud)

bio_sectors是一个宏Linux/include/linux/bio.h

 64 #define bio_sectors(bio)        ((bio)->bi_iter.bi_size >> 9)
Run Code Online (Sandbox Code Playgroud)

这似乎表明这些数字是按扇区大小(512)字节计算的。鉴于这就是如果您将字节计数右移九个您最终会得到的值。

无论如何,这似乎是内核 2.6.27 - 4.0.x 之间的类似设置。