Linux では、vmstat コマンドや /proc/vmstat によって報告されるページのサイズはどれくらいですか?

Linux では、vmstat コマンドや /proc/vmstat によって報告されるページのサイズはどれくらいですか?

StackExchange や他の場所で多くの人が述べているように、Linux の一般的なカーネル/MMU ページ サイズは 4 KiB です。これは私の OS/アーキテクチャ (RHEL 6.6、Intel Xeon E5-2690) でも当てはまることを確認しました。

このコマンドは、起動時に0から始まるカウンタである「ページインされたページ」と「ページアウトされたページ」を報告します。私は、これらの値が、どの時点でも、およびエントリvmstat -sの値と正確に等しいことを確認しました。pgpginpgpgout/proc/vmstat(vmstat コマンドはそれらを取得しますか/proc/vmstat?)。他のコマンド、特に特定の間隔中に 1 秒あたりにページイン/アウトされた Kibibytes としてレポートsar -Bします。pgpgin/spgpgout/s

pgpgin/s最近のテストでは、sarの値が、指定された間隔のvmstat値から計算されたレートと正確に一致することがわかりました。これにより、vmstatは1 KiBのサイズのページの値pgpgout/sを報告していると結論付けられます。したがって、pgpgin/out/proc/vmstat起動後にページイン/ページアウトされた KiB の数です。

私の質問は次のとおりです:

  1. これは妥当な結論でしょうか?
  2. もしそうなら、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 間で同様の設定になっているようです。

関連情報