web-dev-qa-db-ja.com

Intel 10 Gbeを使用してLinuxルーター/ファイアウォール転送のパフォーマンスをトラブルシューティングするにはどうすればよいですか?

2つの外向きの10Gbeアダプター(Intel 82599EB)と1つの内向きの10Gbeアダプター(Intel 82598EB)を備えたLinuxファイアウォールがあります。

私が経験している問題は、ファイアウォールがインバウンドトラフィックを非常に低いレート(約2 Mbps未満)でのみ転送することです。ただし、ファイアウォールから「内部」マシンへの直接接続は最大6 Gbpsを取得し、外部マシンからファイアウォールへの直接接続は最大1Gbpsを取得します。明確に行う必要のある調整がいくつかありますが、それらはGbpsの速度を示しています。

最近、2.1.4ドライバー(ロックアップ)の安定性に関する懸念から、Intel ixgbeドライバーをバージョン2.1.4から3.7.14に更新しました。これは、スループットの問題が始まったときのようです。

3.7.17リリースも試しましたが、これにより3.7.14と同様のパフォーマンスが得られました。 2.1.4ドライバー(IXGBE_NO_LROおよびIXGBE_NO_NAPIを使用して更新されたカーネル用に再コンパイル)に戻すと、〜Gbpsのスループットを得ることができました(iperf over TCP with 3スレッド)。

これで当面の問題は解決しますが、バグ修正などに遅れずについていきたいので、現在のバージョンのドライバーを使用したいので、私の質問は

  • Linuxルーター/ファイアウォール転送のパフォーマンスをトラブルシューティングするにはどうすればよいですか?

具体的には、カーネル/ iptables /ネットワークドライバーなどがパケットの転送に時間を費やしている場所をどのように見つけることができますか?

関連するアドバイスをいただければ幸いです。

4

1 Gbpsのルーティングパフォーマンスしか得られないのは本当に奇妙です(厳しいフィルタリングでも、通常、同じデバイスのカーネルスペースから2つのコピー、おそらくルーティングの4倍を意味します)-1年前に120Gbpsのルーティングパフォーマンスを得ることができるLKMLの投稿がありましたixgbeデバイスを備えた2.6.3Xシリーズ。私は主にIntel10GbE NICを使用しており、通常、スイッチドインフラストラクチャ上でiperfを使用して1000MByte/s +を取得します。

最初に、システムがプレーンTCPで、エンドポイント間にiperfなどを使用してどのように動作するかを確認する必要があります。これでベースラインが得られるはずです。10Gbpsワイヤが必要な場合は、さまざまなことが関係することに注意してください。ネハレム以前のプラットフォームでは、これを達成することさえ不可能です。また、システム負荷はNUMAレイアウトと一致する必要があり、NICは同じPCIコンプレックスに接続する必要があります(これは、8 Gbps未満でスタックしている場合に重要です) .ixgbeソースディストリビューションにはIRQピン留めスクリプト(省電力やキャッシュを台無しにするだけでトポロジを認識しないirqbalancerなども無効にします)があり、RX-TXキューをすべてのコアに均等にレイアウトする必要があります(しばらくしてチェックしました)。

タイミングに関する質問に関しては、プロファイリングサポートでコンパイルされたカーネルとoprofileのようなシステムレベルのプロファイラーが必要です。

パケットフィルタリングまたはルーティングを有効にして投稿する前に、エンドポイント間のパフォーマンスを改善してください。

4
pfo

数ヶ月前、私はたくさんの小さなパケットを使ったワイヤースピードギガビットルーティングのためにLinuxを最適化することに多大な努力を払いました。これはロードバランサー(IPVS)用であり、NATファイアウォールではありません。これに基づくヒントをいくつか示します。

  • Linuxカーネルを少なくとも2.6.30にアップグレードします(更新されたBroadcom bnx2ドライバーが必要でした)
  • Ifconfigを使用して、あらゆる種類のエラー/ドロップなどのインターフェイスを確認します
  • 最新のethtoolをダウンロードしてコンパイルし、NICドライバー)を完全にサポートしていることを確認します
  • Ethtoolを使用して、より詳細な統計を探します
  • Ethoolを使用して合体、NAPIなどの設定を調整し、割り込みを最小限に抑えます
  • Irqbalanceを調べて、CPUコア間でバランスが取れていることを確認します
  • Ksoftirqdのようなカーネルスレッドを見てください...それらは多くのCPUを使用していますか?
  • Rmmodを使用してカーネルモジュールをアンロードすることにより、iptablesを完全に無効にします。特にNATとconntrackは、すべてのルールをフラッシュしてチェーンが空であっても、大きな悪影響を与える可能性があります。これを行うと、パフォーマンスが大幅に向上します。これはファイアウォールだとおっしゃいましたが、ただし、NATおよびconntrackモジュールを一時的にアンロードして、違いが生じるかどうかを確認します。

スイッチング、ルーティング、ファイアウォールなど、カーネルネットワーク機能ごとに費やされた時間の内訳はまだ見ていません。

1
Wim Kerkhoff

一方向の注入パフォーマンスは、NICのtcpセグメンテーションオフロードおよびその他の設定の問題が原因である可能性があります。多くの場合、それは発見されるかもしれません、例えば。 VMまたはVPNトラフィックが物理NICを通過します。ethtoolを使用して無効にしてパフォーマンスを確認するのは簡単なので、試す価値があります(テストのために両方のエンドポイントで無効にしてください)。

/usr/sbin/ethtool -K eth0 tso off
/usr/sbin/ethtool -K eth0 lro off

ここにもう少し背景があります:

http://www.peerwisdom.org/2013/04/03/large-send-offload-and-network-performance/https://social.technet.Microsoft.com/Forums/windowsserver/en-US/bdc40358-45c8-4c4b-883b-a695f382e01a/very-slow-network-performance-with-intel-nic-when-tcp-large-send-offload-is-enabled?forum = winserverhyperv

0
Dmitriusan

Iptablesは、Linuxシステムにとって本当に効率的なファイアウォールです。優れたルールセットを作成していれば、ボトルネックを開始することなく大量のトラフィックを処理できます。

できることの1つは、すべてのルールをフラッシュしてiptablesを無効にし、デフォルトのFORWARDポリシーをACCEPTに設定することです。このようにして、iptablesの実装に関する懸念を排除できます。その後、ネットワークドライバーを確認し、問題が解決しない場合はデバッグを試みることができます。

アドバイスとして、自分が何をしているのかを理解していない限り、公的にアクセス可能なマシンでiptablesを無効にしないように注意してください。

0
Khaled