Die nĂ€chste Konferenz HighLoad++ findet am 6. und 7. April 2020 in Sankt Petersburg statt. Details und Tickets . HighLoad++ Moskau 2018. Saal âMoskauâ. 9. November, 15:00. Thesen und .

* Monitoring â online und Analyse.
* HauptbeschrÀnkungen der ZABBIX-Plattform.
* Lösung zur Skalierung des Analyse-Speichers.
* Optimierung des ZABBIX-Servers.
* UI-Optimierung.
* Erfahrungen mit dem System bei Lasten ĂŒber 40k NVPS.
* Kurze Schlussfolgerungen.
Mikhail Makurov (im Folgenden â MM): â Hallo zusammen!
Maxim Tschernizow (im Folgenden â MT): â Guten Tag!
MM: â Darf ich Maxim vorstellen. Max ist ein talentierter Ingenieur, der beste Netzwerker, den ich kenne. Maxim beschĂ€ftigt sich mit Netzwerken und Services, deren Entwicklung und Betrieb.

MT: â Ich möchte ĂŒber Mikhail erzĂ€hlen. Mikhail ist C-Entwickler. Er hat einige hochgradig belastete Lösungen zur Verarbeitung von Traffic fĂŒr unser Unternehmen geschrieben. Wir leben und arbeiten im Ural, in der Stadt der rauen MĂ€nner, Tscheljabinsk, in der Firma âIntersvyazâ. Unser Unternehmen ist Anbieter von Internet- und Kabelfernsehdiensten fĂŒr eine Million Menschen in 16 StĂ€dten.
MM: â Und es ist zu sagen, dass âIntersvyazâ viel mehr ist als nur ein Provider, es ist ein IT-Unternehmen. Die meisten unserer Lösungen werden durch unsere IT-Abteilung erstellt.
A: von Servern, die Traffic verarbeiten, bis hin zu Call-Centern und mobilen Anwendungen. In der IT-Abteilung arbeiten jetzt etwa 80 Personen mit sehr unterschiedlichen Kompetenzen.
Ăber Zabbix und seine Architektur
MT: â Jetzt werde ich versuchen, einen persönlichen Rekord aufzustellen und in einer Minute zu erklĂ€ren, was Zabbix (im Folgenden â âZabbixâ) ist.
âZabbixâ positioniert sich als ein Monitoring-System âout of the boxâ auf Unternehmensebene. Es bietet viele Funktionen, die das Leben erleichtern: ausgeklĂŒgelte Eskalationsregeln, API fĂŒr Integration, Gruppierung und automatische Erkennung von Hosts und Metriken. Zabbix hat sogenannte Skalierungsmittel â Proxys. Zabbix ist ein Open-Source-System.
Kurz zur Architektur. Man kann sagen, sie besteht aus drei Komponenten:

- Server. In C geschrieben. Mit einer ziemlich komplexen Verarbeitung und Ăbertragung von Informationen zwischen Threads. Alle Verarbeitungen erfolgen dort: vom Empfang bis zur Speicherung in der Datenbank.
- Alle Daten werden in einer Datenbank gespeichert. Zabbix unterstĂŒtzt MySQL, PostgreSQL und Oracle.
- Die Webschnittstelle ist in PHP geschrieben. Die meisten Systeme werden mit dem Apache-Server geliefert, arbeiten aber effizienter in Kombination mit nginx + php.
Heute möchten wir eine Geschichte aus dem Leben unseres Unternehmens erzĂ€hlen, die mit âZabbixâ verbunden ist...
Eine Geschichte aus dem Leben des Unternehmens âIntersvyazâ. Was haben wir und was brauchen wir?

Vor 5 oder 6 Monaten. Eines Tages nach der Arbeit...
MT: â Misha, hallo! Schön, dass ich dich erreicht habe â ich habe etwas zu besprechen. Wir hatten wieder Probleme mit der Ăberwachung. WĂ€hrend eines groĂen Ausfalls hat alles gehakt, und es gab keine Informationen ĂŒber den Zustand des Netzwerks. Leider passiert das schon zum wiederholten Mal. Ich brauche deine Hilfe. Lass uns sicherstellen, dass unsere Ăberwachung unter allen UmstĂ€nden funktioniert!
MM: â Aber lass uns zuerst synchronisieren. Ich habe da schon seit ein paar Jahren nicht mehr hineingeschaut. Soweit ich mich erinnere, haben wir vor etwa 8 Jahren Nagios aufgegeben und sind zu âZabbixâ gewechselt. Und jetzt haben wir anscheinend 6 leistungsstarke Server und etwa ein Dutzend Proxys. Verwirre ich mich nicht?
MT: â Fast. 15 Server, von denen einige virtuelle Maschinen sind. Das Wichtigste ist, dass uns das nicht hilft, wenn wir es am nötigsten brauchen. Bei einem Ausfall â die Server hĂ€ngen und man sieht nichts. Wir haben versucht, die Konfiguration zu optimieren, aber das hat keine merkliche Leistungssteigerung gebracht.
MM: â Verstanden. Hast du etwas untersucht, etwas aus der Diagnose gesammelt?
MT: â Das erste, womit man es zu tun hat, ist die DB. MySQL ist sowieso stĂ€ndig ausgelastet, wĂ€hrend es neue Metriken speichert, und wenn âZabbixâ anfĂ€ngt, eine Menge Ereignisse zu generieren â geht die Datenbank buchstĂ€blich fĂŒr mehrere Stunden in den Standby. Von der Optimierung der Konfiguration habe ich dir schon erzĂ€hlt, und in diesem Jahr haben wir die Hardware aktualisiert: Auf den Servern stehen ĂŒber einhundert Gigabyte RAM und Speicherarrays auf SSD-RAIDs â es macht keinen Sinn, es linear weiter zu vergröĂern. Was sollen wir tun?
MM: â Verstanden. TatsĂ€chlich ist MySQL eine LTP-Datenbank. Anscheinend ist sie nicht mehr fĂŒr die Speicherung von Archiven unserer MetrikgröĂe geeignet. Lass uns das klĂ€ren.
MT: â Lass es uns tun!
Integration von Zabbix und Clickhouse als Ergebnis eines Hackathons
Nach einiger Zeit erhielten wir interessante Daten:

