¿Qué son los Page Faults y como obtener estadísticas de ellos en Linux?

Para aquellos que no estén relacionado con el término page faults, no es más que una técnica utilizada por los sistemas Linux/Unix para marcar una falla al momento en que una dirección de memoria virtual hace referencia a un espacio o una página de memoria física y éste ultimo no se encuentra disponible. Los page faults son en gran medida parte de los causante de las pantallas azules en Windows.

Existen dos tipos de page faults, las fallas mayores que ocurren cuando se requiere el acceso en disco y la data no existe, por ejemplo si intentamos correr un proceso para abrir el Firefox y el kernel lo busca en el caché de la memoria física y simplemente no lo encuentra. Las fallas menores ocurren cuando el proceso no es encontrado en el sitio indicado, más existe en otra dirección.

Este tipo de fallas no son consideradas como errores graves en entornos Unix/Linux, de hecho son pasadas practicamente por alto ya que no estarían afectando de forma crítica el rendimiento de un sistema, más lo correcto sería impedir que sucedan. Para ello el primer paso que debemos tomar es ejecutar el siguiente comando para ver cuales procesos están generando page faults:

ps -eo min_flt,maj_flt,cmd,args,uid,gid | less

Esto nos mostrará una lista como la siguiente:

MINFL  MAJFL CMD                       COMMAND                       UID   GID
0        0   [scsi_eh_2]               [scsi_eh_2]                     0     0
0        0   [kjournald]               [kjournald]                     0     0
1557     0   udevd --daemon            udevd --daemon                  0     0
0        0   [kpsmoused]               [kpsmoused]                     0     0
0        0   [kjournald]               [kjournald]                     0     0
122      1   /sbin/portmap             /sbin/portmap                   1     1
233      0   /sbin/rpc.statd           /sbin/rpc.statd               102     0
685      18  /usr/sbin/rsyslogd -c4    /usr/sbin/rsyslogd -c4          0     0
367789   48  /usr/sbin/nmbd -D         /usr/sbin/nmbd -D               0     0
151      0   /usr/sbin/acpid           /usr/sbin/acpid                 0     0

En la mayoría de los casos este tipo de situaciones se resuelven agregando más memoria a los equipos, optimizando nuestros scripts o cambiando directivas de archivos de configuraciones de nuestros procesos, con la finalidad de que siempre exista la mayor cantidad de memoria física disponible.

Dado que ps es un comando para todas las distribuciones, debería funcionar para cualquier versión de Linux, aunque las pruebas las he hecho con Debian.