同一セグメント内の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