1. 現在の状態を調べる
2. ハード/ソフト含めて考えられる原因をいくつか挙げる
3. 問題が改善されるまでそれぞれの原因への対処策をひとつひとつ実施/検証していく
まず現在の NIC の HW 情報を lspci で調査します。ここでは Broadcom の NetXtreme BCM5722 という NIC を使用していることがわかります。
# lspci -vvv | grep Ether 01:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5722 Gigabit Ethernet PCI Express 02:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5722 Gigabit Ethernet PCI Express
次に実際に現在の回線速度を netperf で測定します。ここでは 83M の速度が出ていることがわかります。Broadcom NetXtreme BCM5722 はギガビット対応しているので通常であれば 800M~1000M の速度が出るはずなので、異常に低い数値であることがわかります。(※netperf を使うためにはサーバ netserver を構築する必要があります。詳細は 別途 Web 上の情報をご覧ください。http://www.netperf.org/netperf/)
# netperf -H s1 TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to s1 (10.0.0.81) port 0 AF_INET Recv Send Send Socket Socket Message Elapsed Size Size Size Time Throughput bytes bytes bytes secs. 10^6bits/sec 87380 16384 16384 10.37 83.10
次に NIC のドライバ情報とリンクアップ/ダウン情報を dmesg や /var/log/message で調べます。ここでは tg3 ドライバを使用し、初回リンクアップ時(サーバ起動時)に 10M でリンクアップしていることがわかります。その後、1000M に移行し一度ダウンして 100M になっているようです。
# dmesg | grep eth0 eth0: Tigon3 [partno(BCM95722) rev a200 PHY(5722/5756)] (PCI Express) 10/100/1000Base-T Ethernet 00:24:e8:7c:ab:7a eth0: RXcsums[1] LinkChgREG[0] MIirq[0] ASF[1] WireSpeed[1] TSOcap[1] eth0: dma_rwctrl[76180000] dma_mask[64-bit] tg3: eth0: Link is up at 10 Mbps, half duplex. tg3: eth0: Flow control is off for TX and off for RX. tg3: eth0: Link is up at 1000 Mbps, full duplex. tg3: eth0: Flow control is off for TX and off for RX. tg3: eth0: Link is up at 1000 Mbps, full duplex. tg3: eth0: Flow control is off for TX and off for RX. tg3: eth0: Link is down. tg3: eth0: Link is up at 100 Mbps, full duplex. tg3: eth0: Flow control is off for TX and off for RX.
最後に ethtool で NIC の現在の状態を調べます。ここでは NIC 自体がサポートできる速度(Supported link modes)とスイッチから提案された速度(Advertised link modes) リンクは確立しているが(Link detected: yes)、速度は 100Mで(Speed: 100Mb/s) になっていることがわかります。
# ethtool eth0 Settings for eth0: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Half 1000baseT/Full Supports auto-negotiation: Yes Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Half 1000baseT/Full Advertised auto-negotiation: Yes Speed: 100Mb/s Duplex: Full Port: Twisted Pair PHYAD: 1 Transceiver: internal Auto-negotiation: on Supports Wake-on: g Wake-on: d Current message level: 0x000000ff (255) Link detected: yes
ここまで現在の状態を調査したうえで、考えられる原因は下記になります。
a. スイッチとのオートネゴに失敗した
b. スイッチのポートがおかしい(本来 1000M のはずがこのポートだけ 100M)
c. NIC がおかしい
d. LAN ケーブルがおかしい
NIC 自体は 1000M に対応しており、実際に 1000M でリンクアップした実績もあるのでここではひとまず(a)のオートネゴを原因として疑い、ひとまずオートネゴをオフにして再設定をしてみます(※注 ethtool による再設定はネットワーク越しではなく、必ず実機で行ってください。(b)スイッチのポート不良の場合、コマンドを打った後にプロンプトが戻ってこず、ネットワークが遮断される可能性があります!)
# ethtool -s eth0 speed 1000 duplex full autoneg off Cannot set new settings: Invalid argument not setting speed not setting duplex not setting autoneg
オートネゴをオフにするとコマンドに失敗しました。tg3 ドライバの仕様かスイッチとの相性が考えられます。Advetised auto-negotiation も Yes なので、オートネゴをオンにして実際にスイッチとオートネゴさせてみます。
# ethtool -s eth0 speed 1000 duplex full autoneg on
うまくいきました。その後速度を再計測すると 83M だった速度が 941M まで復旧できたことがわかります。また ethtool の表示やdmesg にも 1000M になっていることを確認しました。
# /usr/local/bin/netperf -H s1 TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to s1 (10.0.0.81) port 0 AF_INET Recv Send Send Socket Socket Message Elapsed Size Size Size Time Throughput bytes bytes bytes secs. 10^6bits/sec 87380 16384 16384 10.04 941.33
# ethtool eth0 Settings for eth0: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Half 1000baseT/Full Supports auto-negotiation: Yes Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Half 1000baseT/Full Advertised auto-negotiation: Yes Speed: 1000Mb/s Duplex: Full Port: Twisted Pair PHYAD: 1 Transceiver: internal Auto-negotiation: on Supports Wake-on: g Wake-on: d Current message level: 0x000000ff (255) Link detected: yes
この状態を設定ファイルに記述しておくことで起動時や service network (re)start 時に反映することが可能です。
# cat /etc/sysconfig/network-scripts/ifcfg-eth0 (...snip...) ETHTOOL_OPTS="speed 1000 duplex full autoneg on" (...snip...)
また、 Nagios などを使用して監視体制を組んでいるのであれば ethtool コマンドを利用したシェルスクリプトをプラグインとして作成することで定期的な監視が可能です。