
正如許多人在 StackExchange 和其他地方所說的那樣,Linux 的典型核心/mmu 頁面大小為 4 KiB。我已經驗證我的作業系統/架構(RHEL 6.6、Intel Xeon E5-2690)就是這種情況。
現在,除其他事項外,該vmstat -s
命令還報告“頁面調入”和“頁面調出”,這些計數器在啟動時從 0 開始。我已經確認,在任何給定時刻,這些值完全等於在pgpgin
和pgpgout
條目中找到的值/proc/vmstat
(vmstat 指令是否從中取得它們/proc/vmstat
?)。其他指令,特別是sar -B
報告特定時間間隔內每秒千位元組的調入/調出。pgpgin/s
pgpgout/s
在最近的測試中,我發現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)位元組計算的。鑑於這就是如果您將位元組計數右移九個您最終會得到的值。
無論如何,這似乎是內核 2.6.27 - 4.0.x 之間的類似設定。