tag editar easytag linux unix logging syslog

editar - linux easytag



¿Se puede mejorar el rendimiento del syslog? (7)

Tenemos una aplicación en Linux que usó 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.

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


Escribe tu propia implementación de syslog. :-PAG

Esto se puede lograr de dos maneras.

  1. Escriba su propio gancho LD_PRELOAD para anular las funciones de syslog y hacer que stderr a stderr . De hecho, escribí una publicación sobre esto hace muchos años: http://marc.info/?m=97175526803720 :-P
  2. Escribe tu propio daemon syslog. ¡Simplemente es una cuestión de capturar datagramas de /dev/log ! :-PAG

Está bien, está bien, entonces estas son respuestas divertidas. ¿Ha perfilado syslogd para ver dónde se está asfixiando más?


Antes de iniciarse en la escritura de daemon nuevo, puede verificar si syslog-ng es más rápido (o puede configurarse para ser más rápido) que el viejo y simple registro de sistema.


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).

Aclamaciones.


Puede configurar syslogd (y rsyslog al menos) para no sincronizar los archivos de registro después de un mensaje de registro anteponiendo un "-" 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.


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 aplicación, en lugar de 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 estoy seguro de por qué usé decimal en lugar de máscara de bits ... encogimiento de hombros


Hay varias opciones para mejorar el rendimiento de syslog:

  • Optimización de 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 utilizar una macro para filtrar las llamadas de syslog es que toda la llamada se reduce a un salto condicional en una variable global, muy útil si tiene llamadas a 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 seguirá llamando a las funciones utilizadas como argumentos.

  • filtrando con syslog.conf

    *.err /var/log/messages

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

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

    el metalog usó para almacenar el buffer de la salida de registro y lo vació en bloques. stock syslog y syslog-ng no hacen esto hasta donde sé.


La implementación de syslog-async () puede ayudar, a riesgo de perder líneas de registro / retrasos acotados en otros momentos. http://thekelleys.org.uk/syslog-async/

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