【HW】Intel Pro/10GbE LRを試してみた 
 今年の年始くらいに某氏に「PCI-Xを持ってる板ないからどのくらい出るか試して」とIntel Pro/10G LRを借りたのですが、あとでやろうと思いつつ放置していました。忘れつつあったものの、ふとカードを見て興味がわいたのでiperfを試してみました。

 今回試したカードはこれです。
http://ascii.jp/elem/000/000/344/344586/
 これはSRですが、手元にあるのはLR版です。




 チップには2003年と書かれているので、もう10年も前のカードになるんですね。登場から10年たった割には10GbitEtherが依然高いよなあと思います。カード単体は買えない額ではなくなりつつあるものの、スイッチが中々死ねるお値段です。中古でも、アップリンク用に10Gが2ポート程度ついているものはそこそこあるものの、24ポートフル10Gとなるとそう簡単に買える額ではないですね。




 XENPAKな10Gモジュールは何度か見たことがあるものの、改めてみるとごついです。SFP+まで小さくなったのは確かに技術の進歩ですが、それよりも値段を(ry




 さて、このカードを、P5M2




S5197に挿し、Debian 6/kernel 3.2.0-4-amd64 でiperfを実行してみたのですが…

# iperf -c 10.1.1.1 -i 1
------------------------------------------------------------
Client connecting to 10.1.1.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[ 3] local 10.1.1.2 port 43175 connected with 10.1.1.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 1.0 sec 258 MBytes 2.17 Gbits/sec
[ 3] 1.0- 2.0 sec 262 MBytes 2.20 Gbits/sec
[ 3] 2.0- 3.0 sec 262 MBytes 2.19 Gbits/sec
[ 3] 3.0- 4.0 sec 262 MBytes 2.20 Gbits/sec
[ 3] 4.0- 5.0 sec 262 MBytes 2.20 Gbits/sec
[ 3] 5.0- 6.0 sec 261 MBytes 2.19 Gbits/sec
[ 3] 6.0- 7.0 sec 263 MBytes 2.21 Gbits/sec
[ 3] 7.0- 8.0 sec 261 MBytes 2.19 Gbits/sec
[ 3] 8.0- 9.0 sec 262 MBytes 2.20 Gbits/sec
[ 3] 9.0-10.0 sec 262 MBytes 2.20 Gbits/sec
[ 3] 0.0-10.0 sec 2.56 GBytes 2.19 Gbits/sec


 2.2Gb/s…だと…?PCI-XのQuadportGbEを試したときでも4Gbps近くでていたので、いくら何でも遅すぎると思い、ifconfig mtu 4088とかmtu 9000とかmtu 14000も試してみたのですが、頭打ちは変わらず。同じく、Iperfのオプションの-w 128Kや512Kや1M等も試してみましたが、これもやはり2Gb程度で頭打ちになりました。
 ちなみに構成は、P5M2がCore2duo E7200で、S5197がC2D E6600です。メモリは両方ともDDR2-800が2x2GB刺さっていて、それぞれDDR2 667MHzがデュアルチャンネルで動いているので、帯域的にはまだ余裕があると思うのですが…。

考えられる理由は

・ファイバが腐ってる
・PCI-X が133MHzでリンクアップしてない
・相性

のいずれかではないかと思い、それぞれ試してみることにしました。

 まずFCに関しては、カードと一緒にSMなファイバも借りたのですが、未開封品のようだったので違うだろうなあと思いつつも、物置から(その昔におっとネットワーク店で買った)SMケーブルが出てきたので試してみたのですが、やはり変わらず。

 次に、PCI-Xのリンク速度を疑うことにしました。とりあえずlshwをしてみると

description: Ethernet interface
product: 82597EX 10GbE Ethernet Controller
vendor: Intel Corporation
physical id: 1
bus info: pci@0000:05:01.0
logical name: eth3
version: 02
serial: 00:0e:0c:b8:06:06
width: 64 bits
clock: 66MHz
capabilities: pm pcix msi bus_master cap_list rom ethernet physical fibre
configuration: autonegotiation=off broadcast=yes driver=ixgb driverversion=1.0.135-k2-NAPI duplex=full firmware=N/A ip=10.1.1.2 latency=64 link=yes mingnt=255 multicast=yes port=fibre
resources: irq:69 memory:edef8000-edefffff memory:edec0000-ededffff ioport:ec00(size=32) memory:edea0000-edebffff


と出てきて、clock: 66MHzと書いてあったのでもしやこれが原因か、と思ったのですが、更に調べてみると

http://lists.debian.org/debian-user/201 ... 01146.html

> One thing that's come to my attention before I go forward is that when I
> run lspci -vv, I've noticed this:
>
> # lspci -vv -s 03
> 03:03.0 SCSI storage controller: Marvell Technology Group Ltd. MV88SX6081
> 8-port SATA II PCI-X Controller (rev 09)
> --snip--
> Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort-
> <TAbort- <MAbort- >SERR- <PERR- INTx-

That "Status: Cap+ 66MHz+" is an lspci default for all PCI devices.
Ignore it. I have a 12 year old Intel BX test system here, w/33MHz 5v
only PCI slots. 66MHz PCI hadn't even been invented yet. But lspci says:

Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium
TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-

> --snip--
> Capabilities: [60] PCI-X non-bridge device
> Status: Dev=03:03.0 64bit+ 133MHz+ SCD- USC- DC=simple

This is what you trust: ^^^^^^^^^^^^^^

It's running at 133MHz.


 とのことで、どうやら66MHzというのはlspciしたときにどのカードでも関係無しに出てくるようです。それをlshwでも引きずっているのでしょう。多分。
 より詳しい情報を見る為、それぞれのマシンでlspci -vvをしてみると

P5M2
05:01.0 Ethernet controller: Intel Corporation 82597EX 10GbE Ethernet Controller (rev 02)
Subsystem: Intel Corporation PRO/10GbE LR Server Adapter
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
Status: Cap+ 66MHz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 64 (63750ns min), Cache Line Size: 16 bytes
Interrupt: pin A routed to IRQ 69
Region 0: Memory at edef8000 (64-bit, non-prefetchable) [size=32K]
Region 2: Memory at edec0000 (64-bit, non-prefetchable) [size=128K]
Region 4: I/O ports at ec00 [size=32]
Expansion ROM at edea0000 [disabled] [size=128K]
Capabilities: [dc] Power Management version 2
Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold-)
Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=1 PME-
Capabilities: [e4] PCI-X non-bridge device
Command: DPERE- ERO+ RBC=512 OST=3
Status: Dev=05:01.0 64bit+ 133MHz+ SCD- USC- DC=simple DMMRBC=4096 DMOST=3 DMCRS=128 RSCEM- 266MHz- 533MHz-
Capabilities: [f0] MSI: Enable+ Count=1/1 Maskable- 64bit+
Address: 00000000fee0300c Data: 4199
Kernel driver in use: ixgb



