今でも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
でパケットを送信側で適切に破棄して、転送速度を調整する。
通常iptables
のOUTPUT
の部分は、
-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やはりちょっと急に輻輳ウインドウサイズを上げすぎでは。