1. Einleitung
Egal, ob Sie
Checkmk Community mit dem Nagios-Kern nutzen oder eine der kommerziellen Editionen mit Checkmk Micro Core (CMC):
In beiden Fällen können Sie mit den richtigen Einstellungen für den Monitoring-Kern und die kernnahen Prozesse den Arbeitsspeicherbedarf minimieren, Lastspitzen vermeiden und so vorhandene Hardware optimal ausnutzen.
Die Einstellungen von Checkmk out of the box funktionieren bei der größten Zahl der Checkmk-Installationen sehr gut. Ein Server mit vier Prozessorkernen, acht Gigabyte RAM und mehr als 20.000 Services ist nicht ungewöhnlich. Uns (insbesondere den Mitarbeitenden im Support bei Checkmk) sind jedoch auch schon Installationen begegnet, bei denen einige langsam antwortende Hosts und andere Umstände bereits mit weniger als 5000 Services auf 16 GB RAM zu Performance-Problemen führten.
In solchen Fällen ist das Tuning des Monitoring-Kerns dringend angeraten — und führt meist sehr schnell zum Erfolg. Aber auch in Fällen, in denen Checkmk butterweich läuft, hilft dieser Artikel, Ressourcen frei zu geben, die Sie anderen Aufgaben widmen können. Das kann beispielsweise der Betrieb einer Testinstanz auf der gleichen Maschine neben einer Produktivinstanz sein.
Hier vorgestellte Einstellmöglichkeiten berücksichtigen auch, wie stark mit der GUI gearbeitet wird und ob andere Anwendungen neben Checkmk auf derselben Maschine laufen müssen: In solchen Fällen ist es oft erwünscht, auch nach einem Neustart Lastspitzen etwas abzufedern und dafür Checkmk etwas länger Zeit zu geben, bis alle Services wieder einen bekannten Zustand haben. Bei Instanzen dagegen, mit denen wenig direkt interagiert wird, kann es hilfreich sein, mit kurzer, hoher Last schnell wieder alle Services aktuell zu haben.
2. Zuerst andere Tuning-Möglichkeiten ausschöpfen
Einen sehr guten Überblick über alle Tuning-Möglichkeiten (inklusive der in diesem Artikel vorgestellten) liefert der Vortrag Performance tuning and more – Checkmk under the hood von der Checkmk-Konferenz #11, den Sie auf YouTube ansehen können.
2.1. Apache und andere Instanzdienste
Lesen Sie den Artikel zu Instanzdiensten, um zu erfahren, auf welche Dienste Sie möglicherweise verzichten können und wie Sie den Instanz-Apache optimal auf das Nutzungsverhalten auf Ihrem Checkmk-Server einstellen. Falls Sie wegen akuten Performance-Problemen auf diesen Artikel gestoßen sind, reduzieren Sie die Zahl der Apache-Prozesse vor der Anwendung der hier vorgestellten Maßnahmen auf das absolute Minimum. Sie können diese dann später — wenn genügend RAM und CPU freigeräumt wurden — wieder auf ein sinnvolles Maß anheben.
2.2. Ausführungsdauer von Agenten
Ein Punkt, an dem Sie ansetzen sollten, bevor Sie Monitoring-Kern und kernnahe Prozesse optimieren, ist die Laufzeit von Agenten. Zwischen dem Kontakt mit dem Agenten und dem Eingang der vollständigen Agentenausgabe wartet ein Prozess lediglich. Bei Checkmk Community ist das ein einziger Python-Prozess, der die Agentenausgabe einholt und anschließend verarbeitet. Meist benötigt dieser 80 bis 100 MB residenten Speicher. Bei den kommerziellen Editionen ist das ein sogenannter Fetcher, der nichts anderes tut als Agentenausgaben weiterzugeben. Auch diese benötigen in der Regel 30 bis 60 MB residenten Speicher.
Für die Optimierung ermitteln Sie zunächst die Zahl der mit regulären Agenten, Spezialagenten und SNMP überwachten Hosts und deren durchschnittliche Ausführungsdauer. Bei der Ermittlung hilft der Blick ins Monitoring „typischer“ Hosts — dort interessiert vor allem der Service Check_MK. Eine Topliste liefert Monitor > History > Service check durations, eine vollständige Liste kann per Livestatus eingeholt werden.
Die Performance-Daten für die Einholung von Agentendaten können Sie auch mittels Livestatus abfragen.
Die Tabelle services enthält eine Spalte perf_data, welche die Ausführungsdauer verschiedener Aspekte enthält.
Filtern Sie auf aktive Checks (das Einholen von Daten per Fetcher ist hierunter subsumiert).
In der Spalte perf_data ist die Summe aus user_time und system_time die CPU-Zeit.
Der letzte Wert — cmk_time_agent oder cmk_time_smtp — ist die Zeit, welche benötigt wurde, Agentendaten einzuholen.
Das folgende Beispiel zeigt das Einholen dieser Daten für den letzten Check:
Wollen Sie später auch die Ausführungsdauer von aktiven Checks ermitteln, ersetzen Sie den Filter description = Check_MK durch active_checks_enabled = 1.

