Wie groß sind unter Linux die Seiten, die vom Befehl vmstat und/oder /proc/vmstat gemeldet werden?

Wie groß sind unter Linux die Seiten, die vom Befehl vmstat und/oder /proc/vmstat gemeldet werden?

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 pgpginund in gefunden wurden.pgpgout/proc/vmstat(holt der Befehl vmstat sie von ?). Andere Befehle und /proc/vmstatinsbesondere sar -BBerichte geben die Anzahl der pro Sekunde während eines bestimmten Intervalls ein-/ausgelagerten Kibibyte an.pgpgin/spgpgout/s

Bei aktuellen Tests habe ich festgestellt, dass pgpgin/sdie pgpgout/sWerte 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/outWerte von/proc/vmstatist die Anzahl der seit dem Booten ein-/ausgelagerten KiB.

Meine Fragen sind:

  1. Ist das eine gültige Schlussfolgerung und
  2. 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/vmstatder Funktion, die diese Werte zu aktualisieren scheint, befindet sie sich submit_bioin 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_sectorsist 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.

verwandte Informationen