{ 2010.12.7 }

サービスは止まっていないのにネットワークエラーが・・・なぜ?

    はてなブックマーク - サービスは止まっていないのにネットワークエラーが・・・なぜ?
    このエントリーをはてなブックマークに追加

    奥さまの名前は CentOS、旦那さまの名前はしんちゃん。
    ごく普通のサーバに、ごく普通にインストールし、ごく普通の納品をしました。
    でも、ただひとつ違っていたのは、ifconfig を叩くと………エラーが発生していたのです!

    *・゜゚・*:.。..。.:*・゜゚・*:.。. (n‘∀‘)η

    はじめての人もそうでない人もはじめまして。 河野と申します。

    Advent Calendar はスタートの火蓋が切られたばかりにも関わらず、私だけが二週目に突入しました。
    マッハ号もかくやといったところです。

    さて、本日は「サービスは止まっていないのにネットワークエラーが増え続ける」という奇妙な問題を解決した際のお話を皆様にしたいと思います。

    尚、サーバはCentOS となります。

    エラーの増加

    サンプルに偏りがあるのを承知で言いますが「サービスは止まっていないのにネットワークエラーが増え続ける」。
    そういった事象はあまり無いのではないかと思われます。
    ネットワークにエラーがある場合は、サービスどころかネットワーク自体が疎通出来なくなる事が多いのではないでしょうか?

    ところが今回のエラーは以下のような特徴を持っていました。

    • リモートからサーバへのアクセスが可能
    • ローカルから外部へのアクセスが可能
    • パケットのエラーが増え続ける

    エラー発生当初、サービスに支障が出ていないので、今後の経過を見るという判断になりました。

    このサーバには Munin というサーバ動作ログを視覚的に閲覧することの出来るソフトウェアをインストールしていたのですが、見るたびにサーバのエラーは増えていきました。

    # ifconfig
    eth0      Link encap:Ethernet  HWaddr 00:03:0D:34:8F:AD
              inet addr:10.1.0.1  Bcast:10.255.255.255  Mask:255.0.0.0
              inet6 addr: fe80::203:dff:fe34:8fad/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:5505120 errors:869 dropped:0 overruns:0 frame:869
              TX packets:563000 errors:0 dropped:0 overruns:0 carrier:0
              collisions:30 txqueuelen:1000
              RX bytes:900322789 (858.6 MiB)  TX bytes:102707436 (97.9 MiB)
              Interrupt:209 Base address:0xd800

    ※ ↑は執筆時に仮想サーバにてエラーを発生させてみたものです

    問題の調査

    色々と調査した結果、Auto-Negotiation 機能に問題があるのではないかという結論に至りました。

    ethtool コマンドで eth0 を調査した結果 half-duplex(半二重)になっていたからです。

    # ethtool eth0
    Settings for eth0:
            Supported ports: [ TP MII ]
            Supported link modes:   10baseT/Half 10baseT/Full
                                    100baseT/Half 100baseT/Full
            Supports auto-negotiation: Yes
            Advertised link modes:  10baseT/Half 10baseT/Full
                                    100baseT/Half 100baseT/Full
            Advertised auto-negotiation: No
            Speed: 100Mb/s
            Duplex: Half
            Port: MII
            PHYAD: 1
            Transceiver: internal
            Auto-negotiation: off
            Supports Wake-on: pg
            Wake-on: d
            Current message level: 0x000000c5 (197)
            Link detected: yes

    このサーバの eth1 はバックアップ装置と直繋ぎしておりこちらの通信モードは full-duplex(全二重)に設定されています。

    この結果から eth0 と繋がれているスイッチが full-duplex 固定に設定されており Auto-Negotiation 設定時に通信モードを返さなかった為、デフォルトの半2重設定を行ったと考えられました。

    問題の解決

    そうと分かればサーバ側の eth0 の設定を full-duplex 固定にしてしまえばいいだけの話です。

    ローカル環境で確認後、本番で行なった変更は ifcfg-eth0 の最後に以下の一文を加えるだけ。

    # vim /etc/sysconfig/network-scripts/ifcfg-eth0
    ETHTOOL_OPTS="autoneg off speed 100 duplex full"

    但し、ネットワークリスタートする必要があります。

    ちなみに eth-tool コマンドでも設定可能です。

    ● eth0 の autonegotiation を off

    # ethtool -s eth0 autoneg off

    ● eth0 の duplex を full にする

    # ethtool -s eth0 duplex full

    こちらは再起動を行なうと設定が消えますので、再起動後も設定を反映する場合は上記のようにデバイスの設定ファイルに設定を記述してください。

    最後に

    今回一番困ったのは「利用者からは問題がないように見える」点です。
    無視するわけにもいかないが、無視できる範囲のエラーなので、システムを停止することが難しいサーバや、社内システムだと止めるほどでも無いかもしれません。

    今回のエラーはサーバを設置してすぐだったため、トラフィックが増えてエラーが無視できなくなってくる前に対応する事にしました。

    どういったエラーでも対応すべきか、無視できるかは熟慮・検討する必要があるかと思いますが、今回のエラーは判断に迷う内容でした。

    結論からするとエラーは対応すべきものと私は思います。 が、技術的視点以外からの判断が加わってくると対応しないという結論もあるかもしれませんね。

    Comments are closed.