Der gröĂte Teil des Raums in unserer Datenbank war mit dem Archiv von Metriken belegt und weniger als 1 % wurde fĂŒr Konfigurationen, Vorlagen und Einstellungen verwendet. Zu diesem Zeitpunkt hatten wir schon seit ĂŒber einem Jahr eine Big Data-Lösung auf Basis von Clickhouse in Betrieb. Der Weg, den wir einschlagen sollten, war fĂŒr uns offensichtlich. Beim diesjĂ€hrigen FrĂŒhlings-Hackathon entwickelte ich eine Integration von Zabbix mit Clickhouse fĂŒr den Server und das Frontend. Zu diesem Zeitpunkt unterstĂŒtzte Zabbix bereits ElasticSearch, und wir entschieden uns, diese zu vergleichen.

Vergleich Clickhouse und Elasticsearch
MM: â FĂŒr den Vergleich erzeugten wir eine Last, die der von Zabbix-Server entsprach, und beobachteten, wie sich die Systeme verhalten wĂŒrden. Wir schrieben Daten in Paketen von 1000 Zeilen und verwendeten CURL. Wir erwarteten im Voraus, dass Clickhouse fĂŒr das Lastprofil von Zabbix effizienter sein wĂŒrde. Die Ergebnisse ĂŒbertrafen sogar unsere Erwartungen:

Unter den gleichen Bedingungen schrieb Clickhouse dreimal so viele Daten wĂ€hrend der Tests. Beide Systeme konsumierten sehr effizient (geringe Ressourcennutzung), wenn sie Daten lasen. Aber ElasticSearch benötigte eine groĂe Menge an Prozessorleistung beim Schreiben:

Insgesamt ĂŒbertraf Clickhouse ElasticSearch erheblich in Bezug auf den CPU-Verbrauch und die Geschwindigkeit. Durch die Datenkompression benötigt Clickhouse 11-mal weniger Speicherplatz auf der Festplatte und fĂŒhrt etwa 30-mal weniger Festplattenoperationen durch:

MT: â Ja, die Arbeit mit dem Festplattensystem von Clickhouse ist sehr effizient umgesetzt. FĂŒr Datenbanken kann man riesige SATA-Festplatten verwenden und erreicht Schreibgeschwindigkeiten von Hunderttausenden von Zeilen pro Sekunde. Die SystemunterstĂŒtzung fĂŒr Sharding und Replikation ist "out of the box" verfĂŒgbar und es ist recht einfach, es einzurichten. Wir sind mit seinem Einsatz ĂŒber ein Jahr mehr als zufrieden.
Zur Ressourcenschonung kann Clickhouse neben der bestehenden Hauptdatenbank installiert werden, was eine Menge an Prozessorzeit und Festplattenoperationen spart. Wir haben das Archiv der Metriken auf bereits vorhandene Clickhouse-Cluster ĂŒbertragen:

Wir haben die Haupt-MySQL-Datenbank so stark entlastet, dass wir sie auf derselben Maschine mit dem Zabbix-Server zusammenfĂŒhren und auf einen dedizierten Server fĂŒr MySQL verzichten konnten.
Wie funktioniert Polling in Zabbix?
Vor 4 Monaten
MM: â Na, können wir die Probleme mit der Datenbank hinter uns lassen?
MT: Das ist genau richtig! Eine andere Aufgabe, die wir lösen mĂŒssen, ist die langsame Datensammlung. Jetzt sind all unsere 15 Proxy-Server mit SNMP- und Polling-Prozessen ĂŒberlastet. Und es gibt keine anderen Optionen, als immer neue Server hinzuzufĂŒgen.
MM: Perfekt. Aber erzÀhl mir zuerst, wie das Polling in Zabbix funktioniert?
MT: Kurz gesagt, es gibt 20 Metriktypen und eine Handvoll Möglichkeiten, diese zu erheben. Zabbix kann Daten entweder im Anfrage-Antwort-Modus sammeln oder neue Daten ĂŒber die Trapper-Schnittstelle abwarten.

Es ist erwÀhnenswert, dass diese Methode (Trapper) im Original-Zabbix die schnellste ist.
Es gibt Proxys zur Lastenverteilung:

