| Home | GridMPI | GridTCP | Publications | Download |
| ||||||||||
|
Curret Release: GridMPI-2.1.1 |
English | Japanese
GridTCP FAQPSPacer
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 @@ #includePSPacer 2.xは,カーネル2.4上での動作をサポートしません. ($Date: 2006/04/27 07:30:17 $) | |||||||||