
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 -s
comando 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 pgpgin
y enpgpgout
/proc/vmstat
(¿El comando vmstat los obtiene de /proc/vmstat
?). Otros comandos, y en particular sar -B
informes pgpgin/s
y pgpgout/s
como Kibibytes de entrada/salida por segundo durante un intervalo particular.
En pruebas recientes, he visto que pgpgin/s
los pgpgout/s
valores 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/out
valores de/proc/vmstat
son el número de KiB paginados dentro/fuera desde el inicio.
Mis preguntas son:
- ¿Es ésta una conclusión válida y
- 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/vmstat
la función que aparece para actualizar estos valores está submit_bio
en 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
es 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.