Proxys können die gleichen Sammelfunktionen wie der Zabbix-Server ausfĂŒhren, indem sie Aufgaben von ihm erhalten und die gesammelten Metriken genau ĂŒber die Trapper-Schnittstelle zurĂŒcksenden. Dies ist die offiziell empfohlene Methode zur Lastenverteilung. Proxys sind auch nĂŒtzlich fĂŒr das Monitoring von remote Infrastruktur, die ĂŒber NAT oder eine langsame Verbindung arbeitet:

MM: Die Architektur ist also klar. Wir mĂŒssen uns die Quellcodes ansehen...
Ein paar Tage spÀter
Die Geschichte darĂŒber, wie nmap fping besiegt hat
MM: Es scheint, dass ich etwas gefunden habe.
MT: ErzÀhl!
MM: Ich habe festgestellt, dass Zabbix bei VerfĂŒgbarkeitsprĂŒfungen maximal 128 Hosts gleichzeitig ĂŒberprĂŒft. Ich habe versucht, diese Zahl auf 500 zu erhöhen und den Inter-Paket-Intervall in ihrem Ping zu entfernen â das hat die Leistung verdoppelt. Aber ich hĂ€tte gerne gröĂere Zahlen.
MT: In meiner Praxis muss ich manchmal die VerfĂŒgbarkeit von Tausenden von Hosts ĂŒberprĂŒfen, und ich habe nichts Schnelleres als nmap dafĂŒr gefunden. Ich bin sicher, dass dies der schnellste Weg ist. Lass es uns versuchen! Wir mĂŒssen die Anzahl der Hosts pro Iteration erheblich erhöhen.
MM: Ăber 500 prĂŒfen? 600?
MT: Mindestens ein paar Tausend.
MM: Okay. Das Wichtigste, was ich sagen wollte: Ich habe herausgefunden, dass das meiste Polling in Zabbix synchron erfolgt. Wir mĂŒssen es unbedingt auf asynchron umstellen. Dann können wir die Anzahl der von den Pollern gesammelten Metriken drastisch erhöhen, insbesondere wenn wir die Anzahl der Metriken pro Iteration erhöhen.
MT: Das klingt groĂartig! Und wann?
MM: Wie immer, gestern.
MT: Wir haben beide Versionen von fping und nmap verglichen:

Auf einer groĂen Anzahl von Hosts war nmap erwartungsgemÀà bis zu fĂŒnfmal effektiver. Da nmap lediglich die VerfĂŒgbarkeit und die Antwortzeiten ĂŒberprĂŒft, haben wir die VerlustzĂ€hlung auf Trigger verschoben und die ĂberprĂŒfungsintervalle erheblich verkĂŒrzt. Die optimale Anzahl an Hosts fĂŒr nmap haben wir bei etwa 4.000 pro Iteration festgestellt. Nmap ermöglichte es uns, die CPU-Kosten fĂŒr die ĂberprĂŒfungen der VerfĂŒgbarkeit um drei Viertel zu senken und das Intervall von 120 Sekunden auf 10 zu reduzieren.
Optimierung des Pollings
MM: â Dann haben wir uns mit den Pollern beschĂ€ftigt. HauptsĂ€chlich interessierte uns das SNMP-Monitoring und die Agenten. Im âZabbixâ erfolgt das Polling synchron, und es wurden spezielle MaĂnahmen ergriffen, um die Effizienz des Systems zu steigern. Im synchronen Modus fĂŒhrt die Unerreichbarkeit von Hosts zu einer erheblichen Verschlechterung des Polling. Es gibt ein ganzes System von ZustĂ€nden, spezielle Prozesse â sogenannte unerreichbare Poller, die nur mit unerreichbaren Hosts arbeiten:

Dies ist ein Kommentar, der die Zustandsmatrix demonstriert, die gesamte KomplexitĂ€t der Ăbergangssysteme, die erforderlich sind, damit das System effizient bleibt. DarĂŒber hinaus ist das synchrone Polling selbst recht langsam:

Genau deshalb konnten Tausende von Poller-Threads auf einem Dutzend Proxys nicht die benötigte Menge an Daten fĂŒr uns sammeln. Die asynchrone Implementierung löste nicht nur die Probleme mit der Anzahl der Threads, sondern vereinfachte auch das System von ZustĂ€nden unerreichbarer Hosts erheblich, da bei beliebiger Anzahl in einer Polling-Iteration die maximale Wartezeit 1 Timeout betrug:

ZusĂ€tzlich haben wir das Pollingsystem fĂŒr SNMP-Anfragen modifiziert. Das Problem ist, dass die meisten nicht gleichzeitig auf mehrere SNMP-Anfragen antworten können. Deshalb haben wir einen hybriden Modus geschaffen, bei dem das SNMP-Polling desselben Hosts asynchron durchgefĂŒhrt wird:

Dies geschieht fĂŒr eine ganze Gruppe von Hosts. Dieser Modus ist letztlich nicht langsamer als vollstĂ€ndig asynchron, da die Abfrage von 150 SNMP-Werten immer noch viel schneller ist als 1 Timeout.
Unsere Experimente haben gezeigt, dass die optimale Anzahl von Anfragen in einer Iteration etwa 8.000 beim SNMP-Polling betrÀgt. Insgesamt ermöglichte der Wechsel in den asynchronen Modus eine Steigerung der Polling-Leistung um das 200-Fache, um mehrere Hundertfache.
MT: Die erhaltenen Optimierungen des Pollings haben gezeigt, dass wir nicht nur alle Proxys loswerden können, sondern auch die Intervalle fĂŒr viele PrĂŒfungen verkĂŒrzen können, wĂ€hrend Proxys als Mittel zur Lastverteilung nicht mehr benötigt werden.
Vor etwa drei Monaten
Ăndere die Architektur â erhöhe die Last!
MM: â Nun, Max, ist es Zeit fĂŒr die Produktion? Ich brauche einen leistungsstarken Server und einen guten Ingenieur.
MT: â Gut, lass uns planen. Es ist höchste Zeit, von dem Stillstand von 5.000 Metriken pro Sekunde wegzukommen.
Der Morgen nach dem Upgrade
MT: â Misha, wir haben uns aktualisiert, aber bis zum Morgen sind wir wieder zurĂŒckgefallen... Rate, welche Geschwindigkeit wir erreichen konnten?
MM: â Höchstens 20.000.
MT: â Aha, 25! Leider sind wir genau da, wo wir angefangen haben.
MM: â Warum ist das so? Haben wir irgendeine Diagnose gemacht?
MT: â Ja, natĂŒrlich! Hier ist beispielsweise ein interessantes Top:

MM: â Lass uns mal schauen. Ich sehe, dass wir eine riesige Anzahl von Polling-Threads ausprobiert haben:

Aber gleichzeitig konnten wir das System nicht einmal zur HĂ€lfte auslasten:

Die Gesamtleistung ist recht gering, etwa 4.000 Metriken pro Sekunde:

Gibt es noch etwas?
MT: â Ja, strace von einem der Poller:

MM: â Hier sieht man klar, dass der Polling-Prozess auf 'Semaphore' wartet. Das sind Sperren:

MT: â UnverstĂ€ndlich.
MM: â Schau, das Ă€hnelt einer Situation, in der viele Threads versuchen, mit Ressourcen zu arbeiten, auf die gleichzeitig nur einer zugreifen kann. Dann können sie nur diesen Resource zeitlich aufteilen:

Die GesamtproduktivitÀt bei der Arbeit mit einer solchen Ressource ist auf die Geschwindigkeit eines Kerns begrenzt:

Eine solche Problematik kann auf zwei Arten gelöst werden.
Die Hardware der Maschine aufrĂŒsten, auf schnellere Kerne umsteigen:

Oder die Architektur und parallel die Last Àndern:

MT: â Ăbrigens, auf der Testmaschine verwenden wir weniger Kerne als auf der Produktionsmaschine, aber sie sind dafĂŒr etwa 1,5-mal schneller in der Taktfrequenz pro Kern!
MM: â Verstehst du? Wir mĂŒssen den Servercode ĂŒberprĂŒfen.
Der Datenfluss im Zabbix-Server
MT: â Um das zu verstehen, haben wir angefangen zu analysieren, wie die Daten innerhalb des 'Zabbix'-Servers ĂŒbertragen werden:

Tolle Grafik, oder? Lass uns Schritt fĂŒr Schritt durchgehen, um es mehr oder weniger zu klĂ€ren. Es gibt Threads und Dienste, die fĂŒr die Datensammlung verantwortlich sind:

Die gesammelten Metriken werden ĂŒber einen Socket an den Preprocessor-Manager ĂŒbergeben, wo sie in eine Warteschlange gespeichert werden:

Der 'Preprocessor-Manager' ĂŒbergibt die Daten an seine Worker, die die Vorverarbeitungsanweisungen ausfĂŒhren und sie ĂŒber denselben Socket zurĂŒckgeben:

Nach diesem Schritt speichert der Preprocessor-Manager sie im Verlauf-Cache:

Von dort holen sie sich die History-Synker, die viele Funktionen ĂŒbernehmen: zum Beispiel das Berechnen von Triggern, das FĂŒllen des Wert-Caches und, am wichtigsten, das Speichern von Metriken im Verlaufsspeicher. Insgesamt ist der Prozess komplex und ziemlich verwirrend.

MM: â Das erste, was wir festgestellt haben, ist, dass die meisten Threads um den sogenannten "Konfigurations-Cache" konkurrieren (ein Speicherbereich, in dem alle Serverkonfigurationen gespeichert sind). Insbesondere viele Sperren verursachen die Threads, die fĂŒr das Abrufen von Daten verantwortlich sind:

âŠda in der Konfiguration nicht nur die Metriken mit ihren Parametern gespeichert werden, sondern auch die Warteschlangen, aus denen die Poller Informationen darĂŒber entnehmen, was als nĂ€chstes zu tun ist. Wenn es viele Poller gibt und einer die Konfiguration sperrt, warten die anderen auf Anfragen:

Poller dĂŒrfen nicht in Konflikt geraten

