Qué es y qué impacto tiene el "Sys CPU Time" (GNU/Linux)
El núcleo del sistema funciona en un entorno totalmente diferente al resto de programas, quedando definidos dos modos de ejecución totalmente separados. El modo de ejecución kernel y el modo usuario, cada uno de ellos dispone de memoria y procedimientos diferentes, por lo que un programa de usuario no podrá ser capaz de dañar al núcleo.
Las syscalls o llamadas al sistema son el mecanismo por el cual los procesos de usuario acceden a los servicios del núcleo, para crear procesos hijos, asignación de memoria, accesos a disco duro, tarjeta de sonido, de red, etc. Estas llamadas hacen de interfaz para realizar desde el modo usuario las cosas que son propias del modo kernel.
El “Sys CPU Time” se refiere por tanto al tiempo que la CPU pasó corriendo en modo kernel, es decir, el tiempo que el sistema estuvo realizando llamadas al sistema. Un “Sys CPU Time” elevado suele indicar que algo no está funcionando correctamente, hardware deteriorado, aplicaciones mal programadas (bugs), problemas en el núcleo o bien que el equipo se encuentra bajo mucha carga de entrada / salida.
Salida del comando top que indica un inusual uso de sys cpu.
Cpu(s): 3.3%us, 32.5%sy, 0.0%ni, 63.1%id, 0.3%wa, 0.0%hi, 0.8%si, 0.0%st
Para detectar qué proceso está provocando el mayor uso de CPU se puede usar top o bien ps
ps aux | sort -n -k 3 ... root 517 0.5 1.7 579648 121648 tty7 Ssl+ 20:12 0:31 /usr/lib/xorg-server/Xorg -nolisten tcp vt07 -auth /var/run/slim.auth busi 666 3.4 10.0 1527292 711812 ? Sl 20:13 3:10 firefox busi 2757 81.5 1.5 1491216 111716 ? SLl 21:45 0:09 /usr/lib/virtualbox/VirtualBox --comment freebsd --startvm 16e651b7-a98d-4a8a-953b-ff56a9fc9a0e --no-startvm-errormsgbox
Posteriormente, cuando ya tenemos identificado el proceso, si se quiere ver qué tipo de llamadas al sistema no está consumiendo la CPU, usaremos la herramienta “strace”. Es una utilidad muy útil para determinar, entre otras cosas, si una llamada al sistema en particular se excede más de lo normal. La opción de recuento (-c) muestra información sobre el rendimiento de un proceso en base a las syscalls, mostrando para cada llamada al sistema de ese proceso, su tiempo dedicado y errores.
strace -c -p 1633 Process 1633 attached Process 1633 detached % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 50.00 0.000006 0 1151 write 50.00 0.000006 0 2848 143 futex 0.00 0.000000 0 673 76 read 0.00 0.000000 0 16 stat 0.00 0.000000 0 1019 poll 0.00 0.000000 0 62 mmap 0.00 0.000000 0 180 writev 0.00 0.000000 0 16 sched_yield 0.00 0.000000 0 1914 1694 recvmsg 0.00 0.000000 0 32 clone 0.00 0.000000 0 1 restart_syscall ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000012 7912 1913 total
Si se apreciara algo extraño, como una llamada al sistema que sea mucho más requerida que el resto y consuma mucho más tiempo de lo normal, es bueno documentarse sobre ella a ver qué finalidad tiene y por qué se está necesitando. Hay que tener en cuenta que las llamadas al sistema no suelen consumir prácticamente CPU al no ser que se dedique el sistema a hacer de router / firewall, clonación de discos, P2P, o cualquier programa que requiera de intercambio constante con componentes de hardware.
NOTA: “Leap second” (cada 4 años) puede provocar un aumento de del uso de llamadas al sistema en determinados casos, la solución vendría de la mano de comandos NTP o bien reiniciando el sistema.
Identificar hilos de un proceso e identificar sus llamadas al sistema.
ps auxw -T | grep -i 2510 | awk '{print $3}' # Otra manera. ls /proc/2510/task
strace -c -p pid_hilo1 -p pid_hilo2 -p ...