S5197
02:04.0 Ethernet controller: Intel Corporation 82597EX 10GbE Ethernet Controller (rev 02)
Subsystem: Intel Corporation PRO/10GbE LR Server Adapter
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
Status: Cap+ 66MHz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 52 (63750ns min), Cache Line Size: 32 bytes
Interrupt: pin A routed to IRQ 47
Region 0: Memory at d8120000 (64-bit, non-prefetchable) [size=32K]
Region 2: Memory at d8100000 (64-bit, non-prefetchable) [size=128K]
Region 4: I/O ports at 4000 [size=32]
[virtual] Expansion ROM at c0000000 [disabled] [size=128K]
Capabilities: [dc] Power Management version 2
Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold-)
Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=1 PME-
Capabilities: [e4] PCI-X non-bridge device
Command: DPERE- ERO+ RBC=512 OST=3
Status: Dev=02:04.0 64bit+ 133MHz+ SCD- USC- DC=simple DMMRBC=4096 DMOST=3 DMCRS=128 RSCEM- 266MHz- 533MHz-
Capabilities: [f0] MSI: Enable+ Count=1/1 Maskable- 64bit+
Address: 00000000fee0300c Data: 41a9
Kernel driver in use: ixgb



 と出てくるので、 Status: Dev=05:01.0 64bit+ 133MHz+と言うのを見る限りでは多分正しくリンクアップしているようです。




 これが実際のクロックを反映してるか疑問だったので、S5197をBIOSからPCI-Xの速度を変えてもう一度lspci -vvしてみると

02:04.0 Ethernet controller: Intel Corporation 82597EX 10GbE Ethernet Controller (rev 02)
Subsystem: Intel Corporation PRO/10GbE LR Server Adapter
(略)
Capabilities: [e4] PCI-X non-bridge device
Command: DPERE- ERO+ RBC=512 OST=3
Status: Dev=02:04.0 64bit+ 133MHz+ SCD- USC- DC=simple DMMRBC=4096 DMOST=3 DMCRS=128 RSCEM- 266MHz- 533MHz-

Kernel driver in use: ixgb


 変わってないのですが…。。

 BIOSから133MHzから100MHzに変えたときにどこが変わったのかと探してみると、

