Intel 82599:出力速度の制限

みなさんこんにちは!



この記事では、Intel 82599ネットワークカードの便利な機能について説明します。

出力パケットストリームの速度を制限するハードウェアについてです。



残念ながら、Linuxでは「すぐに使える」ものではなく、使用するのに多少の手間がかかります。

誰が気にします-猫へようこそ。











すべては、先日、トラフィックをフィルタリングする機器をテストしたという事実から始まりました。







MXデバイスはDPIデバイスです。 10Gからのパケットを解析し、指定された基準(アドレス、ポートなど)に該当する場合、ギガビットポートに送信します。 PC側には、 ixgbeドライバーを備えたIntel 82599カードがあります。 トラフィックはtcpreplayを使用して生成され、 tcpdumpを使用して収集されました。 テストトラフィックを含むダンプがありました(問題の条件に応じて指定)。



一般的な場合、10Gをフィルタリングして結果を1Gに送信することはできないため(速度は異なりますが、バッファーはゴムではありません)、パケット生成の速度を制限する必要がありました。 ここで、負荷テストは実行しなかったが機能していると言うことが重要です。そのため、10Gの負荷はそれほど重要ではなく、テストの期間にのみ影響しました。



タスクは単純に解決されているように見えます: man tcpreplayを開き、 そこで-Mスイッチを確認してください。

以下を開始します。



$ sudo tcpreplay -M10 -i eth3 dump.cap
      
      







その結果、MX統計に以下が表示されます。

 | Name | Packets | Bytes | Overflow pkt | | EX1 to EG1| 626395| 401276853| 53| | EX1 to EG2| 0| 0| 0| | EX1 RX| 19426782| 4030345892| 0|
      
      







オーバーフローpktは、一部のパッケージが1Gに適合しなかったことを意味します。 出力バッファがオーバーフローしました。 これは、PCが53パケットに到達しなかったことを意味します。 そして、フィルターの正しい機能をチェックするため、本当に必要です。



82599ネットワークカードは、tcpreplayで設定されている速度に関係なくバーストを作成することがわかります。



リンクに最も近いレベルで10Gの負荷を制御する方法について疑問が生じました。 そして、そのカードはすでにその方法を知っているというアイデアを得ました。 そうです! データシートには、セクション1.4.2 Transmit Rate Limitingで確認があります。 この機能を管理する方法を学ぶことだけが残っています。



私たちのコア(これは3.2、debianで遊んでいました)でこの(sysfsに必要なファイル)のレバーを見つけられませんでした。 新しいカーネルソート(3.14)を調べたところ、そこでも見つかりませんでした。



githubには tx-rate-limits というプロジェクトが既にあることが判明しました。



その後、すべてが簡単です:)カーネルを組み立てて、システムに配置します:

 $ git checkout https://github.com/jrfastab/tx-rate-limits.git $ cd tx-rate-limits $ fakeroot make-kpkg --initrd -j 8 kernel-image $ sudo dpkg -i ../linux-image-3.6.0-rc2+_3.6.0-rc2+-10.00.Custom_amd64.deb
      
      







再起動し、... sysfsに送信負荷を管理するファイルが追加されました!

 $ ls /sys/class/net/eth5/queues/tx-0/ byte_queue_limits tx_rate_limit tx_timeout xps_cpus
      
      







次に、必要な値をメガビット単位でtx_rate_limitに書き込みます。



 # RATE=100 # for n in `seq 0 7`; do echo $RATE > /sys/class/net/eth4/queues/tx-$n/tx_rate_limit ; done
      
      







その結果、MX統計では、オーバーフローが発生しないことがわかります。 速度はカードによって制御され、バーストはなくなり、フィルタリングされたトラフィックはすべて損失なしで1Gになります。



 | Name | Packets | Bytes | Overflow pkt | | EX1 to EG1| 22922532| 14682812077| 0| | EX1 to EG2| 0| 0| 0| | EX1 RX| 713312575| 147948837844| 0|
      
      







おそらく、この問題を解決する簡単な方法があります。



誰かが共有してくれたらとても感謝しています。



UPD:

送信レート制限の仕組みを書くのを忘れていました。



IPG(Inner Packet Gap)を変更します。 つまり、データリンク層で、パケット間の遅延を制御します。

したがって、パケット間の時間間隔とパケットの均一なフローをハードウェアで制御できます。

そして最も重要なこと-バーストがないことのハードウェア保証があります:)



All Articles