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

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

正如许多人在 StackExchange 和其他地方所述,Linux 的典型内核/mmu 页面大小为 4 KiB。我已验证我的操作系统/架构(RHEL 6.6、Intel Xeon E5-2690)确实如此。

现在,除其他事项外,该命令还报告“调入页面”和“调出页面”,它们是启动时从 0 开始的计数器。我已确认,在任何给定时刻,这些值都与和中的条目vmstat -s的值完全相同pgpginpgpgout/proc/vmstat(vmstat 命令从哪里获取它们/proc/vmstat?)。其他命令,特别是sar -B报告pgpgin/spgpgout/s特定间隔期间每秒分页输入/输出的 Kibibytes 数。

在最近的测试中,我发现sar 中的pgpgin/spgpgout/s值也与根据 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”。这令人困惑。

答案1

关于/proc/vmstat函数中的计数器,似乎更新这些值是submit_bioLinux/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 之间的类似设置。

相关内容