Domanda

Abbiamo un'applicazione su Linux che utilizzava il meccanismo syslog . Dopo una settimana trascorsa a cercare di capire perché questa applicazione funzionasse più lentamente del previsto, abbiamo scoperto che se eliminavamo syslog e scrivevamo direttamente in un file di registro, le prestazioni miglioravano notevolmente.

Capisco perché syslog è più lento delle scritture dirette di file. Ma mi chiedevo: ci sono modi per configurare syslog per ottimizzarne le prestazioni?

È stato utile?

Soluzione

Puoi configurare syslogd (e almeno rsyslog) per non sincronizzare i file di registro dopo un messaggio di registro anteponendo un " - " al percorso del file di registro nel file di configurazione. Questo accelera le prestazioni a scapito del pericolo che i messaggi di registro possano andare persi in un incidente.

Altri suggerimenti

Esistono diverse opzioni per migliorare le prestazioni del syslog:

  • Ottimizzazione delle chiamate 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));
              ...
     }
    

    Un vantaggio dell'utilizzo di una macro per filtrare le chiamate syslog è che l'intera chiamata è ridotto a un salto condizionale su una variabile globale, molto utile se vi capita hanno chiamate DEBUG che traducono set di dati di grandi dimensioni attraverso altre funzioni.

  • setlogmask ()

    setlogmask(LOG_UPTO(LOG_LEVEL))
    

    setlogmask () ottimizzerà la chiamata non registrandosi su / dev / log, ma il programma lo farà chiama ancora le funzioni usate come argomenti.

  • filtro con syslog.conf

     *.err                                               /var/log/messages
    

    " controlla la pagina man per syslog.conf per i dettagli. "

  • configura syslog per eseguire registrazioni asincrone o bufferizzate

    metalog usato per bufferizzare l'output del log e scaricarlo in blocchi. stock syslog e syslog-ng non farlo per quanto ne so.

Prima di intraprendere la scrittura di un nuovo demone puoi verificare se syslog-ng è più veloce (o può essere configurato per essere più veloce) del semplice vecchio syslog.

Un trucco che puoi usare se controlli l'origine nell'applicazione di registrazione è quello di mascherare il livello di registro che desideri nell'app stessa, invece che in syslog.conf. L'ho fatto anni fa con un'app che generava una quantità enorme, enorme, enorme di registri di debug. Invece di rimuovere le chiamate dal codice di produzione, abbiamo semplicemente mascherato in modo che le chiamate a livello di debug non siano mai state inviate al demone. In realtà ho trovato il codice, è Perl ma è solo un fronte alla chiamata 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");

Non so perché ho usato il decimale invece di una maschera di bit ... shrug

Scrivi la tua implementazione syslog. :-P

Questo può essere realizzato in due modi.

  1. Scrivi il tuo hook LD_PRELOAD per sovrascrivere le funzioni syslog e renderle invece in stderr . In realtà ho scritto un post su questo molti anni fa: http://marc.info/?m=97175526803720 :-P
  2. Scrivi il tuo demone syslog. È solo una questione di estrarre i datagrammi da / dev / log ! :-P

Va ??bene, va bene, quindi queste sono entrambe risposte facetious. Hai profilato syslogd per vedere dove sta soffocando di più?

È possibile configurare il livello (o la funzione) di syslogd per accedere in modo asincrono, inserendo un percorso meno prima del file di registro (ad es .: utente. * [tab] - / var / log / user.log).

Saluti.

L'implementazione di syslog-async () può aiutare, a rischio di perdere le linee di log / ritardi limitati in altre occasioni. http://thekelleys.org.uk/syslog-async/

Nota: 'asincrono' qui si riferisce agli eventi del registro di accodamento all'interno dell'applicazione e non all'opzione di configurazione del file di output syslogd asincrono a cui fanno riferimento altre risposte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top