Die folgende Tabelle zeigt die Wartezeit auf Agentenausgaben und die Dauer der folgenden Verarbeitung in einer fiktiven Umgebung (mit eher pessimistischen Annahmen der CPU-Zeit), aufsummiert für ein Check-Intervall von einer Minute. Die angenommenen Zahlen resultieren in der Praxis meist in 3000 bis 5000 Services.
| Anzahl | Check | Wartezeit | Summe | CPU-Zeit | Summe |
|---|---|---|---|---|---|
100 |
Hosts mit Checkmk-Agent überwacht (normal schnell) |
2 s |
200 s |
0,3 s |
30 s |
10 |
Hosts mit Checkmk-Agent überwacht (langsam) |
15 s |
150 s |
2 s |
20 s |
20 |
SNMP-Geräte (ältere Hardware, nicht einmal besonders langsam) |
10 s |
200 s |
1 s |
20 s |
5 |
Hosts ohne Agent, nur mit Spezialagent überwacht |
5 s |
25 s |
2 s |
10 s |
2 |
Sehr aufwendige Spezialagenten (bspw. Cloud-Dienste) |
25 s |
50 s |
5 s |
10 s |
Gesamtsumme |
625 s |
90 s |
Auf diese Tabelle werden wir im weiteren Verlauf dieses Artikels noch einige Male — bei der Berechnung der Checker und Fetcher und der gleichzeitigen Nagios-Checks — Bezug nehmen.
Da eine Minute nur 60 Sekunden hat, resultiert aus der Tabelle, dass wenigstens 11 parallele Prozesse benötigt werden, die nur warten. Zwischen 330 und 1100 MB RAM sind in dieser Zeit zwar belegt, werden aber nicht sinnvoll genutzt. Offensichtlich ist, dass bereits ein Tuning der langsamsten Hosts positive Auswirkungen auf die Performance Ihrer Checkmk-Instanz haben kann.
Auf die CPU-Zeit wollen wir an dieser Stelle noch nicht eingehen. Da aber andere Prozesse und der Overhead für die Erstellung von Prozessen noch nicht berücksichtigt sind, ergibt eine grobe Schätzung, dass zwei CPU-Kerne hier nicht reichen werden. Auf drei Kernen sollte ein brauchbarer Betrieb möglich sein und auf vier Kernen dürfte noch Luft für die Aufnahme weiterer Hosts bleiben.
Mögliche Maßnahmen zur Optimierung der Wartezeiten sind:
Asynchrone Ausführung von Plugins
Identifizieren Sie besonders langsame Agentenplugins und stellen Sie diese auf asynchrone Ausführung um.
Erhöhung der Check-Intervalle
Bei einigen SNMP-Geräten und vielen APIs, auf die mit Spezialagenten zugegriffen wird, liegt das tatsächliche Aktualisierungsintervall über dem regulären Check-Intervall. In solchen Fällen kann das Check-Intervall angehoben werden, ohne dass sich die Sichtbarkeit verschlechtert.
Umstellung auf Push-Modus
In Checkmk Ultimate steht der Push-Modus für Agenten zur Verfügung.
Wird dieser genutzt, führt der Agent erst seine Plugins aus und überträgt dann die gesamte Agentenausgabe an den Server.
Dort wird sie im temporären Dateisystem abgelegt, von wo sie in Sekundenbruchteilen eingelesen wird.
Effektiv kann die Wartezeit in der obigen Tabelle dann mit 0 angesetzt werden.
In Editionen ohne Push-Modus können Sie selbst für Optimierungen sorgen, indem Sie die Agentenausgabe per Cronjob im gewünschten Intervall zunächst in eine Datei schreiben und dann zum Checkmk-Server übertragen.
Dort lesen Sie die Agentenausgabe mit einem Datenquellprogramm ein, das ein simples cat des Dateiinhaltes macht.
Das einfachst mögliche Skript, das die Agentenausgabe ablegt und zum Server hoch lädt, könnte so aussehen:
#!/bin/bash
cmk-agent-ctl dump > /tmp/${HOSTNAME}.txt
scp /tmp/${HOSTNAME}.txt mysite@myserver.test:/tmp/communitypush/3. Tuning des Checkmk Micro Core (CMC)
Den Konzepten des CMC in
Checkmk Pro und
Checkmk Ultimate widmen wir einen eigenen Artikel, in diesem können Sie Architekturentscheidungen wie die starke Modularisierung nach Aufgaben wie das Einholen und die Auswertung von Daten nachlesen.
Werfen Sie zunächst einen Blick in die Analyse der Checkmk-Konfiguration:
Diese statische Analyse weist direkt darauf hin, wenn Einstellungen sehr weit von unseren Empfehlungen abweichen, was zukünftig zu Problemen führen könnte.
Um immer im Blick zu haben, wie sich die aktuellen Performance-Einstellungen auf den gegenwärtigen Betrieb auswirken, sollten Sie in der Checkmk-GUI das Snapin Overview aktiviert haben. Hier interessieren insbesondere Stale Services. Diese Services mit veralteten Daten können auf zwei Dinge hinweisen: Entweder liefert ein Agentenplugin keine (auswertbaren) Daten oder Checkmk kommt mit dem Einholen oder der Auswertung von Monitoring-Daten nicht hinterher. Ein Klick auf die Zahl der Stale Services bringt Sie direkt zu einer Liste, welche bei der Beurteilung hilft, um welche Art es sich im Einzelfall handelt.

