【メモ】”kernel: Neighbour table overflow.”への対処法

【メモ】”kernel: Neighbour table overflow.”への対処法 はてなブックマーク - 【メモ】”kernel: Neighbour table overflow.”への対処法


同一セグメント内のIPアドレス(正確にはarp queue)が 1024 を越えたときのメモ。

◆事象

先日、とある環境下にある Linux サーバ(RHEL5)で、bash上でコマンドを叩くと「利用可能な空きバッファがありません」や「No buffer space available」が表示される現象に遭遇。

単純に SSH で接続したいだけなのに

# ssh -l zembutsu 172.17.252.1
ssh: connect to host 172.17.252.1 port 22: No buffer space available

と、表示されたり、単純に crul を実行したいだけなのに、

$ /usr/bin/curl http://172.17.252.3
curl: (7) Failed to connect to 172.17.252.3: 利用可能な空きバッファがありません

のような表示が。

dmesg を実行すると、

Neighbour table overflow.
Neighbour table overflow.
Neighbour table overflow.

こんなメッセージが山のように。

/var/log/messages の、kernel の出力を確認すると、

Mar 11 04:10:22 sv kernel: Neighbour table overflow.
Mar 11 04:11:49 sv last message repeated 13 times
Mar 11 04:12:15 sv kernel: Neighbour table overflow.

同様のエラーが大量に吐かれていました。

◆対処法

# echo 512 > /proc/sys/net/ipv4/neigh/default/gc_thresh1
# echo 2048 > /proc/sys/net/ipv4/neigh/default/gc_thresh2
# echo 4096 > /proc/sys/net/ipv4/neigh/default/gc_thresh3

これを実行すると、即時解消。恒常的対策として、/etc/sysctl.conf に以下エントリを追加。

net.ipv4.neigh.default.gc_thresh1 = 512
net.ipv4.neigh.default.gc_thresh2 = 2048
net.ipv4.neigh.default.gc_thresh3 = 4096

◆原因

arp キューの大きさが、既定値を超えてしまったのが原因。

$ /sbin/ip neigh show | wc
 179    1024    9582

普段は上のとおり、そんなに多くないはずだが、先のエラーが出ていた環境では、1024を突破していたようだ。

arp_queue – every neighbour has a small arp queue of itself. – There can be only 3 elements by default in an arp_queue. – This is configurable:/proc/sys/net/ipv4/neigh/default/unres_qlen struct neigh_table

とのこと。

参照
neighboring subsystem | The Linux Foundation
http://www.linuxfoundation.org/collaborate/workgroups/networking/neighboringsubsystem
linuxman – Neighbour table overflow
http://linuxman.wikispaces.com/Neighbour+table+overflow
Neighbour table overflow
http://xoops.fens.net/modules/wiki/?Linux%2FMemo%2Fnetwork%2FNeighbour%20table%20overflow