
StackExchange や他の場所で多くの人が述べているように、Linux の一般的なカーネル/MMU ページ サイズは 4 KiB です。これは私の OS/アーキテクチャ (RHEL 6.6、Intel Xeon E5-2690) でも当てはまることを確認しました。
このコマンドは、起動時に0から始まるカウンタである「ページインされたページ」と「ページアウトされたページ」を報告します。私は、これらの値が、どの時点でも、およびエントリvmstat -s
の値と正確に等しいことを確認しました。pgpgin
pgpgout
/proc/vmstat
(vmstat コマンドはそれらを取得しますか/proc/vmstat
?)。他のコマンド、特に特定の間隔中に 1 秒あたりにページイン/アウトされた Kibibytes としてレポートsar -B
します。pgpgin/s
pgpgout/s
pgpgin/s
最近のテストでは、sarの値が、指定された間隔のvmstat値から計算されたレートと正確に一致することがわかりました。これにより、vmstatは1 KiBのサイズのページの値pgpgout/s
を報告していると結論付けられます。したがって、pgpgin/out
/proc/vmstat
起動後にページイン/ページアウトされた KiB の数です。
私の質問は次のとおりです:
- これは妥当な結論でしょうか?
- もしそうなら、vmstat やその他の機能は、OS とアーキテクチャの「共通通貨」である 4 KiB ページではなく、1 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) バイト単位でカウントされることを示唆しているように思われます。バイト数を 9 右シフトすると、最終的に得られる値がこれになります。
いずれにせよ、これはカーネル 2.6.27 - 4.0.x 間で同様の設定になっているようです。