Daher haben wir als Erstes die Warteschlange in 4 Teile geteilt und den Pollern unter sicheren Bedingungen erlaubt, diese Warteschlangen, diese Teile gleichzeitig zu sperren:

Dies beseitigte die Konkurrenz um den Konfigurations-Cache, und die Geschwindigkeit der Poller nahm erheblich zu. Aber dann erlebten wir, dass der Preprocessor-Manager begann, die Aufgabenwarteschlange anzusammeln:

Der Preprocessor-Manager muss in der Lage sein, PrioritÀten zu setzen
Dies geschah in FĂ€llen, in denen ihm die Leistung fehlte. Dann konnte er nur noch die Anfragen von den Datenbeschaffungsprozessen ansammeln und seinen Puffer stapeln, bis er den gesamten Speicher aufbrauchte und abstĂŒrzte:

Um dieses Problem zu lösen, haben wir einen zweiten Socket hinzugefĂŒgt, der speziell fĂŒr die Worker reserviert war:

Damit konnte der Preprocessor-Manager seine Arbeit priorisieren und im Falle einer PuffervergröĂerung die Aufgabe des Abbremsens des Abrufs ĂŒbernehmen, um den Workern die Möglichkeit zu geben, diesen Puffer abzuholen:

Dann stellten wir fest, dass einer der GrĂŒnde fĂŒr die Verzögerung die Worker selbst waren, da sie um einen fĂŒr ihre Arbeit völlig unwichtigen Ressourcen konkurrierten. Dieses Problem haben wir mit einem Bug-Fix behoben, und in den neuen Versionen von "Zabbix" ist es bereits gelöst:

Wir erhöhen die Anzahl der Sockets â wir erzielen Ergebnisse
Weiterhin wurde der Preprocessor-Manager zum Engpass, da dies ein einzelner Thread ist. Er stieà an die Geschwindigkeitsgrenze des Kerns, was eine maximale Geschwindigkeit von etwa 70.000 Metriken pro Sekunde ermöglichte:

Deshalb haben wir vier gemacht, mit vier Sets von Sockets, Arbeitern:

Und das hat es ermöglicht, die Geschwindigkeit auf etwa 130 Tausend Metriken zu steigern:

Die NichtlinearitÀt des Wachstums erklÀrt sich dadurch, dass Konkurrenz um den History-Cache entstand. Daran konkurrierten 4 Preprocess-Manager und History-Syncer. Zu diesem Zeitpunkt erhielten wir auf der Testmaschine etwa 130 Tausend Metriken pro Sekunde und nutzten sie zu etwa 95 % aus, was die CPU betrifft:

Vor etwa 2,5 Monaten
Der Verzicht auf die SNMP-Community erhöhte die NVPs um das Eineinhalbfache
MM: â Max, ich brauche eine neue Testmaschine! In die aktuelle passen wir nicht mehr hinein.
MT: â Was gibt es jetzt?
MM: â Jetzt â 130k NVPs und die CPU ist "in der Schonung".
MT: â Wow! Cool! Warte, ich habe zwei Fragen. Nach meinen Berechnungen liegt unser Bedarf bei etwa 15-20 Tausend Metriken pro Sekunde. Warum brauchen wir mehr?
MM: â Ich möchte die Sache bis zum Ende durchziehen. Ich möchte sehen, wie viel wir aus diesem System herausholen können.
MT: â Aber...
MM: â Aber das ist fĂŒr das GeschĂ€ft nutzlos.
MT: â Verstanden. Und die zweite Frage: Können wir das, was wir jetzt haben, selbststĂ€ndig ohne Hilfe von Entwicklern unterstĂŒtzen?
MM: â Ich glaube nicht. Die Ănderung der Arbeit mit dem Konfigurationscache ist ein Problem. Sie betrifft Ănderungen in den meisten Streams und ist ziemlich schwer zu unterstĂŒtzen. Wahrscheinlich wird es sehr schwierig sein, sie zu unterstĂŒtzen.
MT: â Dann mĂŒssen wir eine Alternative finden.
MM: â Es gibt eine solche Möglichkeit. Wir können auf schnelle Kerne umsteigen und gleichzeitig auf das neue Sperrsystem verzichten. Wir wĂŒrden trotzdem eine Leistung von 60-80 Tausend Metriken erhalten. Dabei können wir den gesamten ĂŒbrigen Code behalten. «ClickHouse», asynchrones Polling wird funktionieren. Und das wird leicht zu unterstĂŒtzen sein.
MT: â GroĂartig! Ich schlage vor, an dieser Stelle Schluss zu machen.
Nach der Optimierung des Serverteils konnten wir endlich den neuen Code in der Produktion starten. Wir verzichteten auf einen Teil der Ănderungen zugunsten des Wechsels zu einer Maschine mit schnellen Kernen und zur Minimierung der Ănderungen im Code. Wir haben auch die Konfiguration vereinfacht und wo möglich auf Makros in den Datenelementen verzichtet, da sie zusĂ€tzliche Sperren verursachen.

