遅いPCで速いNICを使うと余計に遅くなるという話
初版 2003/1/16
改定1版 2003/1/18
改定2版 2003/2/3
(文字コードをUTF-8に修正2022年6月)
始めに
経験的に知っていたのですが、遅いPCで100BASE-TxのNICを使うと、10BaseT
のNICより通信速度が遅くなります。事実なんだろうかと思い、ベンチマーク
してみました。
このWebをFreeBSD-users-jpで紹介したところ、chipsetの性能に影響されると
指摘をうけました。[FreeBSD-users-jp 72985]など。改定2版ではchipsetの
性能に定評があるIntel製chipセットのPCをベンチマークに追加しました。
改定2版を作るにあたり、Intel製chipsetのPCが欲しいとFreeBSD-users-jpに
送った所、学内の電子情報工学科の方より貸していただきました。ありがとう
ございました(_m_)
ベンチマーク環境
- ソフトウエア 
OSはFreeBSD-4.7Rです。
ベンチマークソフトとして、
NetPipe-3.2(http://www.scl.ameslab.gov/netpipe/) を使用しました。
(FreeBSD ports collectionに入っています。)
NetPipeはサーバ・クライアント間で、通信速度を測定するプログラムです。
 - ハードウエア
次の3台のPCをNetPipeのサーバとして設定した。
- 遅いPCとして
-  PowerHeroes製PC/ Pentium166MHz(133MHzで使用), MEM 64M  (I430VXと略す)
  Intel 430VXチップセット
 -  富士通 FMV Deskpower SE FMV-5133DPS/ Pentium133MHz, MEM 128M  (FMVと略す)
   ALi製チップセット
 -  IBM PS/V Master100 / i486DX4 100MHz, MEM 32M  (IBMと略す)
 
 - 比較用に速いPCとして
-  自作PC Biostar M6VLQ/Celeron 1.4GHz, MEM 128M  (Biostarと略す)
(最近のマザーボードでは珍しいISA付属)
 
 
次のPCをクライアントとして設定
-  自作PC Asustek/Pentium III 450, MEM 128M  (Asusと略す)
 
サーバ3台に、次のNIC・9種類を交換して測定した。
クライアント側のNICは次のNICを使用した。交換はしていない。
- sis0:    IO-DATA ET100-PCI-L
(03/1/17修正:当初rl0と書いていたがsis0の誤りでした。)
 
 - 接続図
[サーバ] -- [Switch1] -- [Switch2] -- [クライアント]
Switch1: アライドテレシス FS716XL
Switch2: Planex FX-08IM
         2台ともフローコントロール対応。
 - 測定方法。
- サーバで次のコマンドを実行する。
% NPtcp -r -b 0 -u 1048573
 - クライアントで次のコマンドを実行する。
% NPtcp -t -h サーバIPアドレス -b 0 -u 1048573
 -  測定結果はクライアント側に出力される。ファイル np.outができる。
このファイルをfeplot(NetPipeのソースに含まれる)を使いグラフ化
 -  100BASE-TxのNICは100Base-Tx/FullDuplexと10BaseT/HalfDuplexでも測
定した。FreeBSDでは次のコマンドで10BaseT/HalfDuplexに変更可能。
% ifconfig xl0 media 10baseT/UTP
 - 1000BaseTのHUBを所持してないため、1000Baseでの測定は行っていない。
 
 
ベンチマーク結果
グラフの縦軸は通信速度(MBPS)です。横軸は、メッセージ(データ)サイズ
(byte)です。
メッセージサイズを変化させながら(1〜786,435byte)通信速度を測定した結果
をグラフ可しています。
ed0: Melco LGY-PCI-TL (10BaseT)
NE2000互換NIC(ed0)で、10BaseTの例です。どのPC/メッセージサイズでもまんべんなく速度が出ているようです。
ed1: Elecom Laneed LD-PNE20/TA Ethernet Adapter (10BaseT)
これもNE2000互換NIC(ed1)で、10BaseTの例です。ISAです。FMVでは特定のメッ
セージサイズで通信速度の落ち込みが見られますね。相性でしょうか?
ep0: 3Com 3C509-Combo EtherLink III (10BaseT)
NE2000以外の10BaseT NICとして、3com製の ISAカードです。
このNICでもFMVは性能が良くないですね。ISAの性能が悪いのかな?
(余談ですが、手もとには3com 3c515という100BaseTx対応の珍品ISAカードが
あるのですが、FreeBSDは未対応なんですよねぇ…。)
xl0: 3Com 3c905B (100BaseTx)
これは100BaseTxの例です。FMV,IBMでメッセージサイズがある一定値を越えた
処で極端に速度が落ち込んでいます。ですが、Intel製チップセットのPC、
I430VXでは落ち込みが見られません。
xl0: 3Com 3c905B (10BaseT)
同じxl0でも、10BaseT固定すると、FMV,IBMで速度の落ち込みは見られないようです。
sis0: IO-DATA ET100-PCI-L (100BaseTx)
xl0を100BaseTxで使った場合と同じ結果ですね。
sis0: IO-DATA ET100-PCI-L (10BaseT)
xl0と同様に、10BaseT固定すると、速度の落ち込みは見られないようです。
fxp0: Intel 82559 (100BaseTx)
FreeBSD界隈では評判の良いfxpですが、I430VX以外の遅いPCでは散々な状況でした。
FMVではベンチマークソフトがタイムアウトして終了します。
fxp0: Intel 82559 (10BaseT)
fxpも10BaseT固定すると、速度の落ち込みは見られないようです。
dc0: AI Brain FEPCI-IXS (100BaseTx)
旧DEC製品ですが、Intelが買収して型番が変わった Intel 21143です。
IBMは割合まともですが、FMVは良くないですね。
なお、I430VX以外のPCではベンチマーク中に次のエラーが表示されました。
FMV, IBM:
	dc0: TX underun -- increasing TX threshold
        dc0: TX underun -- using store and forward mode
Biostar:
	dc0: TX underun -- increasing TX threshold
dc0: AI Brain FEPCI-IXS (10BaseT)
dcも10BaseT固定すると、速度の落ち込みは見られないようです。
pcn0:   IO-DATA ET/PNA-PCI (100BaseTx)
このNICのチップはAMD製のHomePNA用チップです。100BaseTxでも利用可能です。
FMV,IBMもかなり良い成績を出していますね。ですがPNA用ですので、通常の
pcnと比較して良いものか疑問です。
なお、このNICをFreeBSDで使うにはパッチが必要です。
  http://www.sanpei.org/FreeBSD/100BASE/IO-DATA-ET-PNA-PCI
pcn0:   IO-DATA ET/PNA-PCI (10BaseT)
このNICは100BaseTxでも安定していますので、あえて10BaseTにする必要はな
いでしょう。
em0: Intel PRO/1000 MT Desktop Adapter (100BaseTx)
xl0やsis0ではある一定値サイズより大きいメッセージサイズで速度の落ち込
みが見られましたが、em0ではメッセージサイズが小さいと速度の落ち込みが
見られますね。
em0: Intel PRO/1000 MT Desktop Adapter (10BaseT)
em0は10BaseT固定しても、IBM,FMVでは安定した通信速度は望めないようです。
結論
古いPCでは、100BASE-TxのNICを使うと10BaseTのNICより通信速度が遅くなる
という経験法則は、Intel製チップセットには当てはまらないようです。
ですが、100Base-Txで成績がふるわないFMV,IBMでもpcnは良い成績を出してい
ます。
まとめると
- Intel製チップセットなら、特にNICに拘る必要がない。
 - Intel製チップセット以外なら、pcnがお勧め。(ただし実験で利用したpcn
は特殊仕様のためbenchmarkで確認の必要あり。)
 - 100BaseTxで成績の悪いNICを10BaseTで使うと改善される場合もありますが、
em0のような例もありますので、実測してみる必要があります。
 
付録: DEVICE_POLLINGをON/OFFした場合
[FreeBSD-users-jp 72963]にて、このWebを紹介した所、DEVICE_POLLINGを
有効にしてみてはどうかと指摘された。試してみる。
- DEVICE_POLLINGを有効にするには、
- カーネルconfig で、次の項目を追加し、再構築する。
options DEVICE_POLLING
options HZ=1000
 - /etc/sysctl.confに次の項目を追加し、rebootする。
kern.polling.enable=1
 
 - ベンチマーク結果