Pregunta

Tenemos una aplicación en Linux que utiliza el mecanismo syslog . Después de pasar una semana intentando averiguar por qué esta aplicación se ejecutaba más lentamente de lo esperado, descubrimos que si eliminábamos el syslog y escribíamos directamente en un archivo de registro, el rendimiento mejoró drásticamente.

Entiendo por qué syslog es más lento que las escrituras directas de archivos. Pero me preguntaba: ¿hay formas de configurar syslog para optimizar su rendimiento?

¿Fue útil?

Solución

Puede configurar syslogd (y al menos rsyslog) para que no se sincronicen los archivos de registro después de un mensaje de registro al añadir un " - " a la ruta del archivo de registro en el archivo de configuración. Esto acelera el rendimiento a expensas del peligro de que los mensajes de registro se pierdan en un accidente.

Otros consejos

Hay varias opciones para mejorar el rendimiento de syslog:

  • Optimizar llamadas con una macro

     int LogMask = LOG_UPTO(LOG_WARNING);
     #define syslog(a, ...) if ((a) & LogMask ) syslog((a), __VA_ARGS__)
    
     int main(int argc, char **argv)
     {
              LogMask = setlogmask(LOG_UPTO(LOG_WARNING));
              ...
     }
    

    Una ventaja de usar una macro para filtrar las llamadas de syslog es que toda la llamada es reducido a un salto condicional en una variable global, muy útil si sucede que tiene llamadas DEBUG que traducen grandes conjuntos de datos a través de otras funciones.

  • setlogmask ()

    setlogmask(LOG_UPTO(LOG_LEVEL))
    

    setlogmask () optimizará la llamada al no iniciar sesión en / dev / log, pero el programa aún llamar a las funciones utilizadas como argumentos.

  • filtrado con syslog.conf

     *.err                                               /var/log/messages
    

    " consulte la página del manual de syslog.conf para obtener más información. "

  • configure syslog para hacer un registro asíncrono o almacenado en búfer

    el metalog se usó para amortiguar la salida del registro y se eliminó en bloques. stock syslog y syslog-ng no hagas esto por lo que sé.

Antes de embarcarse en la escritura del nuevo daemon, puede verificar si syslog-ng es más rápido (o puede configurarse para ser más rápido) que el antiguo syslog.

Un truco que puede usar si controla el origen de la aplicación de registro es enmascarar el nivel de registro que desea en la propia aplicación, en lugar de en syslog.conf. Hice esto hace años con una aplicación que generó una enorme, enorme, gran cantidad de registros de depuración. En lugar de eliminar las llamadas del código de producción, simplemente nos enmascaramos para que las llamadas de nivel de depuración nunca se enviaran al daemon. De hecho, encontré el código, es Perl, pero es solo una parte frontal de la llamada a setlogmask (3).

use Sys::Syslog;
# Start system logging
# setlogmask controls what levels we're going to let get through.  If we mask
# them off here, then the syslog daemon doesn't need to be concerned by them
# 1   = emerg
# 2   = alert
# 4   = crit
# 8   = err
# 16  = warning
# 32  = notice
# 64  = info
# 128 = debug
Sys::Syslog::setlogsock('unix');
openlog($myname,'pid,cons,nowait','mail');
setlogmask(127); # allow everything but debug
#setlogmask(255); # everything
syslog('debug',"syslog opened");

No estoy seguro de por qué usé decimal en lugar de una máscara de bits ... shrug

Escriba su propia implementación de syslog. :-P

Esto se puede lograr de dos maneras.

  1. Escriba su propio enlace LD_PRELOAD para anular las funciones de syslog, y haga que salgan a stderr en su lugar. De hecho, escribí una publicación sobre esto hace muchos años: http://marc.info/?m=97175526803720 :-P
  2. Escriba su propio demonio syslog. ¡Es simplemente una cuestión de agarrar datagramas de / dev / log ! :-P

Está bien, está bien, así que estas son respuestas graciosas. ¿Ha perfilado syslogd para ver dónde se está asfixiando más?

Puede configurar el nivel (o instalación) de syslogd para que se registre de forma asíncrona, colocando un menos antes de la ruta al archivo de registro (es decir, usuario. * [pestaña] - / var / log / user.log).

Saludos.

La implementación de syslog-async () puede ayudar, a riesgo de pérdida de líneas de registro / demoras acotadas en otros momentos. http://thekelleys.org.uk/syslog-async/

Nota: 'asíncrono' aquí se refiere a los eventos de registro de colas dentro de su aplicación, y no a la opción de configuración del archivo de salida syslogd asíncrona a la que se refieren otras respuestas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top