asynchrone Protokollierung über rsyslogd (8) und Erhöhung des Schreibpuffers

10

Auf einer Website mit ziemlich hohem Datenverkehr, die in virtuellen Containern (VMware) ausgeführt wird und keinen lokalen Speicher hat, ist es uns gelungen, den Durchsatz (Anforderungen pro Sekunde) erheblich zu steigern, indem wir von der direkten Protokollierung in Protokolldateien (die sich im Remotenetzwerkspeicher befinden) zu wechseln rsyslogd .

Im Wesentlichen haben wir von der synchronen zur asynchronen Protokollierung gewechselt. Die Webserver-Mitarbeiter schreiben mit syslog (3) in einen Speicherpuffer, und rsyslogd (8) sendet die Daten parallel und in ihrem eigenen Tempo an eine tatsächliche Datei, sodass Prozesse beim Protokollieren keine E / A blockieren.

So weit, ist es gut. Das Problem ist, dass gelegentlich das Schreiben von rsyslogd verhindert wird (z. B. ein vorübergehender / längerer Netzwerkausfall) und der eingehende Puffer schnell voll wird.

Meine Fragen sind:

  • Kann ein Client jemals blockieren, wenn er mit syslog (3) in rsyslogd schreibt ?
  • Gibt es eine Möglichkeit, die rsyslogd- Statistiken anzuzeigen , z. B. wie groß / voll der Puffer ist?
  • Gibt es eine Möglichkeit, den eingehenden Puffer von rsyslogd zu vergrößern ?
arielf
quelle
2
Hast du das jemals gelöst? Wenn ja, würde ich gerne Ihre Antwort lesen.
Djeikyb
1
@djeikyb: sorry nein. Ich sehe Interesse (Stimmen zu der Frage), aber noch hat niemand darauf geantwortet. Sieht so aus, als ob dies einen Quellcode-Tauchgang erfordert.
Arielf
1
Sie sagen nicht, welchen Webserver Sie verwenden. Vielleicht sollten Sie Syslog überhaupt nicht verwenden. Verwendet Apache beispielsweise Syslog zum Protokollieren oder schreibt es nur in Protokolldateien? Die Anmeldung bei einer Datenbank ist eine weitere Möglichkeit.
Blujay

Antworten:

1

Soweit ich mich erinnere, ist der Standardmodus für die Hauptnachrichtenwarteschlange in rsyslog ein Array mit fester Größe. Es gibt ein Limit für 10k Elemente oder so. Versuchen Sie, dies in eine Warteschlange für verknüpfte Listen zu ändern, damit Ihre gelegentlichen Nachrichtenbursts viel besser verarbeitet werden können.

Ja, es gibt FixedArrayund LinkedListWarteschlangen.

Hostmaster
quelle
"Versuch dich zu ändern" ... Kannst du expliziter sein? Betrachtet man /etc/rsyslog.conf: Ich sehe nichts in Bezug auf die Arten von Warteschlangen, die Sie erwähnen. Benötigt dies eine Codeänderung? Wo und wie können diese konfiguriert werden? Vielen Dank!
Arielf
1

Die Antwort auf Ihre erste Frage lautet:

Ja, jeder Aufruf von syslog () wird blockiert. Vielleicht für eine sehr kurze Zeit, aber es ist immer noch ein synchroner Aufruf mit einem Dateideskriptor. Siehe man 3 syslogfür mehr detials.

Sofern Ihre Server keine asynchronen Architekturen und Grundelemente verwenden, wird es immer zu Sperren kommen. Dies kann gemildert, aber nicht beseitigt werden, indem beispielsweise ein separater Thread für die Protokollierung verwendet wird. Bei den beiden anderen Fragen weiß ich es nicht genau, aber die Überprüfung des Quellcodes rsyslogd (sowie des Codes für die Funktionsfamilie syslog ()) ist der einzige Weg, dies zu wissen.

Wenn Sie die Protokollierung über das UDP: 514 "Netzwerk-Syslog-Protokoll" auf einen externen Server verschieben, können Sie generell die Möglichkeiten zum Erstellen von Sperren auf nahezu Null bringen. Mit dem Nachteil eines möglichen Verlusts an Protokollierung bei hohen Lasten.

Zunächst müssen Sie auf den "Ursprungs" -Servern sicherstellen, dass die gesamte Protokollierung über Syslog erfolgt. In Apache2 müssen Sie beispielsweise Folgendes angeben:

ErrorLog "syslog:daemon"

Weitere Server finden Sie in der entsprechenden Manpage. Wenn Sie dies nicht sicherstellen können, beachten Sie bitte, dass durch die Anmeldung an Dateisystemen erstellt werden kann

Zweitens werden Sie in der ursprünglichen rsyslogd-Konfiguration aufgefordert, den gesamten Syslog-Verkehr für die von Ihnen ausgewählte Einrichtung (in diesem Beispiel "Daemon") an einen oder mehrere externe Syslog-Server zu leiten. In der rsyslog-Konfigurationsdatei können Sie Folgendes angeben:

daemon.* @192.168.128.1
daemon.* @192.168.254.1

zwei Kopien der Protokolle müssen gleichzeitig an zwei verschiedene Server gesendet werden.

Drittens aktivieren Sie auf den Zielservern den Empfang der Syslog-Nachricht über UDP: 514. Es befindet sich in der Konfigurationsdatei (Ziel) rsyslogd und wird normalerweise standardmäßig deaktiviert (es würde ausreichen, die führenden #s zu entfernen:

$ModLoad imudp
$UDPServerRun 514

Viertens , optional, aber sehr zu empfehlen, würde ich auch hochauflösende Zeitstempel aktivieren:

$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

Auch diese Option ist normalerweise standardmäßig deaktiviert (warum auf der Erde?).

EnzoR
quelle