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 程度のファイルをダウンロードすることが出来るようになった。
まさかのドライバ違いに思わぬ時間を取られてしまったけど、いい経験になったかも。