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 ...