[TIP] Una de sysadmins transpirados: El log de un servicio te llena el disco y se te rompe todo. Como vivir para contarla.

 

Esta que sigue me pasó hace un rato y no es la primera vez lamentablemente: el log de <algo> te llena el disco de mierdas y se te rompe  alguna otra cosa que estaba en producción y el mundo se desploma por una fracción de hora hasta que reaccionás y todo vuelve a la normalidad.

Unas veces la sacás barata y no pasa de un susto, otras se te corrompe el sistema de archivos de una VM o el log de una base de datos o no te queda otra que restaurar ese <algo> que no funciona desde el backup que por suerte tenías.

Por que si estás a cargo de un sistema cualquiera y no tenés nada que te avise que se te llenó un disco, un backup seguramente tenías, verdad?

 

Foto de un sysadmin real pensando que hacer después de que se le llenó un disco, borró el log y ahora no le funciona nada.

 

Bueno, acá va: esta es la forma rápida de devolver a la vida, de resucitar un Linux cuando dejó de funcionar por que se quedó sin espacio en tal o cual disco, usualmente la partición raíz, por que si no tenés nada que te avise que se te llenó un disco, ni tenés backup, tampoco tenés compartimentado el disco en particiones, verdad?

Paso 1: Determinar cual es la partición llena y liberar espacio de urgencia.

 

Primero lo primero: determinar cual de las particiones está detonada con un

df -h

 

Supongamos que la partición raíz que se te llenó sea la clasica /dev/sda1. Lo mas urgente es hacer espacio para que todos los servicios que necesitan escribir sobre el disco puedan. Esto se puede lograr rápidamente reasignando el espacio reservado para root sobre la partición en cuestión corriendo sobre la partición del problema:

tune2fs -m1 /dev/sda1

 

Con eso habrás pasado del -m5 que viene preseteado de serie sobre la partición (reservar el 5% del espacio libre para que root siempre pueda ingresar) a un 1% (por el -m1), que con el tamaño de los discos actuales sigue siendo mas que suficiente, liberando posiblemente varios gigas de espacio para que los servicios puedan continuar operando.

 

Paso 2: determinar que llenó el disco y arreglarlo.

Ahora que ya hiciste espacio, reiniciaste los servicios que dejaron de funcionar y todo vuelve a ir sobre rieles, necesitás determinar que fue lo que llenó el disco. Para esto nunca encontré una forma mas rápida y cómoda que la utilización de ncdu:

apt install ncdu

ncdu -x /

Donde -x es por «one filesystem» para que si tenés una partición o punto de montaje externo subido a la partición que se te llenó (que en el ejemplo era la partición raíz) no los considere en el gran total.

 

Y con esto llegué por fin a donde quería. Muchos de los servicios esenciales en Linux se ponen maricones si les tocás el log mientras corren. En otros casos no podés detener un servicio en producción para vaciar el log, en otros cuando lo manipulás mal le cambiás el atime o el ownership y el servicio ya no lo puede acceder y se rompe, y así hasta el infinito, nunca sabés exactamente que estás por romper.

Entonces: ¿cual es la forma mas elegante de vaciar un log, sin que se rompa nada y sin detener al servicio que lo está utilizando en producción, ni consumir tanto I/O sobre los discos rígidos que todo el servidor se vuelta pelotudo?

 

Esta:

> /var/log/log_que_te_esta_cagando_la_vida.log

 

Tan simple como eso. Desde la consola de tu Linux tirás un «>» + «/path al archivo problematico» y lo ponés en cero en pocos segundos.

 

Por que si no tenías nada que te avise que se te está llenando un disco, ni tenías backups del servidor o los servicios afectados, ni compartimentada la partición raíz, seguramente tenías debidamente configurado logrotate para que nunca se te llene un disco, verdad?

 

Glosario de links para profundizar:

  1. tune2fs -m1
  2. ncdu
  3. logrotate

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Wordpress Hashcash needs javascript to work, but your browser has javascript disabled. Your comment will be queued in Akismet!