Q. LAN 経由での Windows から FreeBSD へのデータ転送が、その逆に比べ 圧倒的に遅いです。Windows 同士だとこのような現象は起りません。 A. 最大の理由は「Winsock2 は 2 packet 送信すると ack を待ってしまうか ら」です。 Windows の TCP/IP 層はデフォルトでは 2 packet 送信する度にAck を待っ てしまいます。unix は TCP Window size にゆとりがある場合は「きっと 向うはまだ送ってくるだろうから」と安心して piggy bag できる packet がないか調べるために、10msec ほど沈黙します。当然一方向の通信 (RPC とか) の場合 piggy bag などできるパケットが存在しませんので、この 10msec の間、全くデータが転送されることがなくなります。 Windows 同士の場合、受け側も「2packet 受け取ったら速攻で ack を返さ ねばならぬ」と思い込んでいるので、この「待ち」がほとんどありません。 FreeBSD でこの問題を解決するには、sysctl で # sysctl -w net.inet.tcp.delayed_ack=0 とすることです。こうすれば piggy bag できるかどうか悩むことなく、 FreeBSD は ack を即座に返すようになります。 ただし、この設定は「特定のコネクション相手」単位では設定できません。 全体に有効になってしまいます。で、他の unix マシンと通信する場合、 これは ack を投げすぎることになるので、逆にパフォーマンスを落す可能 性が高いです。 なお、この現象は [管理番号 1582] に似ていますが、異なる現象です。 しかし、Winsock2 に起因するところは同じです。ただし、Windows 2000 (と多分 Windows Me) の Winsock2 では発生しないようです。
グループ名: winsock