Cómo verificar fallas de página en Linux
La memoria virtual es el concepto cuando nos damos cuenta de que la memoria utiliza más que la memoria física. El gran problema con la memoria virtual es el error de página.
La unidad de transferencia básica es un bloque de datos de longitud fija llamado página. Cuando un proceso no obtiene una página en la memoria principal, el hardware genera una excepción (llamada falla de página) al software. Ocurre cuando una página se ha asignado a un espacio de direcciones pero no se ha cargado en la memoria física. Si la página solicitada no reside en la memoria principal o en la memoria caché de la CPU, la página debe intercambiarse desde un almacenamiento externo. Se llama error de página mayor. Si la página solicitada reside en la memoria principal, pero el proceso no puede acceder a ella debido a una memoria no inicializada o una página COW (copia en escritura), se denomina error de página menor. Aquí no se requiere E / S desde el disco duro, por lo que se requiere menos tiempo.
La falla de página mayor y menor se puede encontrar con los siguientes comandos en Linux.
Usando el comando ps
Comando ps de Linux con -o
opción que podemos usar para imprimir fallas de página.
Aquí, estamos interesados en las fallas de página. La opción ‘min_flt’ reporta fallas menores y ‘maj_flt’ reporta fallas mayores.
# ps -o pid,min_flt,maj_flt,cmd PID MINFL MAJFL CMD 2636 2357 0 -bash 2827 146187 0 /bin/bash /usr/sbin/makewhatis 11723 133 0 [makewhatis] 11724 116 0 [gawk] 11725 254 0 ps -o pid,min_flt,maj_flt,cmd
De forma predeterminada, el comando ps muestra los procesos asociados con el terminal actual únicamente. Para mostrar todos los procesos, -A
se utiliza la opción.
# ps -A -o pid,min_flt,maj_flt,cmd PID MINFL MAJFL CMD 1 2927 48 init [3] 2 0 0 [migration/0] 3 0 0 [ksoftirqd/0] 4 0 0 [watchdog/0] 5 0 0 [events/0] 6 0 0 [khelper] ---output truncated---
Usando el comando de tiempo
El comando de tiempo de GNU ejecuta un comando e informa el uso de recursos del sistema por ese comando. También puede informar sobre los errores de página mayores y menores.
El comando de tiempo de GNU debe ejecutarse como ‘/ usr / bin / time’ y no solo como «tiempo», porque ‘tiempo’ ejecutará el comando de tiempo incorporado de BASH que informa el tiempo de ejecución de un comando.
$ /usr/bin/time ls /etc/passwd /etc/passwd 0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3232maxresident)k 0inputs+0outputs (0major+260minor)pagefaults 0swaps
los -f
La opción se puede utilizar para formatear la salida.
$ /usr/bin/time -f "(%Fmajor %Rminor)pagefaults" ls /etc/passwd /etc/passwd (0major 260minor)pagefaults
%F – fallas de página principales («Número de fallas de página importantes o que requieren E / S que ocurrieron mientras el proceso se estaba ejecutando. Estas son fallas en las que la página se ha migrado de la memoria primaria».
% R – fallas de página menores («Número de fallas de página menores o recuperables. Estas son páginas que no son válidas (por lo que fallan) pero que aún no han sido reclamadas por otras páginas virtuales. Por lo tanto, los datos de la página siguen siendo válidos pero las tablas del sistema deben actualizarse «. – de la página del manual del comando de tiempo)
La salida detallada también es útil con -v
opción:
$ /usr/bin/time -v ls /etc/passwd /etc/passwd Command being timed: "ls /etc/passwd" User time (seconds): 0.00 System time (seconds): 0.00 Percent of CPU this job got: 0% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 3216 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 261 Voluntary context switches: 1 Involuntary context switches: 3 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
$ /usr/bin/time -v cp -r jvm/ Documents/ Command being timed: "cp -r jvm/ Documents/" User time (seconds): 0.00 System time (seconds): 0.00 Percent of CPU this job got: 0% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.37 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 3312 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 267 Voluntary context switches: 4 Involuntary context switches: 2 Swaps: 0 File system inputs: 24 File system outputs: 16 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
Usando el comando superior
El comando superior es un comando interactivo que proporciona una vista en tiempo real del sistema.
Pegar f
para seleccionar campos manualmente, es decir, para agregar o eliminar campos de la lista anterior.
Prensado f
muestra la siguiente pantalla:
Current Fields: AEHIOQTWKNMbcdfgjplrsuvyzX for window 1:Def Toggle fields via field letter, type any other key to return * A: PID = Process Id 0x00000040 PF_FORKNOEXEC * E: USER = User Name 0x00000100 PF_SUPERPRIV * H: PR = Priority 0x00000200 PF_DUMPCORE * I: NI = Nice value 0x00000400 PF_SIGNALED * O: VIRT = Virtual Image (kb) 0x00000800 PF_MEMALLOC * Q: RES = Resident size (kb) 0x00002000 PF_FREE_PAGES (2.5) * T: SHR = Shared Mem size (kb) 0x00008000 debug flag (2.5) * W: S = Process Status 0x00024000 special threads (2.5) * K: %CPU = CPU usage 0x001D0000 special states (2.5) * N: %MEM = Memory usage (RES) 0x00100000 PF_USEDFPU (thru 2.4) * M: TIME+ = CPU Time, hundredths b: PPID = Parent Process Pid c: RUSER = Real user name d: UID = User Id f: GROUP = Group Name g: TTY = Controlling Tty j: P = Last used cpu (SMP) p: SWAP = Swapped size (kb) l: TIME = CPU Time r: CODE = Code size (kb) s: DATA = Data+Stack size (kb) u: nFLT = Page Fault count v: nDRT = Dirty Pages count y: WCHAN = Sleeping in Function
Ahora, el campo (columna) para errores de página es nFLT
, que se puede alternar con la tecla ‘u’ como se especifica en la salida anterior. los nDRT
indica el recuento de páginas sucias, es decir, el número de páginas que se han modificado desde la última vez que se escribieron en el disco. Se puede alternar con
v clave.
Después de alternar estos dos campos, la parte superior se muestra de la siguiente manera:
top - 13:42:32 up 3:36, 2 users, load average: 0.00, 0.02, 0.05 Tasks: 148 total, 2 running, 145 sleeping, 0 stopped, 1 zombie Cpu(s): 2.0%us, 1.7%sy, 0.0%ni, 96.2%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st Mem: 3058016k total, 978396k used, 2079620k free, 73936k buffers Swap: 4095996k total, 0k used, 4095996k free, 499432k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ nFLT nDRT COMMAND 1069 root 20 0 88628 24m 11m S 3 0.8 1:15.12 54 0 Xorg 3093 raghu 20 0 94044 14m 10m S 2 0.5 0:02.34 1 0 gnome-terminal 1903 raghu 20 0 126m 37m 18m S 1 1.3 1:26.27 17 0 plugin-containe 3177 raghu 20 0 2660 1132 836 R 1 0.0 0:00.09 0 0 top 1573 raghu 20 0 74740 16m 9m S 0 0.6 0:20.45 35 0 compiz 1843 raghu 20 0 465m 155m 31m S 0 5.2 1:00.59 43 0 firefox 1847 raghu 20 0 77084 30m 10m S 0 1.0 0:11.58 16 0 ubuntuone-syncd 2331 root 20 0 0 0 0 R 0 0.0 0:02.13 0 0 kworker/0:0 1 root 20 0 3044 1848 1284 S 0 0.1 0:00.86 23 0 init 2 root 20 0 0 0 0 S 0 0.0 0:00.00 0 0 kthreadd 3 root 20 0 0 0 0 S 0 0.0 0:03.11 0 0 ksoftirqd/0
Archivo / proc / vmstat
El valor pgfault en ‘/ proc / vmstat’ informa las estadísticas de la memoria virtual. El valor de error de página se puede extraer usando el comando grep.
$ grep pgfault /proc/vmstat pgfault 5229281
Archivo / proc / PID / stat
La información del proceso se puede buscar en el directorio / proc. Este directorio contiene un directorio para cada proceso con el nombre de PID de ese proceso. Bajo ese directorio, el archivo de estadísticas contiene estadísticas del proceso.
Los siguientes campos son de interés:
Field 1 - Field 2 - filename of the executable Field 10 - number of minor page faults Field 12 - number of major page faults
Estos campos se pueden extraer usando el comando de corte:
$ cut -d " " -f 1,2,10,12 /proc/1/stat 1 (init) 6798 22 $ cut -d " " -f 1,2,10,12 /proc/1874/stat 1874 (firefox) 840829 67 $ cut -d " " -f 1,2,10,12 /proc/4691/stat 4691 (bash) 2146 0
Conclusión
En este tutorial, aprendimos las formas de encontrar fallas de página usando comandos básicos de Linux. Déjame saber tus sugerencias en el cuadro de comentarios a continuación.