Wir hatten heute ein kleines Failover-Problem mit einer unserer HAProxy-VMs. Als wir uns damit befassten, fanden wir Folgendes:
26. Januar 07:41:45 haproxy2-Kernel: [226818.070059] __ratelimit: 10 Rückrufe unterdrückt 26. Januar 07:41:45 haproxy2-Kernel: [226818.070064] Nicht genügend Socket-Speicher 26. Januar 07:41:47 haproxy2-Kernel: [226819.560048] Nicht genügend Socket-Speicher 26. Januar 07:41:49 haproxy2-Kernel: [226822.030044] Nicht genügend Socket-Speicher
Was laut diesem Link anscheinend mit geringen Standardeinstellungen für zu tun hat net.ipv4.tcp_mem
. Deshalb haben wir sie gegenüber ihren Standardeinstellungen um das Vierfache erhöht (dies ist Ubuntu Server, nicht sicher, ob die Linux-Variante von Bedeutung ist):
Aktuelle Werte sind: 45984 61312 91968 Neue Werte sind: 183936 245248 367872
Danach wurde eine bizarre Fehlermeldung angezeigt:
26. Januar 08:18:49 haproxy1-Kernel: [2291.579726] Route-Hash-Kette zu lang! 26. Januar 08:18:49 haproxy1-Kernel: [2291.579732] Passen Sie Ihr secret_interval an!
Shh .. es ist ein Geheimnis !!
Dies hat offensichtlich damit zu tun, dass /proc/sys/net/ipv4/route/secret_interval
der Standardwert 600 ist und das periodische Leeren des Routen-Caches gesteuert wird
Das
secret_interval
weist den Kernel an, wie oft ALLE Routen-Hash-Einträge weggeblasen werden sollen, unabhängig davon, wie neu / alt sie sind. In unserer Umwelt ist das im Allgemeinen schlecht. Die CPU wird jedes Mal, wenn der Cache geleert wird, Tausende von Einträgen pro Sekunde neu erstellen. Wir haben dies jedoch so eingestellt, dass es einmal am Tag ausgeführt wird, um Speicherlecks in Schach zu halten (obwohl wir noch nie einen hatten).
Obwohl wir dies gerne reduzieren, erscheint es seltsam, den gesamten Routen-Cache in regelmäßigen Abständen zu löschen , anstatt einfach alte Werte schneller aus dem Routen-Cache zu entfernen.
Nach einigen Nachforschungen haben wir herausgefunden, /proc/sys/net/ipv4/route/gc_elasticity
welche Option besser geeignet ist, um die Größe der Routentabelle zu kontrollieren:
gc_elasticity
kann am besten als die durchschnittliche Bucket-Tiefe beschrieben werden, die der Kernel akzeptiert, bevor er beginnt, Routen-Hash-Einträge abzulaufen. Dies hilft, die Obergrenze der aktiven Routen beizubehalten.
Wir haben die Elastizität von 8 auf 4 angepasst, in der Hoffnung, dass sich der Routen-Cache selbst aggressiver beschneidet. Das secret_interval
fühlt sich für uns nicht richtig an. Aber es gibt eine Reihe von Einstellungen und es ist unklar, welche wirklich der richtige Weg sind, um hierher zu kommen.
- / proc / sys / net / ipv4 / route / gc_elasticity (8)
- / proc / sys / net / ipv4 / route / gc_interval (60)
- / proc / sys / net / ipv4 / route / gc_min_interval (0)
- / proc / sys / net / ipv4 / route / gc_timeout (300)
- / proc / sys / net / ipv4 / route / secret_interval (600)
- / proc / sys / net / ipv4 / route / gc_thresh (?)
- rhash_entries (Kernelparameter, Standard unbekannt?)
Wir wollen das Linux-Routing nicht verschlechtern , deshalb haben wir Angst, mit einigen dieser Einstellungen zu experimentieren.
Kann jemand raten, welche Routing-Parameter für eine HAProxy-Instanz mit hohem Datenverkehr am besten zu optimieren sind?