FreeBSDで上りの速度を速くしよう
FreeBSDというと、「ネットワーク的に素晴らしいパフォーマンスを出してくれる(はず)」と信じている人も多いだろう。しかしFreeBSDは、標準設定だとTCP/IPでの上りが遅いのだ。例えばFreeBSDでWebサーバーを立てて、そこへブラウザからファイルのアップロードをした場合、クライアント(Windows)とサーバー(FreeBSD)が100BASE-TのLANで結ばれているにもかかわらず、アップロードにかかる時間が信じられないくらい遅い。ISDNかと思うほどだ。この現象は数十MB程度の大きなサイズのファイルをアップロードする場合に顕著に表れる。
じゃあ、LinuxはということでRedHat Linux9をWebサーバーにして行ってみると、期待通りにLANの速度でアップロードが出来た。やっぱりFreeBSDのせいだ。ちなみにApacheやPHPやPerlはこの件に関しては無関係である。
原因を調査すべくいろいろ検索したところ、「RWIN」の設定が上りの速度に大きく影響することがわかった。
TCP/IP通信では、クライアントが送ってきたデータ量がRWINの値になると、サーバーからクライアントへ「きちんとデータが届いてますよ」という確認メッセージを送り返す仕組みがある。RWIN値が小さいと、サーバーはクライアントに対してひっきりなしに確認のメッセージを送り返すことになる。その分ロスが多くなり、実質的なアップロード速度が低下してしまうのだ。一方、RWIN値が大きすぎると、クライアントに確認メッセージが返って来るまでの時間が長くなり、もしクライアントがデータ送信に失敗していたら再送信するまでに時間がかかることになる。これもアップロード速度が低下してしまう原因となる。
FreeBSDのRWINは、デフォルト値だとLANや光には小さすぎなのだ。だから上りの速度が出ない。ちなみにRedHat9はというと、あらかじめ複数のRWINが登録されていて、最適な値に自動的に切り替わるようになっている。
というわけでRWINの設定方法を紹介しよう。
FreeBSDには、カーネルシステムの設定を行う「sysctl」というコマンドがある。Windowsで言えばレジストリをいじるようなものだ。ここにRWINの設定が入っているので、変更すればよい。
<手順>
net.inet.tcp.rfc1323: 1 net.inet.tcp.rfc1644: 0 net.inet.tcp.mssdflt: 512 net.inet.tcp.keepidle: 7200000 net.inet.tcp.keepintvl: 75000 net.inet.tcp.sendspace: 32768 net.inet.tcp.recvspace: 57344 net.inet.tcp.keepinit: 75000 (以下略) |
# $FreeBSD: src/etc/sysctl.conf,v 1.1.2.3 2002/04/15 00:44:13 dougb Exp $ # # This file is read when going to multi-user and its contents piped thru # ``sysctl'' to adjust kernel values. ``man 5 sysctl.conf'' for details. # kern.ipc.maxsockbuf=524288 net.inet.tcp.recvspace=114688 |