私は PC Engines AP FreeBSDを実行しているデバイスをNATルーターとして使用しています。セットアップはごく普通です:1つのWAN接続および1つのLAN接続。
理論的には、WAN接続は800/40Mbit/s、LAN接続は1/1 Gbit/sです。実際には、ルーターはギガビットイーサネットを介してモデム(WAN)とNetgearスイッチ(LAN)に接続します。
高速PCをWAN接続(モデム))に直接接続すると、実際のダウンロード速度は約700 MBit/sに達する可能性があります。ただし、ルーターがその間にある場合は、パフォーマンスが大幅に低下します。ダウンロード速度が350MBit/sを超えることはありません。
これは、ルーターが十分に強力でないことで簡単に説明できます。
何が起こっているのかを確認しようとしましたが、接続を最大化しようとすると(実際の帯域幅は350 MBit/sと測定されます)、ルーターのCPUは両方とも約30%の時間アイドル状態です。
これは、CPUがボトルネックではないことを意味することを理解しています。 しかし、それでは、何ですか?ルーターが実際に何をしているのか、そしてなぜルーターが容量の半分でしか実行されていないのかを診断する方法はありますか?
私の質問をより明確にするために、ここにいくつかの追加の詳細があります。
まず、問題の視覚的表現:
次に、参考のために、top -S -C -H -P -s1 -ocpu
の出力
ルーターのトラフィックが非常に少ない場合:
last pid: 14077; load averages: 0.00, 0.00, 0.00 up 0+18:13:58 12:02:53
118 processes: 3 running, 98 sleeping, 17 waiting
CPU 0: 0.0% user, 0.0% Nice, 0.8% system, 0.0% interrupt, 99.2% idle
CPU 1: 0.0% user, 0.0% Nice, 0.8% system, 0.0% interrupt, 99.2% idle
Mem: 16M Active, 89M Inact, 130M Wired, 497M Buf, 3678M Free
Swap: 8192M Total, 8192M Free
PID USERNAME PRI Nice SIZE RES STATE C TIME CPU COMMAND
11 root 155 ki31 0K 32K CPU1 1 18.0H 100.00% idle{idle: cpu1}
11 root 155 ki31 0K 32K RUN 0 18.0H 100.00% idle{idle: cpu0}
14077 root 20 0 21996K 3120K CPU0 0 0:00 0.10% top
12 root -92 - 0K 272K WAIT 1 5:22 0.00% intr{irq259: re0
12 root -92 - 0K 272K WAIT 0 4:21 0.00% intr{irq260: re1
9 root -16 ki-1 0K 16K pollid 0 1:51 0.00% idlepoll
12 root -60 - 0K 272K WAIT 0 1:40 0.00% intr{swi4: clock
0 root -16 0 0K 160K swapin 1 0:37 0.00% kernel{swapper}
5 root -16 - 0K 16K pftm 0 0:31 0.00% pf purge
24147 root 20 0 12464K 2176K select 0 0:25 0.00% apinger
11846 root 52 20 17144K 2692K wait 1 0:12 0.00% sh
52774 root 20 0 28172K 18060K select 1 0:10 0.00% ntpd{ntpd}
15 root -16 - 0K 16K - 0 0:09 0.00% Rand_harvestq
87531 dhcpd 20 0 24820K 13576K select 1 0:08 0.00% dhcpd
44974 unbound 20 0 47020K 19840K kqread 0 0:08 0.00% unbound{unbound}
20 root 16 - 0K 16K syncer 0 0:05 0.00% syncer
そして、WAN接続を最大化しようとすると(その場合は318 MBit/sしか得られません):
last pid: 41402; load averages: 0.02, 0.01, 0.00 up 0+18:15:40 12:04:35
118 processes: 4 running, 98 sleeping, 16 waiting
CPU 0: 0.0% user, 0.0% Nice, 0.7% system, 34.3% interrupt, 64.9% idle
CPU 1: 0.0% user, 0.0% Nice, 0.0% system, 68.7% interrupt, 31.3% idle
Mem: 16M Active, 89M Inact, 130M Wired, 497M Buf, 3678M Free
Swap: 8192M Total, 8192M Free
PID USERNAME PRI Nice SIZE RES STATE C TIME CPU COMMAND
11 root 155 ki31 0K 32K CPU0 0 18.0H 82.86% idle{idle: cpu0}
11 root 155 ki31 0K 32K RUN 1 18.1H 69.87% idle{idle: cpu1}
12 root -92 - 0K 272K WAIT 1 5:27 32.86% intr{irq259: re0
12 root -92 - 0K 272K CPU0 0 4:23 17.19% intr{irq260: re1
14077 root 20 0 21996K 3232K CPU0 0 0:01 0.10% top
9 root -16 ki-1 0K 16K pollid 0 1:51 0.00% idlepoll
12 root -60 - 0K 272K WAIT 0 1:40 0.00% intr{swi4: clock
0 root -16 0 0K 160K swapin 0 0:37 0.00% kernel{swapper}
5 root -16 - 0K 16K pftm 1 0:31 0.00% pf purge
24147 root 20 0 12464K 2176K select 0 0:25 0.00% apinger
11846 root 52 20 17144K 2692K wait 0 0:12 0.00% sh
52774 root 20 0 28172K 18060K select 1 0:10 0.00% ntpd{ntpd}
15 root -16 - 0K 16K - 0 0:09 0.00% Rand_harvestq
87531 dhcpd 20 0 24820K 13576K select 1 0:08 0.00% dhcpd
44974 unbound 20 0 47020K 19840K kqread 1 0:08 0.00% unbound{unbound}
20 root 16 - 0K 16K syncer 0 0:05 0.00% syncer
私はRealtekRTL8211E phyチップを使用してボードを開発しましたが、ギガビット速度で動作できることを保証できます:)(実際には10/100/1000)。このphyチップの唯一の問題は、ギガビットインターフェイス(たとえばRGMIIなど)を使用してCPUに接続されていない場合です。インターネット上でルーターのPCBレイアウトを確認するために見つかりませんでした。
ただし、前に書いたように、デュプレックスのミスマッチのように聞こえる可能性が高くなります。
これはかなり古いトピックですが、とにかく貢献したいと思いました。あなたの場合のボトルネックはCPUです。このCPUには4つのコアがあり、おそらくコアの1つを使い果たしており、openBSDはおそらくルーティングにシングルスレッドを使用しています。
いくつかのオペレーティングシステムのAPUシステムでスループットテストを実行しました。結果はBSDとLinuxで異なります。
BSDベースのオペレーティングシステム(OpenBSD、pfSenseなど)はAPUで最大622Mbit/sですが、Linuxベースのシステム(IPFire、DD-wrtなど)は1Gbitを簡単に処理します。
実行されたベンチマークの詳細情報は次のとおりです。 https://teklager.se/en/knowledge-base/apu2c0-ipfire-throughput-test-much-faster-pfsense/
そして、BSDのスループットテストは次のとおりです。 https://teklager.se/en/knowledge-base/apu2c0-pfsense-network-throughput-test/
OpenBSDに取り組んでいない場合は、IPFireを試してください。それはあなたに完全なギガビットスループットを与えるでしょう。
CPUはまったくアイドリングしておらず、1つのコア68.7%、他の34.3%のビジー処理割り込みはアイドル状態ではありません。ユーザースペースはカーネルではなくアイドル状態です。
Openbsdに慣れていない場合、一方のコアがirq259を処理し、もう一方のコアがirq260を処理するようにCPUアフィニティを設定できますか。次に、各コアのビジー状態を確認します。
スピードテストを行った後のトップの「負荷平均」はどうですか? 1に達することはありますか?
CPUでない場合は、下位層に問題がある可能性がありますか? ethtoolまたはmii-toolが両方の場合(router-in-the-middleを使用する場合と使用しない場合)で1000FDを表示するかどうかを確認することをお勧めします。ルーターボードがいくつかのリンク設定を強制し、デュプレックスのミスマッチの問題が発生している可能性がありますか?
ルーターで「iperf-s」を実行して、クライアントとルーター間の接続がどのようになっているのかを確認できますか?
よろしく
これは、ネットワークカードと、それらとカーネル/ CPU間のパス(割り込み処理を含む)に関連するものである可能性があります。さまざまな「オフロード」設定の検証を検討する必要があります(申し訳ありませんが、私はFreeBSDに精通していないため、適切なツールを提案できません)。また、微調整できる他のネットワークカードドライバー固有の設定を探して、それらを試してみてください。
CPUが100%使用されていないことを考えると、問題は、システム内の他の何がパフォーマンスを制限しているのかということです。
私の賭けは、イーサネットチップにはジュースがないということです。質問のリンクによると、ボードはRealtekRTL8111Eチップを使用しています。このチップについては特に何も知りませんが、すべてのイーサネットカード/チップが同じように作成されているわけではないことは知っています。いくつかの簡単なグーグルは、Realtekが特に尊敬されているブランドではないことを示唆しています。
数年前の私自身のテストでは、すべてのオフロード機能を無効にしても、Intelの「サーバー」PCIEカードはラインレートで簡単に実行できることがわかりましたが、Intelの「クライアント」PCIEカードは実行できませんでした。サーバーカードは120ドル、クライアントカードは30ドルでした。図に行きます。
スループットを向上させるかもしれないが、待ち時間を損なう可能性がある1つのことは、割り込み合体が有効になっているかどうかを確認することです(Linux用語-freeBSDでの構成方法がわからない)。