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

7

Wie viele auf StackExchange und anderswo angegeben haben, beträgt eine typische Kernel / mmu-Seitengröße für Linux 4 KiB. Ich habe überprüft, ob dies bei meinem Betriebssystem / meiner Architektur (RHEL 6.6, Intel Xeon E5-2690) der Fall ist.

Der vmstat -sBefehl meldet nun unter anderem "Seiten ausgelagert" und "Seiten ausgelagert", die Zähler sind, die beim Booten bei 0 beginnen. Ich habe bestätigt, dass diese Werte zu jedem Zeitpunkt genau den Werten entsprechen, die für die Einträge pgpginund pgpgoutEinträge in gefunden wurden /proc/vmstat(erhält der Befehl vmstat sie von /proc/vmstat?). Andere Befehle, insbesondere sar -BBericht pgpgin/sund pgpgout/sals Kibibytes, werden während eines bestimmten Intervalls pro Sekunde ein- und ausgeblendet.

In jüngsten Tests habe ich gesehen, dass pgpgin/sund pgpgout/sWerte von sar auch 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 KB meldet. Somit sind die pgpgin/outWerte von /proc/vmstatdie Anzahl der KiB, die seit dem Booten ein- und ausgeblendet wurden.

Meine Fragen sind:

  1. Ist dies eine gültige Schlussfolgerung, und
  2. Wenn ja, warum melden vmstat und andere Einrichtungen auf 1-KiB-Seiten anstelle der 4-KiB-Seiten, die die "gemeinsame Währung" des Betriebssystems und der Architektur sind? Insbesondere sagt vmstat " pages paged in/out", nicht " KiBs paged in/out". Das ist verwirrend.
Marc C.
quelle
Randnotiz: 4 KiB ist eine lächerlich kleine Seitengröße, daher erwarte ich, dass sie immer weniger "verbreitet" wird.
Kubanczyk

Antworten:

4

In Bezug auf die Zähler in /proc/vmstatder Funktion, die diese Werte zu aktualisieren scheint, ist 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_sectors ist ein Makro in Linux/include/linux/bio.h

 64 #define bio_sectors(bio)        ((bio)->bi_iter.bi_size >> 9)

Dies scheint mir nahezulegen, dass die Zahlen in Sektorgrößen (512) Bytes gezählt werden. Angesichts dessen, welchen Wert Sie am Ende erhalten würden, wenn Sie die Anzahl der Bytes um neun nach rechts verschieben würden.

Dies scheint sowieso ein ähnliches Setup zwischen den Kerneln 2.6.27 - 4.0.x zu sein.

Matthew Ife
quelle