NETDEV WATCHDOG: eth0: transmit timed out

自宅サーバのネットワークが突如不安定になる問題の解決メモ。

samba 経由で 10GB 程度のファイルをダウンロードしていると、サーバと通信が途切れてその後まともに通信出来なくなるという現象。
上記なことをしなければまったく問題なかったので、解決まで時間がかかったかかった。
いろいろ無駄な作業もしたけど、忘れがたい経験になったのでまとめメモ。

  • 自宅サーバは CentOS 5.4 を使用しています。
  • ディストリビューションによっては、そのまま従って解決というわけにいかないかもしれません。

原因追及

とりあえず情報収集。
手始めに /var/log/message を眺める。
いろいろあやしげな文字列がある中、ひときわ目立ってたのが次の1文。

  
$ vi /var/log/message  
...  
NETDEV WATCHDOG: eth0: transmit timed out  
...  

このメッセージが出た直後から、まともに ssh すらできない状態に陥るもよう。

最初はクライアント側の Mac のせいかと思って、Windows から同じことを試したりしたけど、状況は変わらず
いま思ってみれば、サーバにエラー的なメッセージが出ている時点でほぼ原因はサーバと断定して良かったかもしれない。

まぁとにかく原因はサーバ側にあるらしい。
けど、具体的な症状はこの時点でさっぱりだったので、引き続き情報収集。

  
# ifconfig  
eth0      Link encap:Ethernet  HWaddr 00:1C:C0:B4:F6:4A    
          inet addr:192.168.11.30  Bcast:192.168.11.255  Mask:255.255.255.0  
...  
# ethtool eth0  
Settings for eth0:  
...  
    Advertised auto-negotiation: Yes  
    Speed: 1000Mb/s  
    Duplex: Full  
...  
# lspci -v  
...  
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 02)  
    Subsystem: Intel Corporation Unknown device 0001  
...  

いろいろコマンドの使い方は分かったものの、原因はさっぱり。

調べた情報を元に google 先生と協力しながら、
ethtool で speed を 1000 から 100 にしてみたり。

  
# ethtool -s eth0 speed 100  

TCP Segmentation Offload をオフにしてみたり。(後でもともとオフだったことに気づいたり)

  
# ethtool -K eth0 tso off  

けれど、解決には至らず。

検索語を変えながらさらにググってみると、
「NIC のドライバのバージョンが違うとネットワークが不安定になるよ」という情報を発見。
どうやら、NICのバージョンとインストールされているドライバのバージョンが異なると問題が発生するらしい。

解決編

先人の知恵をもとに NIC のバージョンとドライバを確認。

  
# lspci | grep Ether  
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 02)  
# lsmod | grep r81  
... r8169 ですよ的な表示 ...  

NICのバージョンは、RTL8111/8168B。
インストールされているドライバのバージョンは、r8169。

ビンゴか!!

RTL8111/8168B には、r8168 がインストールされていないとだめとのこと。
ここまで来れば解決したも同然!
さっそくドライバを再インストール。
ssh 経由 だとサーバから切断されて作業が中断されること請け合いなので、直接キーボードを繋いでの作業がオススメ。
事前に ドライバ をダウンロードしてサーバに置いておく。
作業時は r8168-8.014.00.tar.bz2 を /usr/local/src に置いた。

  
$ su -  
# cd /usr/local/src  
# rmmod r8169  
# vi /etc/modprobe.conf  
r8169 を r8168 に置換  
...  
# tar jxvf r8168-8.014.00.tar.bz2   
# cd r8168-8.014.00  
# vi readme   
... すべき作業が書いてある...  
# make clean modules  
# make install  
# man depmod  
# depmod -a  
# modprobe r8168  
# lsmod | grep r8168  
# reboot  

以上のコマンドを叩いた結果、無事に samba 経由で 10GB 程度のファイルをダウンロードすることが出来るようになった。

まさかのドライバ違いに思わぬ時間を取られてしまったけど、いい経験になったかも。

参考

CentOSにNICを手動インストールした人は、正しいドライバが入っているかチェックしたほうがよさげ