Server:Fehlermeldung "kernel: Neighbour table overflow"

Aus manitu Wiki
Wechseln zu: Navigation, Suche

Informationen

Die Fehlermeldung

kernel: Neighbour table overflow

zeigt an, dass der ARP-Cache des Kernels zu klein ist, um alle MAC-Adressen zu nicht gerouteten IP-Adressen zu speichern (zu cachen).

Der ARP-Cache (die neighbour table) des Linux Kernels

Der ARP-Cache des Linux Kernels (auch neighbour table genannt) speichert zu jeder IP-Adresse, die nicht geroutet wird (also in einem Subnetz liegt, das auf einer Netzwerkkarte des Servers konfiguriert ist), eine MAC-Adresse. Dies ist nötig, damit Datenpakete, die nicht zum Router geschickt werden, direkt via Ethernet-Frames übertragen werden können. Logischerweise wird auch die IP-Adresse des Routers (Gateways) auch im ARP-Cache gespeichert.

Müssen zum selben Zeitpunkt mehr IP-Adress-zu-MAC-Adress-Einträge vom Linux Kernel gecacht werden, als der ARP-Cache groß ist, muss der Kernel für jedes zu versendende Datenpaket einen ARP-Broadcast-Request im Ethernet verschicken, was zu erheblichen Performance-Einbußen und zu Beeinträchtigungen des gesamten Subnetzes führen kann.

Die Größe des ARP-Caches wird über drei sysctl-Variablen gesteuert:

  • bei IPv4
net.ipv4.neigh.default.gc_thresh1
net.ipv4.neigh.default.gc_thresh2
net.ipv4.neigh.default.gc_thresh3
  • bei IPv6
net.ipv6.neigh.default.gc_thresh1
net.ipv6.neigh.default.gc_thresh2
net.ipv6.neigh.default.gc_thresh3

Dabei bedeuten jeweils

  • gc_thresh1: Die minimale Anzahl an Einträgen im ARP-Cache. Der Aufräumprozess des Kernels wird solange keine Einträge aus dem ARP-Cache löschen, solange diese Zahl unterschritten ist.
  • gc_thresh2: Die "weiche" maximale Anzahl an Einträgen im ARP-Cache. Der Aufräumprozess des Kernels erlaubt 5 Sekunden lang so viele Einträge im ARP-Cache, anschließend beginnt er mit dem Entfernen der ältesten Einträge.
  • gc_thresh3: Die "harte" maximale Anzahl an Einträge im ARP-Cache. Der Aufräumprozess läuft permanent, wenn mehr als so viele Einträge im ARP-Cache vorhanden sind.

Die Standard-Werte sind

  • bei IPv4
net.ipv4.neigh.default.gc_thresh1 = 128
net.ipv4.neigh.default.gc_thresh2 = 512
net.ipv4.neigh.default.gc_thresh3 = 1024
  • bei IPv6
net.ipv6.neigh.default.gc_thresh1 = 128
net.ipv6.neigh.default.gc_thresh2 = 512
net.ipv6.neigh.default.gc_thresh3 = 1024

Diese Standard-Werte sind durchaus sinnvoll und in den meisten Fällen ausreichend. In besonderen Netzwerk-Setups kann es jedoch nötig sein, den ARP-Cache manuell zu vergrößern.

Beheben (ARP-Cache / neighbour table vergrößern)

Größe des ARP-Cache bestimmen (vergrößen, einstellen)

Bestimmen Sie als erstes sinnvolle Werte für die Größe Ihres ARP-Caches:

  • eine Möglichkeit ist es, die Standard-Werte zu verdoppeln und die Größe ggf. sukzessive anpassen, indem Sie beobachten, ob der ARP-Cache weiterhin zu klein ist
  • alternativ können Sie die aktuelle Anzahl an Einträgen über
    $ ip neigh show
    bzw.
    $ arp -n
    auslesen und die benötigte Größe danach abschätzen.

Wichtig: Sie sollten die Werte in keinem Fall unnötig groß wählen, da Sie hierdurch wertvollen RAM verlieren (dies ist auch bei Systemen mit mehreren GB RAM relevant!).

Es ist ratsam, die drei Variablen wie folgt aufeinander abzustimmen:

gc_thresh1 = 128/256/512/1024/...
gc_thresh2 = 2 * gc_thresh1
gc_thresh3 = 2 * gc_thresh2

Größe des ARP-Cache setzen/festlegen

Setzen Sie die entsprechenden sysctl-Variablen entweder für das laufende System oder dauerhaft via sysctl.conf.

Falls Sie mit sysctl-Variablen nicht vertraut sind, finden Sie hier weitere Informationen.