FreeBSDで上りの速度を速くしよう

初出:2005/04/09
更新:2005/04/09

1.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の設定方法を紹介しよう。

2.FreeBSDでRWINを設定する

 FreeBSDには、カーネルシステムの設定を行う「sysctl」というコマンドがある。Windowsで言えばレジストリをいじるようなものだ。ここにRWINの設定が入っているので、変更すればよい。

<手順>
  1. 現在のRWIN値を表示してみる。

  2. sysctl net.inet.tcp
  3. TCPに関する設定値の一覧が表示される。

  4. その中にある「net.inet.tcp.recvspace」が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
    (以下略)

  5. /etc/sysctl.confを開く
  6. RWIN値を指定する。

  7. 最適な数値は回線にもよるが、LANや光だとデフォルトの2、3倍あたりがよい。筆者は2倍の114688としている。また通信バッファを増やすために「kern.ipc.maxsockbuf」の値も同時に増やしておく。

    # $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

  8. 保存して再起動する。

戻る


Copyright © 2005 H'Imagine.
All rights reserved.