Zum Beispiel hat der Verzicht auf das hĂ€ufige in der Dokumentation und in Beispielen vorkommende Makro SNMP-Community in unserem Fall dazu gefĂŒhrt, dass die NVPs etwa 1,5 Mal schneller wurden.
Nach zwei Tagen in der Produktion
Wir entfernen die Pop-ups der Vorfallhistorie
MT: â Misha, wir nutzen das System seit zwei Tagen, und es funktioniert alles. Aber nur, wenn alles funktioniert! Wir hatten planmĂ€Ăige Arbeiten mit der Verlagerung eines ziemlich groĂen Netzwerksegments, und wir haben wieder manuell ĂŒberprĂŒft, was hochgefahren wurde und was nicht.
MM: â Das kann nicht sein! Wir haben alles 10 Mal ĂŒberprĂŒft. Der Server bearbeitet selbst die vollstĂ€ndige Nichterreichbarkeit des Netzwerks blitzschnell.
MT: â Ich verstehe alles: Server, Datenbank, top, austat, Logs â alles lĂ€uft schnell... Aber wir schauen uns die WeboberflĂ€che an, und da ist die CPU "im Leerlauf" auf dem Server und das hier:

MM: â Verstanden. Lass uns die WeboberflĂ€che anschauen. Wir haben festgestellt, dass in Situationen mit einer groĂen Anzahl aktiver VorfĂ€lle die meisten operativen Widgets sehr langsam arbeiteten:

Der Grund dafĂŒr war die Generierung von Popup-Fenstern mit der Historie der VorfĂ€lle, die fĂŒr jedes Element in der Liste erstellt werden. Daher haben wir auf die Generierung dieser Fenster verzichtet (wir haben 5 Zeilen im Code kommentiert), und das hat unsere Probleme gelöst.
Die Ladezeit der Widgets verkĂŒrzte sich selbst bei vollstĂ€ndiger Nichterreichbarkeit von mehreren Minuten auf fĂŒr uns akzeptable 10-15 Sekunden, und die Historie kann weiterhin mit einem Klick auf die Zeit angesehen werden:

Nach der Arbeit. Vor 2 Monaten
MT: â Misha, gehst du? Wir mĂŒssen reden.
MM: â Ich hatte nicht vor zu gehen. Ist wieder was mit Zabbix?
MT: â Nein, entspanne dich! Ich wollte nur sagen: Es funktioniert alles, danke! Ich lade dich auf ein Bier ein.
Zabbix ist effektiv
"Zabbix" ist ein ziemlich vielseitiges und umfangreiches System und Funktion. Es kann problemlos fĂŒr kleine Installationen "out of the box" verwendet werden, aber mit wachsenden Anforderungen muss es optimiert werden. FĂŒr die Speicherung eines groĂen Archivs von Metriken verwenden Sie eine geeignete Speicherlösung:
- Sie können die integrierten Funktionen in Form der Integration mit "Elasticsearch" oder den Export der Historie in Textdateien nutzen (verfĂŒgbar ab der vierten Version);
- Sie können auch von unserer Erfahrung und der Integration mit "ClickHouse" profitieren.
Um die Geschwindigkeit der Metrikenerfassung drastisch zu erhöhen, erfassen Sie diese mithilfe asynchroner Methoden und ĂŒbertragen Sie sie ĂŒber die Trapper-Schnittstelle an den "Zabbix"-Server; alternativ können Sie den Patch fĂŒr die AsynchronitĂ€t der Poller von "Zabbix" verwenden.
âZabbixâ ist in C geschrieben und sehr effizient. Einige enge architektonische Stellen ermöglichen es, die Leistung weiter zu steigern, und aus unserer Erfahrung erhalten wir ĂŒber 100.000 Metriken auf einer Einzelprozessormaschine.

Der besagte Zabbix-Patch
MM: â Ich möchte ein paar Punkte hinzufĂŒgen. Der gesamte aktuelle Bericht, alle Tests und Zahlen stammen aus der Konfiguration, die wir verwenden. Daraus erfassen wir derzeit etwa 20.000 Metriken pro Sekunde. Wenn Sie versuchen herauszufinden, ob das bei Ihnen funktionieren wird â Sie können vergleichen. Das, was heute vorgestellt wurde, ist auf GitHub als Patch verfĂŒgbar:

