
Wie viele auf StackExchange und anderswo erklärt haben, beträgt eine typische Kernel-/MMU-Seitengröße für Linux 4 KiB. Ich habe überprüft, dass dies bei meinem Betriebssystem/meiner Architektur (RHEL 6.6, Intel Xeon E5-2690) der Fall ist.
Nun meldet der Befehl unter anderem vmstat -s
„eingelagerte Seiten“ und „ausgelagerte Seiten“, also Zähler, die beim Booten bei 0 beginnen. Ich habe bestätigt, dass diese Werte zu jedem beliebigen Zeitpunkt genau den Werten entsprechen, die für die Einträge pgpgin
und in gefunden wurden.pgpgout
/proc/vmstat
(holt der Befehl vmstat sie von ?). Andere Befehle und /proc/vmstat
insbesondere sar -B
Berichte geben die Anzahl der pro Sekunde während eines bestimmten Intervalls ein-/ausgelagerten Kibibyte an.pgpgin/s
pgpgout/s
Bei aktuellen Tests habe ich festgestellt, dass pgpgin/s
die pgpgout/s
Werte von sar ebenfalls genau einer Rate entsprechen, die aus vmstat-Werten für ein bestimmtes Intervall berechnet wurde. Dies lässt mich zu dem Schluss kommen, dass vmstat Werte für Seiten mit einer Größe von 1 KiB meldet. Somit entsprechen die pgpgin/out
Werte von/proc/vmstat
ist die Anzahl der seit dem Booten ein-/ausgelagerten KiB.
Meine Fragen sind:
- Ist das eine gültige Schlussfolgerung und
- Wenn ja, warum geben vmstat und andere Einrichtungen 1-KiB-Seiten aus und nicht die 4-KiB-Seiten, die die „allgemeine Währung“ des Betriebssystems und der Architektur sind? Insbesondere sagt vmstat „
pages paged in/out
“, nicht „KiBs paged in/out
“. Das ist verwirrend.
Antwort1
In Bezug auf die Zähler in /proc/vmstat
der Funktion, die diese Werte zu aktualisieren scheint, befindet sie sich submit_bio
in 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
ist ein Makro inLinux/include/linux/bio.h
64 #define bio_sectors(bio) ((bio)->bi_iter.bi_size >> 9)
Dies lässt für mich darauf schließen, dass die Zahlen in Sektorgrößen (512) Bytes gezählt werden. Dies ist der Wert, den Sie erhalten würden, wenn Sie eine Byteanzahl um neun nach rechts verschieben würden.
Dies scheint jedenfalls ein ähnliches Setup zwischen den Kerneln 2.6.27 – 4.0.x zu sein.