Ein weiteres sinnvolles Snapin ist Core statistics: Es zeigt Check-Raten, Latenzen und die Auslastung relevanter Prozesse.

Wollen Sie einen Einblick in diese Performance-Werte über die Zeit, werfen Sie einen Blick in die Metriken des Services OMD mysite performance. Hier sehen Sie insbesondere in der Metrik Helper usage schnell, wie sich vorgenommene Änderungen auf Leistung und Auslastung auswirken.

Die in den folgenden Abschnitten vorgestellten Einstellungen nehmen Sie in Setup > Global settings im Abschnitt Monitoring core vor.
3.1. Zahl der Checker
Checker sind die Hilfsprozesse, die Monitoring-Daten verarbeiten, bevor diese in den Monitoring-Kern geschrieben werden. Ihr Job ist praktisch nur CPU-lastig: Zu verarbeitende Daten liegen meist bereits im Arbeitsspeicher, weshalb kein auf I/O wartender Prozess ausgelagert werden muss.
Die Auslastung der Checker hängt sehr stark von der Komplexität der ausgeführten Check-Plugins und der Menge der jeweils verarbeiteten Daten ab. Exakte Berechnungsgrundlagen sind daher schwer zu nennen. Im Idealfall haben Sie per Livestatus eine Liste der CPU-Zeiten erstellt und diese aufsummiert. In diesem Fall müssen Sie nur das Ergebnis durch 60 teilen (das reguläre Check-Intervall) und zunächst grob verdoppeln.
Wenn Sie nicht gerechnet haben, sondern lieber schätzen und optimieren: Auf aktueller Hardware kann ein Checker meist eine mittlere vierstellige bis deutlich fünfstellige Zahl von Checks bedienen. Eine grobe Kalkulation der Zahl der Checker kann daher zunächst einen Checker pro 5000 Services vorsehen.
Gehen Sie nicht unter zwei Checker und nie über die Zahl der physikalischen Prozessorkerne. |
Da Checker ihre Konfiguration im Arbeitsspeicher halten müssen und die Prozessgröße daher einige hundert Megabytes betragen kann, sollten Sie die Auslastung prüfen und die Zahl der Checker alsbald wieder in einen Bereich reduzieren, in dem die Auslastung um 50 % liegt. Von dieser Auslastung ausgehend können Sie unter Beobachtung von Latenzen (insbesondere nach einem Neustart der Checkmk-Instanz) und Lastspitzen die Zahl der Checker weiter reduzieren (oder weitere Services ins Monitoring aufnehmen), bis die Auslastung um 80 % liegt.
Wahrscheinlich ahnen Sie es bereits: Die Auslastung der Checker und der nachfolgend beschriebenen Fetcher muss irgendwie zusammen passen. Sind zu viele Fetcher konfiguriert, aber wenige Checker aktiv, entsteht ein Flaschenhals bei der Verarbeitung eingeholter Monitoring-Daten nach Neustarts, RAM wird unnötig durch Fetcher und Monitoring-Daten gebunden. Umgekehrt langweilen sich zu viele Checker nur und blockieren wertvollen Arbeitsspeicher. Streben Sie daher ähnliche Auslastungswerte an. |
3.2. Zahl der Fetcher
Fetcher sind die Hilfsprozesse, die die Agentenausgabe einholen, Spezialagenten starten und SNMP-Geräte abfragen. Die Bestimmung ihrer Zahl ist etwas aufwendiger als die der Checker. Pauschale Aussagen zur Zahl können nicht getroffen werden, zu unterschiedlich sind die Anforderungen verschiedener Monitoring-Umgebungen.
Im Kontext der Tabelle der Agentenausführung haben wir bereits angedeutet, dass Sie aus der Wartezeit auf Agenten recht gut die Zahl der benötigten Fetcher bestimmen können. Neben dieser eher theoretischen Herangehensweise können Sie auch die aktuelle Auslastung identifizieren, und die Zahl der Fetcher auf die aktuelle Auslastungssituation optimieren.
In der Praxis werden Sie beide Wege miteinander kombinieren wollen: Kalkulation und Optimierung.
Für ein initiales Setup sollten Sie um 50 % Fetcher-Auslastung anstreben. Bei dem oben gezeigten Beispiel wären Sie mit elf benötigten, aber nur 13 vorhandenen Fetchern deutlich über 80 % Auslastung. Hier böte es sich also an, zunächst die Zahl der Fetcher in den Bereich von etwa 20 zu erhöhen. Feedback in der Praxis liefert Ihnen das erwähnte Snapin Core statistics. Ergeben Ihre Berechnungen nur eine sehr kleine Zahl benötigter Fetcher, gehen Sie nicht unter drei.
Auch für Fetcher gilt langfristig: Von dieser Auslastung ausgehend können Sie unter Beobachtung von Latenzen (insbesondere nach einem Neustart der Checkmk-Instanz), dem Verhalten bei Netzwerkproblemen und Lastspitzen die Zahl der Fetcher weiter reduzieren (oder weitere Services ins Monitoring aufnehmen). Fetcher sind jedoch empfindlicher gegenüber externen Faktoren als Checker: Steigen Netzwerklatenzen oder es treten Paketverluste auf, wird die Fetcher-Auslastung deutlich steigen. Eine Obergrenze von 75–80 % sollten Sie daher nur bei einem sehr zuverlässigen Netz anstreben.
3.3. Aktive Checks
Für die Ausführung von aktiven Checks sind die Active check helpers genannten Hilfsprozesse zuständig.
Die Standardeinstellung für aktive Checks des CMC liegt bei maximal fünf gleichzeitigen.
Bei der Abschätzung hilft wieder der Blick in die Hitliste Monitor > History > Service check durations.
Hier werden Sie sehen, dass der (standardmäßig einmal pro Tag ausgeführte) Inventur-Check auch einmal eine Minute benötigen kann, ein check_cert oft in ein paar hundert Millisekunden fertig ist und die Werte bei check_httpv2 — abhängig von der Performance des überprüften Endpunktes — erheblich schwanken.
Letztlich können Sie eine Rechnung wie oben anstellen — bei fünf Active check helpers stehen pro Intervall 300 Sekunden zur Verfügung.
Oder Sie werfen zuerst einen Blick in den Service OMD mysite performance, konkret in die Metrik Helper usage und dort die Graph-Linie Active check helper usage.
Für die Berechnung der Zahl gilt wie bei den Fetchern: Gehen Sie nicht unter drei und streben Sie in größeren Umgebungen eine initiale Auslastung um 50 % an, die Sie später langsam erhöhen können.
3.4. Verhalten bei Neustarts
Eine Besonderheit des CMC ist, dass bei Änderungen an der Konfiguration nicht der ganze Monitoring-Kern neu gestartet werden muss. Der CMC kann eine neue Konfiguration während des Betriebs einlesen und arbeitet dann nach Sekundenbruchteilen weiter. Die Einstellungen für einen echten Neustart des Kerns sind daher eher bei Updates und Reboots des Servers relevant.
Hier sehen die Standardeinstellungen 150 Millisekunden Wartezeit zwischen aktiven Checks und 1200 Millisekunden zwischen dem Einholen der Agentenausgabe vor. Das ist weit entspannter als der Standardwert der Fetcher sonst zulässt. Grund ist die Erwartung, dass während des Neustarts des Servers auch andere Dienste noch hochfahren. Bei großzügig dimensionierten Servern mit vielen Hosts im Monitoring bedeutet dies möglicherweise, dass bereits wenige Minuten nach dem Neustart zwar die Last niedrig ist, aber Checkmk noch lange nicht alle Services aktualisiert hat.
Vorausgesetzt, die Zahl der Fetcher und Checker ist bereits optimiert, können Sie in solchen Fällen diese Intervalle deutlich senken.
4. Tuning des Nagios Cores
Der von Checkmk Community verwendete Nagios-Kern ist recht robust, hat aber Nachteile bei der Ausführung aktiver Checks.
Für jede Ausführung eines aktiven Checks startet Nagios einen Kindprozess.
Der Start dieser Kindprozesse erfolgt sequentiell, die eigentliche Ausführung kann parallel erfolgen.
Das Geheimnis des Tunings von Nagios liegt daher darin, diese Forks in Zahl und Abstand optimal zu steuern.
Die in den nächsten Abschnitten erklärten Einstellungen können Sie in der Datei ~/etc/nagios/nagios.d/timing.cfg vornehmen.
In dieser Datei und in ~/etc/nagios/nagios.d/tuning.cfg finden Sie auch weitere — weniger relevante — Konfigurationsmöglichkeiten.
Nach jeder Änderung ist es erforderlich, mittels cmk -R die Konfiguration neu zu erstellen und den Kern neu zu starten.
Allerdings kann es zusätzlich erforderlich sein, Parameter des Linux-Kernels zu ändern. Grund dafür ist, dass Nagios viel Speicher anfordert, den er nie benutzt. Prinzipiell erlaubt Linux, dass alle laufenden Prozesse in der Summe mehr Speicher angefordert haben, als vorhanden. Die Standardeinstellung des Kernels ist hier jedoch sehr konservativ. Anpassungen erklärt der folgende Abschnitt Kernel-Tuning.
4.1. Forks vermeiden
Bevor Sie Forks optimieren, sollten Sie Forks nach Möglichkeit vermeiden. Bedenken Sie, dass ein Aufruf des Services Check_MK, welcher die Agentenausgabe einholt — und dann zig Check-Ergebnisse als passive Checks direkt an den Monitoring-Kern übergibt — denselben Overhead bei Prozesserstellung und Übergabe der Ergebnisse hat wie ein simpler aktiver Check, der genau einen Netzwerkdienst überwacht. Daher ist es sinnvoll, die Zahl der aktiven Checks nach Möglichkeit zu reduzieren. Mögliche Beispiele sind:
Sie wollen MySQL- oder MariaDB-Datenbanken überwachen? Anstatt den Datenbank-Port per Firewall für den Checkmk-Server freizugeben und einen aktiven Check zu benutzen, installieren Sie besser ein Agentenplugin.
Sie wollen sicherstellen, dass SMTP-Versand funktioniert, weil auf Ihren Mail-Servern immer mal wieder der SASL-Authentifizierungs-Daemon abstürzt? Klar,
check_smtpist schnell konfiguriert, aber diesen aktiven Check lokal auf den überwachten Hosts mit MRPE wie ein Agentenplugin ausführen zu lassen, ist performanter.Sie haben die Wahl zwischen einem aktiven Check, um Daten zu Hosts einzuholen oder einem Spezialagenten, der Piggyback-Daten für viele Hosts erzeugt? Wenn mit einem einzigen Start eines Python-Interpreters Daten für Dutzende Hosts eingeholt werden, sollte die Entscheidung klar für den Spezialagenten fallen — selbst, wenn die aktiven Checks in einer performanteren Programmiersprache bereitgestellt werden.
4.2. Maximale Zahl gleichzeitiger Checks
In der Standardkonfiguration sind beliebig viele parallele Checks möglich. Diese Einstellung funktioniert bei niedriger Last von sehr kleinen bis sehr großen Systemen. Allerdings lohnt es sich, die Zahl konsequent auf das eigene Monitoring anzupassen und so Speicherauslastung und CPU-Nutzung in ein bestmögliches Verhältnis zu bringen.
Möglicherweise ermitteln Sie mit den Berechnungsgrundlagen und Optimierungsvorschlägen in diesem Abschnitt Zahlen, die Anpassungen an der Konfiguration des Linux-Kernels erfordern, um wirksam zu sein. Lesen Sie daher diesen und den nächsten Abschnitt Kernel-Tuning durch, bevor Sie Änderungen vornehmen. |
# MAXIMUM CONCURRENT SERVICE CHECKS
# This option allows you to specify the maximum number of
# service checks that can be run in parallel at any given time.
# Specifying a value of 1 for this variable essentially prevents
# any service checks from being parallelized. A value of 0
# will not restrict the number of concurrent checks that are
# being executed.
max_concurrent_checks=0Für die theoretische Berechnung des Wertes teilen Sie die gesamte Ausführungszeit der Tabelle oben durch das Check-Intervall (Standard 60 Sekunden) und schlagen noch einmal 30 bis 50 % oben drauf. Bei der oben errechneten Gesamtzeit von 715 Sekunden, wäre demnach ein Wert zwischen 16 und 18 ein passabler Startpunkt, von dem aus Sie weiter optimieren können.
Sollen nach dem Start des Kerns möglichst viele Services möglichst schnell wieder aktuell sein, muss ein Wert gefunden werden, der zwei Dinge sicherstellt:
Es werden genügend Daten eingesammelt, dass alle CPU-Kerne fast voll ausgelastet werden können.
Es werden nicht zu viele Daten eingesammelt, damit nicht Prozesse, die Daten verarbeiten, um CPU konkurrieren müssen.
Bei dem oben erwähnten Verhältnis von 8:1 (715 Sekunden insgesamt zu 90 Sekunden CPU-Zeit) würde bei vier Kernen ein Wert von 32 max_concurrent_checks beide Bedingungen erfüllen.
An dieser Stelle sollte klar sein: Liegt der erste berechnete Wert über dem zweiten, haben Sie höhere Anforderungen als Ihre Hardware erfüllen kann. In diesem Fall müssen Sie Checks reduzieren oder Check-Intervalle erhöhen. |
Wenn Sie nicht initial rechnen wollen, sondern eine Faustregel für die Zahl der max_concurrent_checks suchen:
Starten Sie — nach Gefühl — mit einem Wert zwischen der zwei- und vierfachen Zahl der CPU-Kerne und optimieren Sie von dort aus.
Wenn Sie auch gut fünf Minuten nach dem Neustart des Monitoring-Kerns noch Services haben, die Stale sind, müssen Sie die max_concurrent_checks erhöhen.
Umgekehrt gilt: Sind bereits nach weniger als einer Minute keine Services mehr Stale, halten Sie mit htop danach Ausschau, ob am Anfang eines Check-Intervalls Spitzen auftreten.
Wir empfehlen bei htop, mit der Taste U (User) die Anzeige auf den Instanzbenutzer zu beschränken und dann mit T (Tree) in die Baumansicht zu wechseln.
Gegebenenfalls senken Sie die Zahl maximaler gleichzeitiger Checks dann weiter.
Gehen Sie aber auch in kleinen Installationen nicht unter zwei.
Nun gilt es, auch sicherzustellen, dass Ihr Linux-Kern den Start all dieser Prozesse auch zulässt.
4.3. Kernel-Tuning
Nehmen Sie die hier beschriebenen Einstellungen nur vor, wenn Sie auch die Zahl der Apache-Prozesse auf einen sinnvollen Wert gesenkt haben und Sie |
Seit mehr als einem Vierteljahrhundert lässt der Linux-Kernel Memory Overcommitment zu. Das bedeutet, Linux erlaubt es Prozessen in der Summe mehr Arbeitsspeicher anzufordern, als ein Gerät physikalisch vorhanden hat. Die Standardeinstellung dabei ist, eine Heuristik zu verwenden, die aus in der Vergangenheit gestarteten und beendeten Prozessen versucht, auf zukünftige zu schließen. Allerdings ist bei Nagios das Verhältnis zwischen einfach mal so angefordertem („könnte ich vielleicht mal brauchen…“) und tatsächlich resident genutztem Speicher so groß, dass der Linux-Kernel oft ohne Not die Erzeugung neuer Prozesse verweigert.
Sie müssen also ermitteln, ob der für Nagios-Prozesse benutzte virtuelle Speicher plausibel beim Linux-Kernel angefordert werden kann. Ist das nicht der Fall, müssen Sie Änderungen an den Einstellungen für das Memory Overcommitment vornehmen.
Berechnung des angeforderten Speichers
Wenn auf dem zu tunenden Server nur Checkmk läuft, können Sie aus den gesetzten maximalen Prozessen grob berechnen, wie viel Speicher tatsächlich resident genutzt wird.
Wir rechnen mit den eben ermittelten 18 max_concurrent_checks:
| Anzahl | Prozess | Speicher resident | virtuell | Summe resident | virtuell |
|---|---|---|---|---|---|
18 |
Nagios |
30 MB |
1000 MB |
540 MB |
18000 MB |
18 |
Python (für Check_MK) |
100 MB |
150 MB |
1800 MB |
2400 MB |
10 |
Apache |
250 MB |
500 MB |
2500 MB |
5000 MB |
Gesamtsumme |
4840 MB |
25400 MB |
Bei einem Server mit 8 GB RAM scheint es auch unter Berücksichtigung anderer Prozesse von Checkmk zumindest plausibel, dass Sie bei 4840 MB residenten Speichers auf keine harten Grenzen stoßen werden.
Aktuelle Overcommitment-Einstellung ermitteln
Ermitteln Sie zunächst die aktuelle Einstellung:
Der hier angezeigte Wert 0 zeigt, dass die heuristische Zuweisung aktiv ist.
Hat Ihre Berechnung einen virtuellen Speicherbedarf von weniger als dem Doppelten des vorhandenen Arbeitsspeichers ergeben, sind meist keine Anpassungen erforderlich.
Anpassungen durchführen
Unsere Berechnung hat jedoch mehr als das dreifache ergeben. Eine Anpassung ist also erforderlich. Die folgenden Einstellungen sind möglich:
| Einstellung | Auswirkung | Bemerkungen |
|---|---|---|
0 |
Eine Heuristik bestimmt, ob ein Prozess noch zu sehr viel virtuellen Speicher anfordern darf |
Standard |
1 |
Es findet keine Prüfung statt, solange überhaupt freier Speicher vorhanden ist, darf ein neuer Prozess beliebig vielen virtuellen anfordern |
kann gefährlich sein |
2 |
Innerhalb bestimmter Schranken, die Sie mit |
guter Kompromiss aus Sicherheit und Flexibilität |
Wenn Checkmk die einzige Anwendung auf Ihrem Server ist, können Sie die folgende sysctl-Einstellung vornehmen:
# Always accept each overcommit!
vm.overcommit_memory=1Aktivieren Sie die Einstellung:
Nun gilt es, die tatsächliche Speichernutzung zu beobachten und insbesondere herauszufinden, ob OOM-Konditionen auftreten.
Teilt sich Ihr Checkmk Ihren Server mit anderen Anwendungen, kann es sinnvoll sein, deren Speicherbedarf ähnlich zu ermitteln und Prozesszahlen ebenso zu limitieren — nur dann ist vm.overcommit_memory=1 sicher.
Ist dies nicht möglich, haben Sie die Möglichkeit, mit vm.overcommit_memory=2 harte Grenzen festzulegen:
# Setting to 2 means hard boundaries are respected:
vm.overcommit_memory=2
# Either specify as calculation ratio or fix value kilobytes
vm.overcommit_kbytes = 0
# The calculation is:
# CommitLimit = SwapTotal + vm.overcommit_ratio / 100 * MemTotal
# So, you'll most likely set this to something between 150 and 300
vm.overcommit_ratio = 504.4. Verhalten bei Neustarts
Hier gezeigte Einstellungen sind vor allem relevant, wenn Sie die max_concurrent_host_checks unlimitiert oder auf einen recht hohen Wert konfiguriert haben.
Standardmäßig versucht Nagios eine smarte Berechnung des Abstands, in dem Checks initial gestartet werden. Das kann aber zu Spitzen am Anfang der ersten Check-Intervalle führen, die auch viele Minuten nach dem Start der Checkmk-Instanz bestehen. In solchen Fällen können Sie initiale Checks künstlich über mehr als ein Check-Intervall verteilen. Oder aber, Sie wollen bereits deutlich unter einer Minute volle Sichtbarkeit erreichen, dann können Sie ein aggressives Startverhalten erzwingen.
# SERVICE INTER-CHECK DELAY METHOD
# This is the method that Nagios should use when initially
# "spreading out" service checks when it starts monitoring. The
# default is to use smart delay calculation, which will try to
# space all service checks out evenly to minimize CPU load.
# Using the dumb setting will cause all checks to be scheduled
# at the same time (with no delay between them)! This is not a
# good thing for production, but is useful when testing the
# parallelization functionality.
# n = None - don't use any delay between checks
# d = Use a "dumb" delay of 1 second between checks
# s = Use "smart" inter-check delay calculation
# x.xx = Use an inter-check delay of x.xx seconds
service_inter_check_delay_method=sAngenommen, Sie ermitteln bei den oben angenommenen 130 Hosts 400 aktive Checks (inclusive Check_MK), dann sorgt ein Wert von 0.15 dafür, dass diese exakt in das 60-Sekunden-Intervall passen.
Für einen sanfteren Start und besseres Spreading können Sie den Start auch über zwei oder drei Check-Intervalle verteilen.
Analog verhält es sich mit der Variable host_inter_check_delay_method, welche die gleiche Einstellung für Host-Checks vornimmt.
Hier ist die Rechnung einfach: ein Check pro Host.
Bei der oben genannten Zahl von 130 Hosts würde als sinnvoller Wert 0,4 Sekunden resultieren.
Wenn Sie die Zahl der max_concurrent_host_checks auf einen niedrigen Wert eingestellt haben, können Sie mit service_inter_check_delay_method=n erreichen, dass das initiale Scheduling in der maximalen Parallelität stattfindet.
4.5. Parallelisierung durch verteiltes Monitoring
Der eigentliche Nagios-Kern (Scheduler, Statusberechnung) läuft Single-Threaded, kann also nicht von Mehrkernprozessoren profitieren. Im Haupt-Thread passiert relativ viel und alles muss sequentiell stattfinden. Für Checkmk relevant ist:
Es wird das Scheduling vorgenommen.
Kindprozesse werden geforkt.
Der Reaper muss die Ergebnisse aktiver und passiver Checks aus dem Dateisystem einlesen.
Aus Zustandsänderungen muss der Bedarf von Benachrichtigungen ermittelt werden.
Bei Checkmk leisten die als aktive Checks gestarteten Python-Prozesse zur Einholung und Verarbeitung der Agentendaten die Hauptarbeit. Sie schreiben die Check-Ergebnisse in das Nagios-Spool-Verzeichnis, wo sie vom Reaper in Sekundenintervallen eingelesen werden.
Mögliche Flaschenhälse sind uns zwei bekannt:
Bei einer sehr hohen Zahl aktiver Checks kommt Nagios mit Forking nicht hinterher.
Wenn Checkmk sehr viele Check-Ergebnisse in das Nagios-Spool-Verzeichnis schreibt, schafft es der Reaper mitunter nicht, die Daten schnell genug einzulesen und zu verarbeiten.
Der erste genannte kann durchaus auf Instanzen auftreten, die ein hohes Verhältnis aktiver zu passiven Checks nutzen. Der zweite eher auf größer dimensionierter Hardware mit vielen Prozessorkernen und sehr vielen passiven Checks.
Mit dem Betrieb von Checkmk Community erfahrene Admins verteilen daher die Arbeit oft auf mehrere Monitoring-Kerne, indem sie auf einer physikalischen Maschine ein verteiltes Monitoring einrichten. Eine sinnvolle Obergrenze für solch ein verteiltes Monitoring ist in der Regel eine Checkmk-Instanz pro Prozessorkern.
