FreeBSD QandA 623

FreeBSD QandA

Q. DEC 2114x チップの NIC を使っていますが、
   de0: abnormal interrupt: transmit underflow (raising TX threshold to 96|256)
   de0: abnormal interrupt: transmit underflow (raising TX threshold to 8|512)
   de0: abnormal interrupt: transmit underflow (raising TX threshold to 1024)
   de0: abnormal interrupt: transmit underflow (switching to store-and-forward mode)
   というようなメッセージが出ます。

A. このメッセージは、de ドライバが「2114x が送信アンダーフロー割り込み
   を発生した」ことを検出したという意味です。

   結論から先に言うと、問題は (ほとんど) ありません。

   この「送信アンダーフロー割り込み (transmit underflow)」は、2114x が送
   信データをメインメモリから自分の FIFO に取り込み、イーサネットに送信す
   る過程で、FIFO に取り込むスピードよりもイーサネットに送信するスピード
   が速いために FIFO が空になることにより発生します。

   これは、PCI バスの転送スピードが遅く、イーサネットがすっからかんのとき
   に顕著になります。

   de ドライバは送信アンダーフロー割り込みが発生した場合、できるだけ自分
   の FIFO にデータを溜めてから送信をするように、送信スレッショルドをだん
   だん大きくします。これが raising TX threshold to xxx の意味です。

   # ちなみに、xxx の数字は、プログラムのミスで
   # 72|128、96|256、128|512、160|1024
   # となるのが正しいようです。(/sys/pci/if_de.c を見てください。)

   さらに、それでもアンダーフローが発生するようであれば 1 パケット分のデー
   タが FIFO に溜るまで送信しない store-and-forward モードになります。(メッ
   セージの最後の行です。) この状態まで来ると、もうアンダーフローは発生し
   なくなるはずです。

   送信アンダーフローが生じた際には、それまで FIFO に溜まっていたデータま
   でしか送出されず、送出されるイーサパケットは途中で切れた形となります。
   したがって、通信の相手先では変なパケットを受け取ることになり、たとえば、
   それがイーサパケットの最後尾に付加されるべき CRC (Cyclic Redundancy
   Check) が付いていない状態のパケットとみなされた場合は、次のような bad
   crc とのメッセージが表示されるでしょう。

       de0: receive: xx:xx:xx:xx:xx:xx: bad crc

   送信アンダーフローは PCI バスの転送速度が足りないことから発生しますの
   で、根本的な対策は PCI バスの転送速度を 2114x のために確保することです
   が、以下に、いくつか ad hoc な対策をあげておきます。

    1.BIOS の設定メニューで PCI バスのレイテンシタイマを調整してみる。
    2.PCI バスに接続している不要なデバイスを減らす。(できれば...だけど)
    3.PCI バス上で 2114x の転送優先順位を上げる。(BIOS の改造が必要だけど)
    4.PCI バスの転送速度を上げる。(規格外の改造が必要だけど)
    5.イーサネットに他の機器を接続して、イーサネットを混ませる。(イミなし)
    6.時々へんなパケットがイーサネット上に送信されるが気にしない。

   送信アンダーフローが頻発するようであれば、イーサネット上を変なパケットで
   占有されてしまうため、貴重なネットワーク資源を無駄にする可能性もありますが
   送信アンダーフローが頻発しないのであれば 6 で良いのではないでしょうか?

   注意:
       以上の説明は、いろいろな意味で「正常」なシステムを前提にしています。
       ハードウェアの不具合や相性問題等が直接的または間接的 (他のデバイスが
       PCI バスを占有している等) 原因になっていないとも限りません。PCI バス
       が混んでいるはずが無いのにアンダーフローが発生するとかアンダーフロー
       があまりに頻発するようであれば、いろいろな角度からシステム全体のチェッ
       クをしてみた方が良いでしょう。

間違い・追加情報を見付けた場合は、 修正案の投稿のしかた を読んだ上で、
QandA@jp.FreeBSD.org まで お知らせください。