2008-10-16 14 views
9

Tenemos una aplicación en Linux que utilizó el mecanismo syslog. Después de una semana tratando de descubrir por qué esta aplicación se estaba ejecutando más lento de lo esperado, descubrimos que si eliminamos el registro del sistema, y ​​simplemente escribimos directamente en un archivo de registro, el rendimiento mejoró de forma espectacular.¿Se puede mejorar el rendimiento del registro de sys?

entiendo por qué syslog es más lento que el archivo directo escribe. Pero me preguntaba: ¿hay formas de configurar syslog para optimizar su rendimiento?

Respuesta

20

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

1

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

Esto se puede lograr de dos maneras.

  1. Escribe tu propia LD_PRELOAD gancho para anular las funciones de registro del sistema, y ​​hacer que la salida a stderr lugar. de hecho escribí un post sobre esto hace muchos años: http://marc.info/?m=97175526803720 :-P
  2. Escribe tu propia demonio syslog. ¡Es solo una cuestión simple de tomar datagramas de /dev/log! :-P

acuerdo, de acuerdo, por lo que estas son las dos respuestas graciosas. ¿Ha perfilado syslogd para ver dónde se está asfixiando más?

4

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

+0

También hay rsyslog. No sé si es más rápido, pero podría valer la pena probarlo. –

1

Puede configurar el nivel (o la facilidad) de syslogd para que se registre de forma asincrónica, colocando una ruta menos antes en el archivo de registro (es decir .: usuario. * [Pestaña] -/var/log/usuario.log).

Saludos.

3

Un truco que puede utilizar si el control de la fuente de la aplicación de registro es para enmascarar el nivel de registro que desea en la aplicación en sí, en lugar de en syslog.conf. Lo hice hace años con una aplicación que generó una cantidad enorme, enorme y enorme de registros de depuración. En lugar de eliminar las llamadas del código de producción, simplemente lo enmascaramos para que las llamadas al nivel de depuración nunca se envíen al daemon. De hecho, encontré el código, es Perl, pero está solo en la parte delantera de la llamada 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 sé por qué he usado decimal en lugar de una máscara de bits ... encogimiento

+0

No estoy seguro de que llamaría esto un truco, es cómo se supone que debes hacerlo, pero estoy de acuerdo que tal vez no sea tan ampliamente utilizado como debería ser. –

5

Hay varias opciones para mejorar el rendimiento de syslog:

  • Optimización cabo 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 registro del sistema es que toda la llamada es reducido a un salto condicional en una variable global, muy útil si le sucede que tiene llamadas Depuración, están traduciendo grandes conjuntos de datos a través de otras funciones.

  • setlogmask()

    setlogmask(LOG_UPTO(LOG_LEVEL)) 
    

    setlogmask() optimizará la llamada al no registrar a/dev/log, pero el programa sigue llamar a las funciones que se utilizan como argumentos.

  • filtrado con syslog.conf

    *.err            /var/log/messages 
    

    "echa un vistazo a la página del manual de syslog.conf para más detalles."

  • configurar syslog para hacer el registro asíncrono o tamponada

    metalog usada para buffer de salida de registro y enrojecida en bloques. stock syslog y syslog-ng No hagas esto hasta donde yo sé.

0

El syslog-asíncrono() implementación puede ayudar, con el riesgo de pérdida de líneas de registro/delimitada retrasos en otros momentos. http://thekelleys.org.uk/syslog-async/

Nota: 'asíncrono' aquí se refiere a la cola de registro de eventos dentro de la aplicación, y no la opción de configuración del archivo de salida syslogd asincrónico que otros se refieren a respuestas.

Cuestiones relacionadas