De repente el servidor empieza a responder despacio, el sitio web carga una vez sí y otra no, y las gráficas del área de cliente muestran el procesador al máximo. Para entender qué pasa, hay que ver qué programas se están ejecutando ahora mismo y cuántos recursos consumen. En este artículo vemos qué significa la carga del servidor y cómo leer el load average, aprendemos a usar los comandos top, htop y ps, encontramos el proceso que carga el sistema y lo terminamos. Para que se vea mejor, cargamos un servidor de pruebas de 4 núcleos con dos procesos, cada uno de los cuales ocupaba un núcleo entero, y todas las capturas de pantalla se hicieron en ese momento.
Qué es un proceso y cómo leer la carga
Cada programa en marcha en Linux funciona como un proceso. Un proceso tiene un número PID, un usuario con el que se ejecuta y un estado. La mayor parte del tiempo casi todos los procesos del servidor están dormidos. El servidor web espera nuevas conexiones, la base de datos espera consultas, y en ese momento no necesitan el procesador. Solo ocupan el procesador los procesos en estado R (running), que están calculando algo ahora mismo o esperan en la cola para hacerlo. Precisamente su número es la base del indicador de carga más conocido.
Este indicador se llama load average y se muestra con tres números, por ejemplo 2.24, 1.03, 0.50. Es la longitud media de la cola de procesos que necesitan el procesador en los últimos 1, 5 y 15 minutos. Linux les suma además los procesos que esperan a que termine una operación con el disco y no se pueden interrumpir, por eso el load average también sube cuando el disco es lento, aunque el procesador esté libre. El load average por sí solo no dice nada hasta que lo comparas con el número de núcleos. Supongamos que el servidor tiene 4 núcleos. Una carga de 2 significa que de media trabajaban dos procesos y la mitad de los núcleos estaba ociosa. Una carga de 4 significa que todos los núcleos están ocupados por completo, y una carga de 8 significa que a cada núcleo le tocan dos aspirantes y los procesos hacen cola, así que todo empieza a responder más despacio. En nuestro servidor de pruebas, dos procesos que ocupaban un núcleo cada uno dieron al cabo de un par de minutos un load average de 2,24 con 4 núcleos.
Conviene leer los tres números juntos, porque muestran la tendencia. Si el primero es bastante mayor que el tercero, la carga ha subido hace poco y quizá siga subiendo. Si el primero es menor que el tercero, el pico ya ha pasado. El número de núcleos del servidor lo muestra el comando nproc.
Además de la carga, el procesador tiene un desglose del tiempo que muestra top. El valor us es el tiempo dedicado a los programas, sy el dedicado al trabajo del kernel del sistema, id es el tiempo inactivo y wa la espera del disco. En un servidor virtual también importa el indicador st (steal). Muestra la parte del tiempo en que el servidor estaba listo para trabajar, pero el procesador físico estaba ocupado con otras tareas. En nuestro servidor de pruebas era cero.
1. Mira la carga general
La comprobación más rápida es el comando uptime. Muestra cuánto tiempo lleva funcionando el servidor sin reiniciarse y los tres números del load average.
uptime
nprocCompara el primer número del load average con el número de núcleos que muestra nproc. Si la carga es bastante mayor, busca quién la genera.
2. Encuentra el proceso en top
El comando top está en cualquier servidor y muestra los procesos en tiempo real. El parámetro -o %CPU los ordena por uso del procesador.
top -o %CPU
Arriba la carga general, debajo los procesos, primero los que más consumen
En la parte superior se ven el load average, el número de procesos, el desglose del tiempo del procesador y la memoria. En la tabla de abajo lo más interesante son unas cuantas columnas.
- PID es el número del proceso, lo necesitarás para terminarlo.
- USER muestra con qué usuario se ejecuta el proceso.
- %CPU es el uso del procesador. 100 % significa un núcleo entero, así que en un servidor con varios núcleos un proceso puede mostrar incluso más.
- RES muestra cuánta memoria RAM ocupa realmente el proceso.
- COMMAND es el nombre del programa.
Mientras top está abierto, la tecla M ordena los procesos por memoria, P de nuevo por procesador y q cierra el programa.
3. Instala htop
htop muestra lo mismo, pero de forma más clara, con barras de colores para cada núcleo y para la memoria. En nuestros servidores con Debian 12 no viene instalado por defecto, así que instálalo.
apt install -y htop
htop
Dos núcleos cargados por completo, dos casi libres
En htop puedes seleccionar los procesos con las flechas. La tecla F6 elige la columna por la que ordenar, F9 termina el proceso seleccionado, F5 muestra los procesos en forma de árbol y F10 o q cierra el programa. Si trabajas con Termius en el móvil, donde no hay teclas F, pulsa los rótulos de la parte inferior de la pantalla.
4. Obtén la lista de procesos con ps
top y htop son cómodos para observar, pero para buscar y para los scripts es mejor ps. Muestra la lista una sola vez y termina.
# Los cinco procesos que más cargan el procesador
ps aux --sort=-%cpu | head -6
# Lo mismo por memoria ocupada
ps aux --sort=-%mem | head -6
# Buscar un proceso por nombre y mostrar su PID
pgrep -a nginx5. Termina el proceso
Cuando hayas encontrado al culpable, puedes terminarlo por su número PID o por su nombre.
# Pedir amablemente al proceso que termine
kill 225145
# Terminar todos los procesos con ese nombre
pkill yes
Los procesos se han encontrado por nombre y se han terminado
El comando kill sin parámetros envía al proceso la señal TERM. Al recibirla, el programa puede guardar los datos, cerrar los archivos y salir por sí mismo. Si el proceso no responde, usa la señal KILL, que el sistema ejecuta a la fuerza sin preguntar al programa.
kill -9 225145Primero un kill normal
kill -9 no deja que el programa guarde los datos, así que una base de datos o un sitio web pueden perder los últimos cambios tras una terminación así. Úsalo solo cuando el kill normal no haya funcionado. Los servicios, por ejemplo Nginx o MySQL, es mejor reiniciarlos con el comando systemctl restart en lugar de terminarlos a mano.
Preguntas frecuentes
La carga es alta, pero en top no hay procesos con un %CPU alto
Mira el valor wa en la línea %Cpu(s). Si es alto, los procesos esperan al disco y no al procesador, y el load average sube por ellos. Para saber qué proceso lee y escribe más, te ayudará la pestaña I/O de htop o el programa iotop, que se instala con el comando apt install -y iotop.
El proceso terminó, pero al cabo de un minuto volvió a aparecer
Lo más probable es que sea un servicio que el sistema reinicia automáticamente o una tarea que lanza cron. Averigua a qué servicio pertenece el proceso con el comando systemctl status PID y detén el propio servicio.
Qué es un zombie en la salida de top
Es un proceso que ya ha terminado, pero cuyo proceso padre todavía no ha recogido su código de salida. Un zombie no ocupa memoria ni procesador y normalmente desaparece solo. Si cada vez hay más procesos de este tipo, el problema está en el programa padre, y reiniciarlo ayuda.
El servidor está sobrecargado de forma constante
Si el procesador o la memoria están siempre ocupados por el trabajo normal de tus programas, al servidor le faltan recursos. Con la memoria puede ayudar un archivo de intercambio, pero es más fiable pasar a un plan más potente. Cómo hacerlo se explica en las preguntas frecuentes.
Nuestros recursos
Canal de Telegram: https://t.me/f3cloud_news
Web del hosting: https://f3cloud.com