Disminuyendo accesos a disco

Imagen de Epe

Bueno, sigo con los discos. Lamentablemente la mayoría de los discos son mecánicos y los medios mecánicos son sumamente lentos comparados con los medios electrónicos (memorias, procesadores, etc). Aquí veremos cómo pedirle a nuestro linux que disminuya accesos a disco evitando las escrituras síncronas al syslog

Bueno, sigo con los discos. Lamentablemente la mayoría de los discos son mecánicos y los medios mecánicos son sumamente lentos comparados con los medios electrónicos (memorias, procesadores, etc). Aquí veremos cómo pedirle a nuestro linux que disminuya accesos a disco evitando las escrituras síncronas al syslog

Y bueno pues, ya hemos hecho todo lo posible por optimizar el disco montándolo con noatime y ajustándole los parámetros con hdparm, pero la máquina sigue con algunos problemas de performance. Sobre todo las máquinas que manejan mensajería (en grandes cantidades, digamos 1 millon o más de mails al día). El mail, genera muchos accesos a disco pues se escribe en /var/log/maillog por cada mail que llega al menos dos líneas, una para el remitente y otra para el destinatario, sin contar los logs que se hacen del que hace pop o imap y cuando una conexión falla y hay que repetirla o rebotarla.

una máquina que procesa más de un millon de mensajes diarios está generando al menos 2 millones de escrituras. Una opción es reducir la verbosidad de los logs del sendmail. Pero la primera que debemos tomar es la de reducir los accesos del syslog a disco.

Sendmail, al igual que muchas utilerías, usan al syslog para enviar sus mensajes a los logs, y lo interesante es que podemos indicarle al syslog que no escriba de forma síncrona (es decir, cada vez que llegue un mensaje escribirlo inmediatamente al disco) sino asíncrona (cada cierto tiempo cuando estime que ya debe escribir). De esta forma he logrado reducir máquinas con carga de hasta 6 a menos de 1 pues la mayoría de los recursos de acceso a disco estaban siendo consumidos por el syslog escribiendo a disco. Cómo lo hacemos? Muy fácil



Editemos /etc/syslog.conf y veremos algo así (pongo solo dos lineas de ejemplo y evito los comentarios):

*.info;mail.none;authpriv.none;cron.none /var/log/messages
mail.* /var/log/maillog

esto le indica al syslog dónde escribir cada tipo de mensaje, pero además le indica que lo haga de forma síncrona. La forma de indicarle que lo haga asíncronamente es bien sinmple, sólo agreguemos un - al inicio del camino, de esta forma:

*.info;mail.none;authpriv.none;cron.none -/var/log/messages
mail.* -/var/log/maillog

Fíjense que - va inmediatamente delante del /, sin espacios ni nada, así podemos ponerle a cada linea del syslog su - para indicarle al syslog que escriba asíncronamente ahorrándonos seguramente accesos a disco y evitando procesos bloqueados en el SO esperando por accesos a disco.

Parece tonto, pero realmente ayuda mucho a sistemas medianamente cargados, y para los que tengan sistemas poco cargados, no importa, pueden poner lo mismo, no les afectará en nada, sólo que posiblemente tampoco les ayudará, esto sería porque si los logs son bien pocos igual los accesos a disco son bien esporádicos y no ayudaría nada la escritura asíncrona.. o muy poco, pero uno nunca sabe cuándo se nos puede ocipar el sistema de verdad por eso, pónganlo.

Ah, para activar esto, debemos reiniciar el proceso de syslog:

killall -HUP syslogd (esto hará que se relea la configuración)

o para los que tenemos redhat o whitebox podemos:

service syslog reload

o

/etc/rc.d/init.d/syslog reload

cualquier alternativa es válida siempre y cuando logremos que se relea la configuración, es más, reiniciando la máquina también reinicia el servicio. Pero no me parece tan acertado llegar a esos extremos.

En todo caso, espero esto les ayude. Y hasta otro día.


Epe