清水理史の「イニシャルB」

6G→9Gbpsに! 10GbE NICで遅いならUEFIでPCIeリンク幅を固定しよう

 10GbE対応のネットワークカードを装着する場合は、PCIeの物理的なスロットだけでなく、UEFIのリンク幅の設定にも要注意だ。「自動」になっていると「1X」で接続されてしまい、速度の上限が6Gbps前後で頭打ちとなることがあるためだ。

PCを変えたら10GbEが遅い?

 今年の初めにPCを新調したのだが、どうもそれ以来、有線の速度が遅い………。

 PCに装着しているNICは、ASUSの「XG-C100C」。マザーボードの2本目のPCIe 3.0 x16スロット(x4 mode)へ装着しているのだが、iPerf3を試しても、5~6Gbpsほどの速度で頭打ちになってしまう。

1万2000円前後と低価格なASUSの10GbE対応ネットワークカード「XG-C100C」

 実用上は問題ないし、レビューで10Gbpsのベンチを計測する機会もなかったので、今まで原因を探ることを後回しにし続けてきたのだが、ようやく時間が取れたので、その原因を探ってみた。

 そして結論から言うと、PCIeのx1モードで動作していた。

 前述した通り、装着しているPCIeスロット自体は、x16のサイズで、転送モードも最大x4に対応しているため、ここがボトルネックになっているとは全く考えていなかった。だが、きちんと調べてみると、残念ながらx1モードで動作していたのだ。

 お恥ずかしい話だが、海外の掲示版などを見ても、10Gbps NICのiPerf3速度が6Gbps前後で頭打ちになるとの書き込みを見かけることが多い。x4モード以上のスロットに装着しているにもかかわらず速度が遅い場合は、本稿の手順で、UEFIの設定を変更してみることをお勧めしたい。

装着したスロットはx16だが、対応するモードはx4。しかし、実際のリンク幅がx1というオチだった

現在のリンク幅を確認

 まずは、現在のリンク幅を確認してみよう。

 PCIeに装着したデバイスのリンク幅は、「HWINFO64」などのツールを使って調べることもできるが、シンプルなのはデバイスマネージャーを確認する方法だ。

筆者宅の標準の状態。x1モードで接続されていた

 デバイスマネージャーでネットワークアダプターの項目から、装着している10GbE NIC(ここではASUS XG-C100C)を開き、[詳細]タブに切り替えて[プロパティ]をドロップダウンし、[PCIの現在のリンク幅]を表示する。

 この値が「00000001」ならx1モード、「00000004」ならx4モードとなる。

 PCIeは、PCI3.0(Gen3)で、x1だと片方向で0.9846GB/s(約8Gbps)、x4だと片方向で7.877GB/s(約64Gbps)となる。

 つまり「00000001」だと、PCIeの8Gbpsの上限をどうやっても超えることができないというわけだ。

UEFI設定で転送モードを「x4」に固定する

 では、どうすればいいのかというと単純で、UEFIでPCIeスロットの転送モードを手動で設定すればいい。

 筆者が利用しているマザーボードは「TUF GAMING B550-PLUS」という製品だが、UEFI設定でPCIeの設定([詳細]―[オンボードデバイス設定構成])を調べてみると、標準では以下のように「PCIEX15_2 4X-1X切り替え」が「自動」になっている。

 「自動」なので、てっきり最大のx4モードで接続してくれているものだと思っていたが、実際は自動の場合x1モードで接続されてしまう。ここが見落としがちなポイントだ。

 このため、手動でモードを「4X」に固定しておく。

「自動」ではx1モードで接続されてしまうので「4X」に手動で設定する
UEFIの設定を手動で変更すると、現在のリンク幅が「00000004」となった

 この設定をした後で再起動し、再びデバイスマネージャーでXG-C100Cのリンク幅を調べてみると、無事に「00000004」となっていた。

 当たり前と言えば当たり前なのだが、「自動」で問題ないという思い込みが、原因の発見を遅らせていた最大の要因だ。

無事に9Gbpsオーバーに

 というわけで、あらためてiPerf3のテストを実施してみた。

 2台のPCを前々回に本稿で紹介したQNAP「QSW-2104-2T」経由で接続した環境で、PC1は上記のXG-C100C構成のPC(CPU:Ryzen 9 3900X、メモリ:64GB、SSD:1TB、OS:Windows 10 Pro)、PC2は自宅に余っていた古いPC(CPU:Intel Core i7 4400、メモリ:16GB、SSD:80GB、NIC:Startech.com ST10GSPEXNB、OS:Windows 10 Pro)となる。

 PC2に関しては、NICをx16モードのスロットへ装着しており、こちらは標準ではx4モードで動作していることを確認済みだ。

 まずは、「自動」でx1モードだったときの値だが、以下のように6Gbps前後で頭打ちとなる(ジャンボフレーム9000設定)。

x1モードでは6Gbps前後で頭打ちとなる

 続いて、UEFIで「4X」に固定した場合の値が以下だ。ご覧の通り、一気に10GbEの上限に近い9.8Gbpsの速度に向上した。

x4モードにすると、9Gbps以上で通信可能に。10GbEの実力を発揮できるようになった

10GbE NIC動作チェックリスト

 というわけで、10GbEで速度が出ないと悩んでいる場合は、以下の項目をチェックしてみることをお勧めする。

  • □装着しているスロットの物理的な形状がx4以上か?
  • □スロットはPCI 3.0 x4モード以上の対応か?(物理的な形状がx16でもモードが異なる場合もある)
  • □UEFIでPCIスロットの転送速度がx4モードになっているか?(自動ではなく固定する)
  • □CPU性能は十分か?(NICによってはCPU負荷が高い)
ジャンボフレームやバッファのチューニングよりもまずはPCIeのモードを確認することが重要

 あとは、様子を見ながら全ての機器でジャンボフレームを9000以上に設定したり、NICのプロパティで受信や送信のバッファ容量を増やしたりしてみるのもいい。しかし、こうした細かなデバイスパラメーターの調整よりも、まずはPCIeスロットの「現在のリンク幅」が重要だ。

 知らず知らずのうちにx1で接続されている場合もあるので、確認してみることをお勧めしたい。

清水 理史

製品レビューなど幅広く執筆しているが、実際に大手企業でネットワーク管理者をしていたこともあり、Windowsのネットワーク全般が得意ジャンル。最新刊「できる Windows 10 活用編」ほか多数の著書がある。