このブログはURLが変更になりました

新しいブログはこちら→ https://matsuu.hatenablog.com/

RHEL/CentOSでネットワークインタフェースの起動が遅い原因を調べてみた

RHELCentOSのネットワークインタフェースって静的IPアドレスを付与するときでもやたら起動が遅くないですか。
ネットワークインタフェースが2,3個程度なら大した問題ではないのですが、例えばVLANをたくさん食わせている場合などはやたら遅くて話にならんレベルです。

Bringing up loopback interface:                                         [  OK  ] ←loは早い
Bringing up interface eth0:                                             [  OK  ] ←遅い
Bringing up interface eth0.1:                                           [  OK  ] ←VLANも遅い
Bringing up interface eth0.2:                                           [  OK  ] ←遅いよ
Bringing up interface eth0.3:                                           [  OK  ] ←遅いってば

ifupコマンドでかかる時間を確認したところ、1ネットワークインタフェースあたり約5秒。ネットワークインタフェースが20個あるとそれだけで1分40秒かかる計算。まじかよ。

# ifdown eth0
# time ifup eth0

real    0m5.029s
user    0m0.285s
sys     0m0.610s

ネットワークインタフェースの起動スクリプトを追ったところ、/etc/sysconfig/network-scripts/ifup-ethの以下の部分が原因でした。CentOS6は253行から257行あたり。CentOS5は267行から270行あたり。

# vi /etc/sysconfig/network-scripts/ifup-eth
...
              [ "${REALDEVICE}" != "lo" ] && \
              if ! /sbin/arping -q -c 2 -w 3 -D -I ${REALDEVICE} ${ipaddr[$idx]} ; then
                  net_log $"Error, some other host already uses address ${ipaddr[$idx]}."
                  exit 1
              fi

このarpingで約4秒待機してる!!なんじゃこりゃ。

arpingについて

arpingはARPリクエストを送信するコマンドで、-Dオプションは重複チェックを行うオプション。

$ man arping
ARPING(8)              System Manager’s Manual: iputils              ARPING(8)

NAME
       arping - send ARP REQUEST to a neighbour host

SYNOPSIS
       arping  [ -AbDfhqUV]  [ -c count]  [ -w deadline]  [ -s source]  -I inter-
       face destination

DESCRIPTION
       Ping destination on device interface by ARP packets, using source  address
       source.

OPTIONS
(中略)
       -D     Duplicate   address  detection  mode  (DAD).  See  RFC2131,  4.4.1.
              Returns 0, if DAD succeeded i.e. no replies are received

設定しようとしたIPアドレスが既に使われているかを調べているわけですが、有線LANで接続されたサーバ間であればチェックは1回だけ十分だと思います。

@@ -251,7 +251,7 @@
 
         if ! LC_ALL=C ip addr ls ${REALDEVICE} | LC_ALL=C grep -q "${ipaddr[$idx]}/${prefix[$idx]}" ; then
             [ "${REALDEVICE}" != "lo" ] && \
-            if ! /sbin/arping -q -c 2 -w 3 -D -I ${REALDEVICE} ${ipaddr[$idx]} ; then
+            if ! /sbin/arping -q -c 1 -D -I ${REALDEVICE} ${ipaddr[$idx]} ; then
                 net_log $"Error, some other host already uses address ${ipaddr[$idx]}."
                 exit 1
             fi

これで、2秒弱にまで短縮されました。やったね。

# time ifup eth0

real    0m1.810s
user    0m0.172s
sys     0m0.487s

または、IPアドレスが重複しないことが保証できるのであれば、該当部分をコメントにしてしまっても良いと思います。その場合は1秒を切ります。

まとめ