Re hbstudy #4 での OpenVZ の話 (ARP response が遅い件について)
hbstudy #4 で id:fujya さんが OpenVZ についてお話されました。FreeBSD の jail 大好きっこだった自分も OpenVZ を使っているので、興味深く拝聴させていただきました。ありがとうございました。(スライドは Open VZ)。
その中で、
「venetを超えてrt_cacheにエントリを登録する時に遅延する」
というのが気になったので、少し調べてみました。
まず、手元の物理サーバから、イーサネットを経由して別サーバ上の OpenVZ コンテナ (xx.xx.xx.25) に ping を打ってみます。
$ sudo arp -d xx.xx.xx.25 $ sudo ip route flush cache $ ping xx.xx.xx.25 PING xx.xx.xx.25 (xx.xx.xx.25) 56(84) bytes of data. 64 bytes from xx.xx.xx.25: icmp_seq=1 ttl=64 time=132 ms 64 bytes from xx.xx.xx.25: icmp_seq=2 ttl=64 time=0.129 ms --- xx.xx.xx.25 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.129/66.333/132.538/66.205 ms $ sudo ip route flush cache $ ping xx.xx.xx.25 PING xx.xx.xx.25 (xx.xx.xx.25) 56(84) bytes of data. 64 bytes from xx.xx.xx.25: icmp_seq=1 ttl=64 time=0.132 ms 64 bytes from xx.xx.xx.25: icmp_seq=2 ttl=64 time=0.163 ms --- xx.xx.xx.25 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.132/0.147/0.163/0.019 ms $ sudo arp -d xx.xx.xx.25 $ ping xx.xx.xx.25 PING xx.xx.xx.25 (xx.xx.xx.25) 56(84) bytes of data. 64 bytes from xx.xx.xx.25: icmp_seq=1 ttl=64 time=763 ms 64 bytes from xx.xx.xx.25: icmp_seq=2 ttl=64 time=0.139 ms --- xx.xx.xx.25 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev = 0.139/381.978/763.817/381.839 ms $
ARP cache にエントリがない場合のみ遅延しているようです。そこで、arping を使って確認。
$ sudo arping -b -I eth0 -c 10 xx.xx.xx.25 ARPING xx.xx.xx.25 from xx.xx.xx220 eth0 Unicast reply from xx.xx.xx.25 [00:12:3F:xx:xx:xx] 368.549ms Unicast reply from xx.xx.xx.25 [00:12:3F:xx:xx:xx] 126.425ms Unicast reply from xx.xx.xx.25 [00:12:3F:xx:xx:xx] 698.251ms Unicast reply from xx.xx.xx.25 [00:12:3F:xx:xx:xx] 799.124ms Unicast reply from xx.xx.xx.25 [00:12:3F:xx:xx:xx] 116.990ms Sent 5 probes (5 broadcast(s)) Received 5 response(s)
やはり、原因は ARP broadcast へのレスポンスが遅いためです。
そこで、OpenVZ (のvenet) は linux カーネルのIPフォワードを使っているので、ARP パケットの無駄な転送を防ぐために、意図的な遅延を入れているのかもしれません。じゃあ arp_proxy をオンにしたらいいのかな... と思ったけど、うまくいかない。proxy_arp の設定が正しいのかどうかわからない... ってあたりであきらめた。
中途半端で恐縮ですが、とりあえず原因は routing cache じゃなく arp のレスポンスt遅延が原因なら、IIRC 定期的にパケットを流しておけば問題ないんじゃないかなーと思いました。