Home | GridMPI | GridTCP | Publications | Download

Curret Release: GridMPI-2.1.1

English | Japanese

GridTCP FAQ

PSPacer

PSPacer を動かすために,PC やネットワークインタフェースカードには 必要条件がありますか?

精密なペーシングを実現するために,接続されたネットワークリンクの最大レートで パケットを送信できる性能がシステムには必要です.

I/O バスがボトルネックになる場合は,最大送信レートを得ることができません. したがって,ギガビットイーサネットを使用する場合,ネットワークインタフェースは PCI-Express,PCI-X,66MHz/64bit PCI または CSA で接続すべきです. プロセッサは Pentium 4 かそれ以上であれば,十分な性能が得られるでしょう.

もしファーストイーサネットを使用する場合は,今日の大抵の PC で十分な性能が 得られるはずです.

長距離広帯域ネットワークにおける TCP/IP 通信で,ギガビットスピードを 得るにはどうすればよいですか?

PSPacer に依存する話ではありませんが,いくつかのヒントを記しておきます.

sysctl(8) コマンドを使い,カーネルパラメータを変更できます. TCP の設定を変更するために,必要に応じて以下のエントリを /etc/sysctl.conf に 追加し,"sysctl -p" を実行してください.

ソケットバッファサイズ

最適なソケットバッファサイズはネットワークリンクの帯域 * 遅延の積 (BDP: 帯域遅延積) の二倍です.しかし,長距離広帯域ネットワークの BDP に対して, デフォルトの TCP バッファサイズの最大値は非常に小さい値に設定されています. 例えば,帯域が 125MB/s (すなわち1Gbps)で,片道遅延が 100ms の回線を使いきる には,125 * 0.1 * 2 = 20MB のバッファサイズが必要になります. ソケットバッファサイズを変更するには,次のように設定します.

  # 最大バッファサイズを 32MB (32 * 1024 * 1024) に増やす
  net.core.rmem_max = 33554432
  net.core.wmem_max = 33554432
注意: Linux は要求値の倍の値をバッファサイズに設定します.つまり, 上記の例は,最大バッファサイズを 64MB に設定したことになります.

インタフェースキューサイズ

インタフェースキュー(すなわち,ネットワークインタフェースの送信キュー) サイズの増加も考える価値があるでしょう.一般的な TCP の実装では,インタ フェースキュー溢れもパケットロスと同様に輻輳として扱うからです. 次のように ifconfig(8) コマンドを実行することで,インタフェース キューサイズを設定できます.

  # ifconfig eth0 txqueuelen 10000

入力キューサイズ

netdev_max_backlog はプロセッサごとの入力キューサイズの最大値を指定します. デフォルト値は 300 (パケット)です. Linux は,(ボトムハーフ機構の制限により,)入力バッファをフラッシュする ために,スケジュール時間まで待つ必要があります.したがって,この値は 次のようにパケット受信時のネットワーク帯域を制限します.

  300       *      1,000     =      300,000
  packets          HZ               packets/s

  300,000   *      1,000     =      300 M
  packets    averate (bytes/packet) throughput (Bytes/s)
より高い帯域を得たい場合は,netdev_maxbacklog を増やす必要があります.
  net.core.netdev_max_backlog = 2500
注意: カーネル 2.4.x では,HZ は 100 です.

メトリクスのキャッシュオフ

ベンチマークや実験を行う際,ルートメトリクス(輻輳ウィンドウサイズ,RTT など)を保存しないことが有効な場合がしばしばあります.メトリクスへの キャッシュを無効にするには,次のように設定します.

  net.ipv4.tcp_no_metrics_save = 1
これは TCP セッション開始ごとに,次のコマンドを実行することと同じ効果を 得られます.
  # echo 1 > /proc/sys/net/ipv4/route/flush

Iperf の結果が,tc コマンドで設定したターゲットレート より低いのですが,なぜですか?

PSPacer は IP と TCP もしくは UDP ヘッダを含むデータリンク層の帯域を ターゲットレートとして使うのに対して,iperf はペイロードの帯域を 出力します.したがって,iperf はターゲットレートよりも低い帯域を 表示します.

さらに,特に TCP/IP を使う場合,輻輳制御やバッファサイズの影響により, 帯域が制限されるかもしれません.「長距離広帯域ネットワークに おける TCP/IP 通信で,ギガビットスピードを得るにはどうすればよいですか? 」を参照してください.