01:00.0 PCI bridge: Intel Corporation 6702PXH PCI Express-to-PCI Bridge A (rev 09) (prog-if 00 [Normal decode]
)
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0, Cache Line Size: 64 bytes
Bus: primary=01, secondary=02, subordinate=02, sec-latency=64
I/O behind bridge: 00004000-00004fff
Memory behind bridge: d8100000-d81fffff
Prefetchable memory behind bridge: 00000000c0000000-00000000c00fffff
Secondary status: 66MHz+ FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- <SERR- <PERR-
BridgeCtl: Parity- SERR- NoISA+ VGA- MAbort- >Reset- FastB2B-
PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
Capabilities: [44] Express (v1) PCI/PCI-X Bridge, MSI 00
DevCap: MaxPayload 256 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us
ExtTag- AttnBtn- AttnInd- PwrInd- RBE- FLReset-
DevCtl: Report errors: Correctable- Non-Fatal+ Fatal+ Unsupported-
RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop- BrConfRtry-
MaxPayload 128 bytes, MaxReadReq 2048 bytes
DevSta: CorrErr- UncorrErr+ FatalErr- UnsuppReq+ AuxPwr- TransPend-
LnkCap: Port #0, Speed 2.5GT/s, Width x8, ASPM L0s, Latency L0 unlimited, L1 unlimited
ClockPM- Surprise- LLActRep- BwNot-
LnkCtl: ASPM Disabled; Disabled- Retrain- CommClk-
ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
LnkSta: Speed 2.5GT/s, Width x8, TrErr- Train- SlotClk- DLActive- BWMgmt- ABWMgmt-
Capabilities: [5c] MSI: Enable- Count=1/1 Maskable- 64bit+
Address: 0000000000000000 Data: 0000
Capabilities: [6c] Power Management version 2
Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
Capabilities: [d8] PCI-X bridge device
Secondary Status: 64bit+ 133MHz+ SCD- USC- SCO- SRD- Freq=100MHz
Status: Dev=01:00.0 64bit- 133MHz- SCD- USC- SCO- SRD-
Upstream: Capacity=65535 CommitmentLimit=65535
Downstream: Capacity=65535 CommitmentLimit=65535
Capabilities: [100 v1] Advanced Error Reporting
UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq+ ACSViol-
UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UESvrt: DLP+ SDES- TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol-
CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr-
CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr-
AERCap: First Error Pointer: 14, GenCap- CGenEn- ChkCap- ChkEn-
Capabilities: [300 v1] Power Budgeting <?>


 という、PCI-E>PCI-X変換のブリッジのクロックが Secondary Status: 64bit+ 133MHz+ SCD- USC- SCO- SRD- Freq=100MHzになっていました。
PCI-Xの速度を133MHzにしてもう一度見てみると、 Secondary Status: 64bit+ 133MHz+ SCD- USC- SCO- SRD- Freq=133MHzとなり、確かに変わっているようにはみえます。

 ブリッジチップが間に噛んでしまうとカードそのものの正しい値が取れなくなるのでしょうか?それとも元々こうなのでしょうか。ソケ604のネイティブPCI-Xを載せていたMBを捨ててしまったので、現在あるPCI-Xの載った板は全てブリッジチップが噛んでしまう為真相は分からずです。


 とにかく、ブリッジチップがPCI-Eのx8でリンクしている以上、ブリッジは8b10bエンコード含め 250 (MB / s) * 8 * 0.8 = 12.5 Gbps までの転送能力があり、PCI-X 133MHzでは
(64 bit) * 133 MHz = 7.92741776 Gbpsまでの帯域はあるはずなので、2Gbで打ち止めになるというのは変です。どうでもいいですがGoogleの電卓機能素晴らしいですね。

 次に考えられるのはハードウェアの相性です。試しにP5WDG2-WSに挿して同じようにテストしたのですが、結果は変わらずでした。




 まあ、これも積んでいるブリッジチップが同じなので同じような結果になるのは分かりますが…。

 しかし、NICをあれこれ試しているうちに、あることに気がつきました。今までどのマザーボードでもNIC1でiperf -sを立ち上げ、NIC2でiperf -cをしていたのです。それを逆に、NIC2でiperf -sを立ち上げNIC1でiperf -cにしてみると

# iperf -c 10.1.1.2 -i 1
------------------------------------------------------------
Client connecting to 10.1.1.2, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[ 3] local 10.1.1.1 port 34069 connected with 10.1.1.2 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 1.0 sec 406 MBytes 3.40 Gbits/sec
[ 3] 1.0- 2.0 sec 410 MBytes 3.44 Gbits/sec
[ 3] 2.0- 3.0 sec 409 MBytes 3.43 Gbits/sec
[ 3] 3.0- 4.0 sec 410 MBytes 3.44 Gbits/sec
[ 3] 4.0- 5.0 sec 408 MBytes 3.43 Gbits/sec
[ 3] 5.0- 6.0 sec 409 MBytes 3.43 Gbits/sec
[ 3] 6.0- 7.0 sec 409 MBytes 3.43 Gbits/sec
[ 3] 7.0- 8.0 sec 410 MBytes 3.44 Gbits/sec
[ 3] 8.0- 9.0 sec 410 MBytes 3.44 Gbits/sec
[ 3] 9.0-10.0 sec 408 MBytes 3.42 Gbits/sec
[ 3] 0.0-10.0 sec 3.99 GBytes 3.43 Gbits/sec


 という、2.2Gb/sの壁を越えた値が出ました。どのマザーボードでもやはり3.4Gb/sが頭打ちになるので、まあこれはこんなものかなと思いながらも、まだ出るのではないかなあとチューニングポイントを探していると、参考になる資料が出てきました。

