在 Linux 上,vmstat 指令和/或 /proc/vmstat 報告的頁面大小是多少?

在 Linux 上,vmstat 指令和/或 /proc/vmstat 報告的頁面大小是多少?

正如許多人在 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

在最近的測試中,我發現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)位元組計算的。鑑於這就是如果您將位元組計數右移九個您最終會得到的值。

無論如何,這似乎是內核 2.6.27 - 4.0.x 之間的類似設定。

相關內容