En Linux, ¿cuál es el tamaño de las páginas reportadas por el comando vmstat y/o /proc/vmstat?

En Linux, ¿cuál es el tamaño de las páginas reportadas por el comando vmstat y/o /proc/vmstat?

Como muchos han declarado en StackExchange y en otros lugares, el tamaño típico de una página kernel/mmu para Linux es de 4 KiB. He verificado que este es el caso en mi sistema operativo/arquitectura (RHEL 6.6, Intel Xeon E5-2690).

Ahora, entre otras cosas, el vmstat -scomando informa sobre "páginas paginadas" y "páginas paginadas", que son contadores que comienzan desde 0 en el momento del arranque. He confirmado que, en un momento dado, estos valores son exactamente iguales a los valores encontrados para las entradas pgpginy enpgpgout/proc/vmstat(¿El comando vmstat los obtiene de /proc/vmstat?). Otros comandos, y en particular sar -Binformes pgpgin/sy pgpgout/scomo Kibibytes de entrada/salida por segundo durante un intervalo particular.

En pruebas recientes, he visto que pgpgin/slos pgpgout/svalores de sar también corresponden exactamente a una tasa calculada a partir de los valores de vmstat para un intervalo específico. Esto me lleva a concluir que vmstat informa valores para páginas de 1 KiB de tamaño. Así, los pgpgin/outvalores de/proc/vmstatson el número de KiB paginados dentro/fuera desde el inicio.

Mis preguntas son:

  1. ¿Es ésta una conclusión válida y
  2. Si es así, ¿por qué vmstat y otras instalaciones informan en páginas de 1 KiB en lugar de las páginas de 4 KiB que son la "moneda común" del sistema operativo y la arquitectura? En particular, vmstat dice " pages paged in/out", no " KiBs paged in/out". Esto es confuso.

Respuesta1

En lo que respecta a los contadores, /proc/vmstatla función que aparece para actualizar estos valores está submit_bioen 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_sectorses una macro enLinux/include/linux/bio.h

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

Esto parece sugerirme que los números se cuentan en tamaños de sector (512) bytes. Dado que ese es el valor que terminarías obteniendo si desplazaras a la derecha un recuento de bytes en nueve.

De todos modos, esta parece ser una configuración similar entre los kernels 2.6.27 - 4.0.x.

información relacionada