PSPacer を使い,ネットワークの中間ノードで帯域制御できますか?

ここでは PSPacer をインストールした Linux PC を PSP box と呼びます. 次の例では,LAN (1Gbps) から WAN (100Mbps, 20ms)へのトラヒックを 平滑化するために,PSP box を使っています.

ネットワーク構成

次のようなネットワーク構成を前提に話を進めます.

                    +-------+
                    |  PC1  | 192.168.1.2
                    +-------+
                        |         192.168.1.0/24
         ----------------------------------
                 |<-- 1Gbps (LAN)
                 |
                 | eth0 192.168.1.1
           +-----------+
           |           |
           |  PSP Box  |
           |           |
           +-----------+
                 | eth0 192.168.2.1
                 |
                 |<-- 100Mbps, 20ms (WAN)
         ----------------------------------
                        |          192.168.2.0/24
                    +-------+
                    |  PC2  | 192.168.2.2
                    +-------+

PC1 と PC2 の設定

PC1 と PC2 が Linux PC であれば,次のように IP アドレスと,ルートを 設定してください.

  PC1:
  # ifconfig eth0 192.168.1.2
  # route add -net 192.168.2.0 netmask 255.255.255.0 \
    gw 192.168.1.1

  PC2:
  # ifconfig eth0 192.168.2.2
  # route add -net 192.168.1.0 netmask 255.255.255.0 \
    gw 192.168.2.1

PSP Box の設定

IP フォワーディングを有効にするために,次のコマンドを実行してください.

  # echo 1 > /proc/sys/net/ipv4/ip_forward

PSPacer の設定

PSP box において,次のようにコマンドを実行してください.

  # tc qdisc add dev eth0 root handle 1: psp default 2
  # tc class add dev eth0 parent 1: classid 1:1 psp rate 100mbit
  # tc class add dev eth0 parent 1: classid 1:2 psp mode 0
  # tc qdisc add dev eth0 parent 1:1 handle 10: pfifo
  # tc qdisc add dev eth0 parent 1:2 handle 20: pfifo
  # tc filter add dev eth0 protocol ip parent 1: pref 1 u32 \
    match ip dst 192.168.1.0/24 classid 1:1

PSPacer のインストール時に,"RTNETLINK answers: Invalid argument"という エラーメッセージを表示して,tcコマンドが終了します.

TCP Segmentation Offloading (TSO) が有効になっている可能性があります. 現在,PSPacer は TSO に未対応なので,インストール前に TSO を無効にする 必要があります.

dmesg に次のようなメッセージが表示されている場合は,TSO が有効になって います.

  psp: sch_psp does not support TSO.  You must disable it: 
  "ethtool -K eth0 tso off"
もし,上記メッセージが出力されている場合は,ethtool(8) コマンドを 使って TSO を無効化した後,再度,tc コマンドを実行してください.
  # /sbin/ethtool -K eth0 tso off
  # /sbin/tc qdisc add dev eth0 ...

Linuxカーネル2.4でコンパイルできません.

PSPacer 1.2の場合,次のようなエラーメッセージが表示され,pspdのコンパイルに失敗します.
make[1]: Entering directory `/home/takano/works/pspacer-1.2/pspd'
cc -g -Wall -I /lib/modules/`uname -r`/build/include -I ../kernel -c -o conf.o conf.c
In file included from /lib/modules/2.4.22-gridmpi/build/include/linux/rtnetlink.h:4,
                 from conf.c:29:
/lib/modules/2.4.22-gridmpi/build/include/linux/netlink.h:25: parse error before "__u32"
/lib/modules/2.4.22-gridmpi/build/include/linux/netlink.h:25: warning: no semicolon at end of struct or union
	... snip ...
make[1]: *** [conf.o] Error 1
make[1]: Leaving directory `/home/takano/works/pspacer-1.2/pspd'
make: *** [all] Error 2
この場合,pspd/conf.cを次のように修正してください.
--- conf.orig.c 2006-04-26 11:40:03.000000000 +0900
+++ conf.c      2006-04-26 11:41:41.000000000 +0900
@@ -26,6 +26,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
PSPacer 2.xは,カーネル2.4上での動作をサポートしません.


GridTCP プロジェクトページに戻る.


($Date: 2006/04/27 07:30:17 $)