TEEN Ethernet版でFTPすると途中で止まっちゃう問題

今でもPC-98とファイルをやりとりしなきゃいけないことが頻繁にあり、そのためにEthernetを使ってFTPを使い、Linuxサーバーとの間でファイル転送をしていたが、環境を変えたところうまくいかなくなった。 その時の試行錯誤の結果。 (2015-SEP-09)

環境

Linuxサーバー (VMWare ESXiの上のDebian unstable: Linux 4.1.0-2-amd64)のftpdから、EPSON PC-386Vのftpに向けてファイルを転送する。
接続図

Linuxサーバーはvmxnet3で準仮想化ドライバを使用し、物理的には10Gb Ethernetでネットワークに接続している。 他の10 Gb Ethernetの物理ホストとの間のTCPを用いたiperfで9.7 Gbps以上のスループットがあり、パケットロスは全然発生しない。

PC-386VはEPSON版MS-DOS 5.0で動いている。 NICはAllied TelesynのCentreCOM SIC-98-ETを用い、パケットドライバはVer 2.1PL0 [allied-telesis.co.jp]を使った。 TCPドライバはTEEN Ethernet版 v0.39c [pc88.gr.jp]を使用した。 FTPは合著さんのFTP 0.06のTEEN版を使った。 PC-98側のこのソフトウェアの組み合わせは他の環境でもよく使っている。

起きた問題

ftpでファイルを転送していると、どんどん遅くなって、50 KBくらい転送したところで完全に転送が止まってしまう。

以前の環境でSun Fire V210の上でOpenBSD 5.6を動かし、この上でftpdを動かした場合問題が起きなかった。 V210はGigabit Ethernetである。

解決策

まず、iptablesでパケットを送信側で適切に破棄して、転送速度を調整する。 通常iptablesOUTPUTの部分は、

-A OUTPUT -j ACCEPT

だけ書いてあったりするが、PC-386VのIPアドレスが10.0.0.38だとすると、ここを

-A OUTPUT -d 10.0.0.38 -m limit --limit 10/s -j ACCEPT
-A OUTPUT -d 10.0.0.38 -j DROP
-A OUTPUT -j ACCEPT

とすればOKだと思う。 Debianでiptables-persistentを使っている場合/etc/iptables/rules.v4を編集することになる。

次に、輻輳制御アルゴリズムを、ロスの多いネットワークでそれなりに動くWestwoodに設定する。 性質上、これはシステム全体に影響する。

# modprobe tcp-westwood
# sysctl -w net.ipv4.tcp_congestion_control=westwood

再起動後も同じ設定にするには/etc/sysctl.conf/etc/modprobe.d/をいじる(このページにたどり着くような人にはこういう説明はいらないか…)

以上の設定で、私の環境ではタラタラとファイルが転送され続けるようになった。

結論

送信側とネットワークの太さが違いすぎたりスイッチがたくさん挟まっていたりして、バーストが起きてパケットを取り逃してしまうかわいそうなPC-386V. 送信側で適切にパケット送出量を制限し、この制限の元でもそれなりに動くTCP輻輳制御アルゴリズムを選択することで、安定してファイル転送が実現できた。 今後40 Gbps/100 Gbpsのホストと100 Mbpsのコンピュータの間でファイル転送を行なう場合でも、似たような問題が発生しないか確認する必要がある。 あとCubicやはりちょっと急に輻輳ウインドウサイズを上げすぎでは。