registrazione asincrona tramite rsyslogd (8) e aumento del buffer di scrittura


10

Su un sito Web a traffico piuttosto elevato in esecuzione in contenitori virtuali (VMware) e privo di memoria locale, siamo riusciti ad aumentare la velocità effettiva (richieste al secondo) in modo significativo passando dalla registrazione direttamente ai file di registro (che risiedono nella memoria di rete remota) a rsyslogd .

Essenzialmente siamo passati dalla registrazione sincrona a quella asincrona. I lavoratori del web server scrivono usando syslog (3) su un buffer di memoria e rsyslogd (8) invia i dati a un file reale in parallelo e al proprio ritmo, quindi i processi non si bloccano su IO durante la registrazione.

Fin qui tutto bene. Il problema è che a rsyslogd a volte viene impedito di scrivere (ad esempio un'interruzione di rete momentanea / prolungata) e il buffer in entrata si riempie rapidamente.

Le mie domande sono:

  • Un client può mai bloccare quando scrive su rsyslogd usando syslog (3) ?
  • C'è un modo per guardare le statistiche di rsyslogd , ad esempio quanto è grande / pieno il buffer?
  • C'è un modo per aumentare le dimensioni del buffer in arrivo rsyslogd ?

2
L'hai mai risolto? In tal caso, sarei interessato a leggere la tua risposta.
djeikyb,

1
@djeikyb: scusa no. Vedo interesse (voti sulla domanda) ma nessuno ha ancora risposto. Sembra che questo richieda un tuffo nel codice sorgente.
Ari

1
Non dici quale server web stai usando. Forse non dovresti usare affatto syslog. Apache, ad esempio, utilizza syslog per accedere o semplicemente scrive nei file di registro? L'accesso a un database è un'altra possibilità.
Blujay

Risposte:


1

Per quanto ricordo la modalità predefinita per la coda di messaggi principale in rsyslog è una matrice di dimensioni fisse. Ha un limite per circa 10k elementi. Prova a cambiarlo in una coda dell'elenco collegato che dovrebbe gestire molto meglio i tuoi scoppi occasionali di messaggi.

Sì, ci sono FixedArraye LinkedListcode.


"Prova a cambiare" ... Puoi essere più esplicito? Guardando /etc/rsyslog.conf: non vedo nulla correlato ai tipi di code che menzioni. Ciò richiede una modifica del codice? Dove e come possono essere configurati? Grazie!
Ari

1

La risposta alla tua prima domanda è:

Sì, qualsiasi chiamata a syslog () sta bloccando. Forse per un tempo molto breve, ma è comunque una chiamata sincrona che coinvolge un descrittore di file. Vedi man 3 syslogper più detials.

A meno che i server non utilizzino architetture e primitive asincrone, ci sarà sempre qualche blocco. Questo può essere mitigato, ma non eliminato, ad esempio utilizzando un separatethread per la registrazione. Per le altre due domande che non conosco davvero, ma l'ispezione del codice sorgente rsyslogd (nonché di quello della famiglia di funzioni syslog ()) è l'unico modo per sapere.

Più in generale, se si sposta la registrazione su un server esterno tramite UDP: 514 "protocollo syslog di rete", si porta quasi a zero la possibilità di creare blocchi. Con l' inconveniente di una possibile perdita di registrazione durante carichi elevati.

Innanzitutto , nei server "originari" è necessario assicurarsi che tutte le registrazioni avvengano tramite syslog. Ad esempio, in Apache2 è necessario specificare:

ErrorLog "syslog:daemon"

Per altri server, consultare la pagina man corretta. Se ciò non è possibile, tenere presente che è possibile creare l'accesso ai filesystem

In secondo luogo , nella configurazione rsyslogd di origine si chiede di indirizzare tutto il traffico syslog per la struttura scelta ("daemon" in questo esempio) a uno o più server syslog esterni. Nel file di configurazione rsyslog è possibile specificare:

daemon.* @192.168.128.1
daemon.* @192.168.254.1

avere due copie dei registri da inviare contemporaneamente a due server diversi.

In terzo luogo , nei server di destinazione si abilita la ricezione del messaggio syslog su UDP: 514. Si trova nel file di configurazione (destinazione) rsyslogd ed è normalmente disabilitato da defualt (sarebbe sufficiente rimuovere i # iniziali:

$ModLoad imudp
$UDPServerRun 514

In quarto luogo , facoltativo ma altamente raccomandato, abiliterei anche timestamp ad alta risoluzione:

$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

Anche questa opzione è normalmente disabilitata di default (perché sulla Terra?).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.