Ir al contenido

Más allá de lo básico: Auditoría profunda de Hilos, Sockets y Ficheros en Linux

En el día a día de la administración de sistemas, a menudo nos movemos por inercia con comandos estándar. Sin embargo, cuando el rendimiento decae o un servicio se comporta de forma errática, necesitamos herramientas que nos permitan ver las entrañas del kernel. Hoy vamos a elevar el nivel analizando tres conceptos avanzados: la gestión multihilo, la activación por sockets en systemd y la auditoría total de descriptores de archivos.

1. Disección de Procesos: Cuando un PID no es suficiente

Todos conocemos ps aux, pero en entornos de bases de datos o servidores de aplicaciones pesados, ver el proceso padre es solo la punta del iceberg. Aplicaciones como MySQL/MariaDB, Java o Apache (con ciertos MPMs) generan múltiples hilos de ejecución (Threads) bajo un mismo proceso.

Si un servidor MySQL está consumiendo el 100% de la CPU, ¿es el proceso principal o un hilo específico atascado en una consulta compleja?

Para esto, el flag -L es nuestro mejor aliado.

# El comando correcto para filtrar procesos MySQL y ver sus hilos:
ps -eLf | grep mysql

¿Qué estamos viendo aquí?

  • LWP (Light Weight Process): En Linux, los hilos se manejan como procesos ligeros. Esta columna te muestra el ID único del hilo.
  • NLWP (Number of Light Weight Processes): Te indica cuántos hilos tiene ese proceso en total.

Caso de uso SysAdmin: Si observas que el NLWP de un servicio crece descontroladamente, podrías estar ante un "thread leak" o una mala configuración en el pool de conexiones de tu base de datos.

2. Systemd y la magia de los Sockets (.socket)

En la vieja escuela (SysVinit), los demonios se iniciaban al arranque y se quedaban escuchando, consumiendo RAM aunque nadie los usara. Systemd introdujo (o popularizó) la activación por sockets.

Tomemos como ejemplo snapd.socket o docker.socket.

Cuando ves un servicio acabado en .socket, significa que systemd ha creado el socket de escucha (ya sea TCP o un socket UNIX en /run/) antes de iniciar el servicio real.

# Verificar el estado de la unidad socket
systemctl status snapd.socket

El flujo es el siguiente:

  1. Systemd escucha en el puerto/archivo.
  2. Llega una petición.
  3. Systemd "despierta" al servicio real (snapd.service) y le pasa la conexión.

¿Por qué es vital saber esto? A veces intentamos reiniciar un servicio (systemctl restart servicio) y vemos que el error persiste o el puerto sigue ocupado. Tip: A menudo es el .socket el que mantiene la conexión o el que debes reiniciar si has cambiado la configuración del puerto, no solo el .service.

3. lsof: La navaja suiza de la auditoría

En UNIX/Linux, "todo es un fichero". Una conexión TCP es un fichero, una librería compartida es un fichero, y un directorio es un fichero. Por eso, lsof (List Open Files) es quizás la herramienta más potente para entender qué está pasando ahora mismo.

Vamos a darle la potencia que merece:

A. Ver quién ocupa un puerto específico (sin netstat/ss):

lsof -i :80

B. Ver qué está haciendo un usuario sospechoso o específico:

lsof -u www-data

C. El caso del "Disco lleno fantasma": ¿Te ha pasado que df -h dice que el disco está lleno, pero borras archivos y el espacio no se libera? Eso es porque un proceso tiene el archivo "abierto" (marcado como deleted pero retenido en memoria).

lsof +L1

Este comando te mostrará los archivos eliminados que siguen ocupando espacio porque un proceso los tiene agarrados. Matar ese proceso liberará el espacio instantáneamente.

Conclusión

Pasar de usuario a SysAdmin implica dejar de ver el sistema como una caja negra. Herramientas como ps -eLf, el entendimiento de las unidades .socket y el dominio de lsof nos dan la visión de rayos X necesaria para mantener infraestructuras robustas y eficientes.

¿Tienes algún flag favorito de ps o un truco con lsof que te haya salvado la vida? Compártelo en los comentarios.

Más allá de lo básico: Auditoría profunda de Hilos, Sockets y Ficheros en Linux
LibreTICs 1 de diciembre de 2025
Compartir
Etiquetas
Nuestros blogs
Archivo
Pantalla Negra al iniciar Linux Mint