■今から思えば原因そのものは明らかになっていて、ただそのことに気付けないでいた。ただ、現象だけが意識されていた。Linuxサーバーの通信速度がスローダウンした。1GのEtherで接続しているのだけど、4Mbps程度しか帯域が使われない。IPv4もIPv6も同じ。Pingを打ってみると、IPv6では1ms以下で応答が帰るがIPv4は100ms~1msの間で変化していて、平均で50ms。遅すぎる。
何が起きているのかよく解らず、結局Wiresharkでパケットダンプを取ってみると、Pingの受信が一定間隔で固定化されていて、それが100msサイクルのようだった。pingの送信タイミングが100ms以下で変化しているのに、サーバー側の受信が一定間隔で固定されているので、その時間差が遅延となって表れている。NICは受信の際に割込みがかかるはずが、割り込みされず、CPUからの一定間隔のポーリングで受信が処理されているような、そんな動き方に見える。
とりあえずipconfigでdownとupを行うと回復するのだけど、気が付くとまた元に戻っている。サーバー側の操作で戻るので、サーバー内部に問題があることは見当がついたのだけど、どこかがわからない。ただ時間をかけて調べているうちに、ターミナルにIRQ#17が無効になったというワーニングメッセージが出ると遅延するようになっていることが解ってきた。
/proc/interrupts をcatするとIRQ#17は問題のIPv4を扱うNICに対応していることが解った。
'irq 17: nobody cared Disabling IRQ #17'というメッセージは結構メジャーらしい。ぐぐると結構でてくる。
このメッセージには追加で'irq 17: nobody cared (try booting with the "irqpoll" option)'ともある。irqpollをカーネルの起動オプションに追加してみて、ということは解る。'irqpoll'の意味ははっきりしないけど、状況とその言葉からして、カーネル側から積極的にポーリングするようにするのだろう。
起動時に指定するものなので、grub2のコンフィギュレーションファイルを変更した。
/boot/grub2/grub.cfg で、このファイル中に記述されているmenuentry項目にある、Linuxのブートオプション行にirqpollを追加した。(linux /vmlinuz-3.8.2…rhgb quiet irqpoll LANG=ja_JP.utf8…)
grub.cfgを変更したあとにサーバーをリブート。とりあえずIRQ#17がDisableされたというメッセージはでなくなり、NICのスローダウンも起こらないでいる。