http://citeseerx.ist.psu.edu/viewdoc/do ... p;type=pdf

 この資料によると、The PCI-X Maximum Memory Read Byte Count (mmrbc) を4kに設定することにより、3Gb/sから5Gb/sまでのばすことが出来るとありました。が、そもそもこれらの板にそのような設定はありません。もし、lspciの結果の DMMRBC=4096というのがそれだとすれば、既に4kに設定されているようにも見えます。
 しかし、NIC1->NIC2への通信が2.2Gb/sでどの環境でもどうやっても頭打ちになる、と言うのがよく分かりません。ファイバーの汚れなどを考えてエアダスターを掛けたり、ファイバのRXとTXを入れ替えてみたりもしたのですが、変化がありませんでした。

  Linux以外のOSではどうか、と試しにOSをFreeBSDにしてみようと思ったのですが、FreeBSDにて認識させることができませんでした。FreeBSD9にてまず試したのですが、kldload if_ixgbをやったところ、
# kldstat
Id Refs Address Size Name
1 4 0xffffffff80100000 c3cab0 kernel
2 1 0xffffffff80d3d000 c540 if_ixgb.ko

 とロードされているようですがIFとして認識されず、最新のドライバも試してみたのですが、ReadMeに
- ixgb driver supports all 82597-based 10 gigabit network connections.

NOTE: The ixgb driver can be downloaded at:
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/ixgb/

 と書かれていて、もうすでに更新されていない様子でした。pciconf -lvをすると
none1@pci0:2:4:0: class=0x020000 card=0xa11f8086 chip=0x1b488086 rev=0x02 hdr=0x00
vendor = 'Intel Corporation'
device = '82597-based 10 Gigabit Adapter'
class = network
subclass = ethernet

と、PCIとしては見えているようですが…。
 更に手元にあったFreeBSD7.4も試してみましたが、結果は変わらずでした。FreeBSD難しいです。

 Windowsでも試してみようと思ったのですが7のドライバはリリースされていなかったので、WindowsXPにドライバを突っ込んでiperfを試してみたのですが…1GちょいというLinuxよりも更に低いスコアしか出なかったのでなかったことにしました。

 長くなってしまいましたが、82597チップをベースにした10GbEは3.5G程度が限界という結論になりそうです。片方が2.2Gbしか出ないのはトランシーバーが腐っていたということにします(強引

 まあ自分のものではないのでいずれ返してしまうものの、もう少しチューニングの余地がある気がするので、詳しい人がいたらこうすればいいと言う案が欲しいです。

--追記--
FreeBSDにて認識しないとTwitterにつぶやいたところ、



とのアドバイスをいただいたので、試してみたのですが、まず/usr/src/sys/dev/ixgb/を~へコピーして
#define IXGB_DEVICE_ID_82597EX 0x1048 /* Cibolo A1, -LR (1310nm) */

と言うところを
#define IXGB_DEVICE_ID_82597EX 0x1048 /* Cibolo A1, -LR (1310nm) */

と変えて、FreeBSD5向けの

#$FreeBSD$
.PATH: ${.CURDIR}
KMOD = if_ixgb
SRCS = device_if.h bus_if.h pci_if.h opt_bdg.h
SRCS += if_ixgb.c ixgb_hw.c ixgb_ee.c
CFLAGS += -DLM
clean:
rm -f opt_bdg.h device_if.h bus_if.h pci_if.h setdef*
rm -f *.o *.kld *.ko
rm -f @ machine

.include <bsd.kmod.mk>

 というMakefileを持ってきてMakeしてみましたが、変わらずでした。

 あれこれ見ているうちに、ixgb_hw.cに

#include <dev/ixgb/ixgb_ids.h>


と書かれているのを見つけたので、直接/usr/src/sys/dev/ixgb/ixgb_ids.hを変更したところ、無事にixgb0が見えるようになりました。

 しかし、Pingは疎通するのですが、iperfやftp等で転送しようとすると、バッファが確保できないといったようなエラーを吐いて再起動してしまうので、やはり現行のFreeBSDではLRは対応していないようです。ついでにCX4のixgbも消されていました。10G-SRのixgbは大丈夫のようですが…。

 なんというキワモノだったのでしょう…

コメントを書く
必要事項とコメントを入力して下さい。









タグの挿入