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 ?
Antworten:
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
FixedArray
undLinkedList
Warteschlangen.quelle
/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!Die Antwort auf Ihre erste Frage lautet:
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:
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:
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:
Viertens , optional, aber sehr zu empfehlen, würde ich auch hochauflösende Zeitstempel aktivieren:
Auch diese Option ist normalerweise standardmäßig deaktiviert (warum auf der Erde?).
quelle