2018年2月28日水曜日

FreeBSDでalcドライバのTSOに苦しめられた

FreeBSD 11.1-RELEASEで動かしているPCの母板を入れ替えてから一週間ほど、外部からアクセスでデータ転送途中のタイムアウトになって苦しんでいたが、ようやく、alcドライバのTSO(TCP segmentation offload)機能をOFFにしたら解決した(ifconfig alc0 -tso)。
外部からはWindows10とAndroidからアクセスするのだが、Androidの方は特に問題なく、Windows10の方だけ、しかもalc0が送出側になる場合かつ、大き目データの場合のみ転送がストールするという現象になっていた。
tcpdumpで見ると、いくつかTCPセグメントを送出した後で、Windows10からのAckに対して次のセグメントの送出が遅れだして、ついには1分ほどたってからの送出になるに至って、Windows10側がタイムアウトするというやりとりになっていた。
Web検索してもヒントは見つからず途方にくれていたのだが、ふとalc(4)のmanを見たらTSOをサポートしていると記述があって、OFFにしたらすっきり解決したのであった。よかったよかった。