Der Patch beinhaltet:
- vollstĂ€ndige Integration mit âClickHouseâ (sowohl fĂŒr den âZabbixâ-Server als auch fĂŒr das Frontend);
- Lösungen fĂŒr Probleme mit dem Preprocessor-Manager;
- asynchrones Polling.
Der Patch ist mit allen Versionen 4 kompatibel, auch mit lts. Höchstwahrscheinlich wird er mit minimalen Ănderungen auch in Version 3.4 funktionieren.
Danke fĂŒr Ihre Aufmerksamkeit.
Fragen
Frage aus dem Publikum (im Folgenden - A): â Guten Tag! Können Sie mir bitte sagen, ob Sie PlĂ€ne fĂŒr eine intensive Zusammenarbeit mit dem Zabbix-Team haben oder umgekehrt, damit es kein Patch, sondern ein normales Verhalten von âZabbixâ wĂ€re?
MM: â Ja, einige Ănderungen werden wir unbedingt committen. Manche Dinge werden in dem Patch bleiben.
A: â Vielen Dank fĂŒr den groĂartigen Vortrag! Bitte sagen Sie, wird die UnterstĂŒtzung seitens âZabbixâ nach der Anwendung des Patches weiterhin bestehen, und wie wird die Aktualisierung auf höhere Versionen stattfinden? Wird es möglich sein, âZabbixâ nach Ihrem Patch auf 4.2, 5.0 zu aktualisieren?
MM: â Zum Thema UnterstĂŒtzung kann ich nichts sagen. Wenn ich im technischen Support von âZabbixâ wĂ€re, wĂŒrde ich vermutlich nein sagen, da es sich um fremden Code handelt. Was die Codebasis 4.2 angeht, so ist unsere Position die folgende: âWir werden mit der Zeit gehen und uns selbst auf die nĂ€chste Version aktualisieren.â Daher werden wir eine Zeit lang Patches fĂŒr aktualisierte Versionen bereitstellen. Ich habe bereits im Vortrag gesagt: Die Anzahl der Ănderungen zwischen den Versionen ist derzeit noch recht gering. Ich glaube, der Ăbergang von 3.4 auf 4 hat bei uns etwa 15 Minuten gedauert. Es hat sich etwas geĂ€ndert, aber nicht besonders Wichtiges.
A: â Das heiĂt, Sie planen, Ihren Patch zu unterstĂŒtzen, und man kann ihn bedenkenlos in der Produktion einsetzen, um kĂŒnftig auf irgendeine Weise Updates zu erhalten?
MM: â Wir empfehlen das nachdrĂŒcklich. Es löst uns sehr viele Probleme.
MT: â Noch einmal möchte ich betonen, dass die Ănderungen, die nichts mit der Architektur oder den Blockierungen, Warteschlangen zu tun haben, modular sind, sie befinden sich in separaten Modulen. Auch bei geringfĂŒgigen Ănderungen können sie relativ einfach verwaltet werden.
MM: â Wenn Sie an den Einzelheiten interessiert sind, verwendet âClickHouseâ die sogenannte Geschichtsbibliothek. Sie ist entkoppelt â eine Kopie der UnterstĂŒtzung von âElastixâ, also konfigurationsverĂ€nderbar. Polling Ă€ndert nur die Poller. Wir glauben, dass das lange funktionieren wird.
A: â Vielen Dank. Können Sie mir sagen, ob es eine Dokumentation zu den vorgenommenen Ănderungen gibt?

MM: â Die Dokumentation ist der Patch. Offensichtlich entstehen mit der EinfĂŒhrung von âClickHouseâ und neuen Pollertypen neue Konfigurationsoptionen. In dem Link aus der letzten Folie gibt es eine kurze Beschreibung, wie man es verwendet.
Zur Ersetzung von fping durch nmap
A: â Wie haben Sie das letztendlich umgesetzt? Können Sie es an konkreten Beispielen erklĂ€ren: haben Sie Strapper und ein externes Skript? Was prĂŒft letztendlich so schnell eine so groĂe Anzahl von Hosts? Wie beschaffen Sie diese Hosts? Muss man nmap diese irgendwie zufĂŒhren, woher bekommen, ablegen, etwas starten?..
MM: â Cool. Sehr gute Frage! Die Essenz ist folgende. Wir haben die Bibliothek (ICMP-Ping, ein Teil von âZabbixâ) fĂŒr die ICMP-PrĂŒfungen modifiziert, bei denen die Anzahl der Pakete auf eins (1) festgelegt ist, und der Code versucht, nmap zu verwenden. Das ist also die interne Arbeit von âZabbixâ geworden, die zu interner Arbeit des Pingers wurde. Daher ist keine Synchronisation oder Verwendung eines Trappers erforderlich. Das wurde bewusst so gemacht, um das System ganz zu lassen und sich nicht mit der Synchronisation zweier Basissysteme zu beschĂ€ftigen: was zu prĂŒfen, ĂŒber den Poller zu laden, und ob das Laden nicht kaputt gegangen ist?.. Das ist viel einfacher.
A: â Funktioniert das auch fĂŒr Proxys?
MM: â Ja, aber wir haben es nicht getestet. Der Polling-Code ist sowohl in âZabbixâ als auch im Server einheitlich. Es sollte funktionieren. Nochmals betont: Die Systemleistung ist so, dass wir keinen Proxy benötigen.
MT: â Die richtige Antwort auf die Frage ist folgende: âWarum brauchen Sie bei einem solchen System einen Proxy?â Nur wegen NAT oder um ĂŒber einen langsamen Kanal zu ĂŒberwachen oder so.
A: â Und verwenden Sie âZabbixâ als Alarmsystem, wenn ich es richtig verstanden habe? Oder sind die Grafiken (wo die Archivschicht ist) in ein anderes System, wie Grafana, gewandert? Oder nutzen Sie diese FunktionalitĂ€t nicht?
MM: â Ich möchte noch einmal betonen: Wir haben eine vollstĂ€ndige Integration vorgenommen. Wir speichern die Historie in âClickHouseâ, aber haben dabei das PHP-Frontend geĂ€ndert. Das PHP-Frontend greift auf âClickHouseâ zu und erstellt alle Grafiken von dort. Dabei haben wir, um ehrlich zu sein, einen Teil, der aus demselben âClickHouseâ, aus denselben Daten von âZabbixâ Daten in anderen grafischen Darstellungen generiert.
MT: â Darunter auch in âGrafanaâ.
Wie wurde die Entscheidung ĂŒber die Bereitstellung von Ressourcen getroffen?
A: â Teilen Sie bitte etwas ĂŒber die interne Vorgehensweise mit. Wie wurde entschieden, dass Ressourcen fĂŒr eine ernsthafte Ăberarbeitung des Produkts bereitgestellt werden mĂŒssen? Es sind schlieĂlich bestimmte Risiken damit verbunden. Und sagen Sie bitte im Kontext dessen, dass Sie beabsichtigen, neue Versionen zu unterstĂŒtzen: Wie rechtfertigt sich diese Entscheidung aus Sicht des Managements?
MM: â Anscheinend haben wir die dramatische Geschichte nicht sehr gut erzĂ€hlt. Wir befanden uns in einer Situation, in der etwas getan werden musste, und gingen im Wesentlichen zwei parallele Wege:
- Eine Gruppe kĂŒmmerte sich um die EinfĂŒhrung des Monitorings mit neuen Methoden: Monitoring als Service, ein standardmĂ€Ăiger Satz von Open-Source-Lösungen, die wir kombinieren und dann versuchen, den GeschĂ€ftsprozess zu Ă€ndern, um mit dem neuen Monitoringsystem zu arbeiten.
- Parallel dazu hatten wir einen enthusiastischen Programmierer, der sich damit beschÀftigte (und sich selbst wie ein Protagonist verhielt). Es stellte sich heraus, dass er allen anderen voraus war.
A: â Und wie groĂ ist das Team?
MT: â Es steht vor Ihnen.
A: â Das heiĂt, wie immer wird ein Passionierter benötigt?
MM: â Ich weiĂ nicht, was ein Passionierter ist.
A: â In diesem Fall sind Sie es anscheinend. Vielen Dank, Sie sind groĂartig.
MM: â Danke.
Ăber die Patches fĂŒr Zabbix
A: â Ist es möglich, Ihre Lösung zu adaptieren und zu patchen fĂŒr ein System, das Proxy verwendet (zum Beispiel in einigen verteilten Systemen); sagen wir fĂŒr die Poller, Proxys und teilweise fĂŒr den Preprocessor von Zabbix; und deren Interaktion? Ist es möglich, bestehende Entwicklungen zu optimieren, um mit einem System mit mehreren Proxys zu funktionieren?
MM: â Ich weiĂ, dass der Zabbix-Server mit Proxy gebaut wird (es wird kompiliert und der Code entsteht). Wir haben das nicht in der Produktion ĂŒberprĂŒft. Ich bin mir da nicht sicher, aber meines Erachtens wird der Preprocessor-Manager im Proxy nicht verwendet. Die Aufgabe des Proxys ist es, eine Sammlung von Metriken von Zabbix abzurufen, sie zu spollen (er speichert auĂerdem die Konfiguration, die lokale Datenbank) und sie dann zurĂŒck an den Zabbix-Server zu geben. Der Preprocessing wird dann vom Server durchgefĂŒhrt, wenn er sie erhĂ€lt.
Das Interesse an Proxys ist verstĂ€ndlich. Wir werden das prĂŒfen. Es ist ein interessantes Thema.
A: â Die Idee war die: Wenn man Poller patchen kann, kann man sie auch auf Proxys patchen und die Interaktion mit dem Server anpassen, wĂ€hrend der Preprocessor dafĂŒr nur auf dem Server angepasst wird.
MM: â Ich denke, es ist sogar einfacher. Sie nehmen den Code, wenden den Patch an, konfigurieren ihn dann so, wie Sie es brauchen â erstellen Proxys (zum Beispiel mit ODBC) und verteilen den gepatchten Code auf die Systeme. Wo nötig, erstellen Sie Proxys, wo nötig, den Server.
A: â Wahrscheinlich wird es nicht nötig sein, die Ăbertragung von Proxys zum Server zusĂ€tzlich zu patchen?
MT: â Nein, das ist standardmĂ€Ăig.
MM: â TatsĂ€chlich wurde eine der Ideen nicht erwĂ€hnt. Wir haben immer versucht, das Gleichgewicht zwischen einem IdeenĂŒberschuss und der Anzahl der Ănderungen, sowie der Wartungsfreundlichkeit zu wahren.

Ein wenig Werbung đ
Danke, dass Sie bei uns bleiben. Gefallen Ihnen unsere Artikel? Möchten Sie mehr interessante Inhalte sehen? UnterstĂŒtzen Sie uns, indem Sie eine Bestellung aufgeben oder uns Freunden empfehlen, , ein einzigartiges Ăquivalent zu Einsteigerservern, das wir fĂŒr Sie entwickelt haben: (es sind Optionen mit RAID1 und RAID10 bis zu 24 Kernen und bis zu 40GB DDR4 verfĂŒgbar).
Dell R730xd ist im Equinix Tier IV Rechenzentrum in Amsterdam doppelt so gĂŒnstig? Nur bei uns in den Niederlanden! Dell R420 â 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB â ab $99! Lesen Sie, wie
Quelle: habr.com
