2 つの 10 GbE カード間を接続する CX4 ケーブルで接続された 2 つの Debian ボックスがあります。1 つは非常に高速にデータを生成し (4Gbit/s から 16Gbit/s の間)、もう 1 つはそのすべてを取得して、後で解析するために RAM に格納できる必要があります。私はこの種の低レベルのコーディングに慣れていないので、どのような幅広いアプローチを使用するか (DMA が必要ですか? RDMA が必要ですか?)、または適用される可能性のあるヒントやトリックについてのアイデアを喜んで受け入れます。ありがとう!
7 に答える
あらゆる種類の後処理のために飽和した 10GbE をユーザー空間にプルアップする処理を処理する通常の PC で使用できると聞いた唯一の nic は、Napatech によって製造されたものです。カスタム API を使用する必要があります。
そして、そのような速度をサポートするバス配管を備えたかなり成長したサーバーにそのようなカードを配置することをお勧めします(私は確かに、そのようなボックス用のあらゆる種類のnvidiaチップセットから離れます.)
特別なプログラミングを計画する前に、いくつかのテストを行って、バニラ システムでどれだけ処理できるかを確認する必要があります。プロデューサ マシンにモック データ ファイルと送信プロセスをセットアップし、コンシューマ マシンに単純なアクセプタ/パーサーをセットアップして、一連のプロファイリングを実行します。どこでデータの問題が発生するのでしょうか? より良いハードウェアを投入できますか、それとも処理を微調整して高速化できますか?
期待するデータ レートをサポートできるハードウェア プラットフォームから始めていることを確認してください。Intel の 82598EB NIC などを使用している場合は、NIC からチップセットまでの全帯域幅を確保するために、PCIe 2.0 スロット (できれば x16 スロット) に接続していることを確認してください。
設定を最大限に活用するために、NIC ドライバーのパラメーターをデータストリームに合わせて調整する方法があります。たとえば、TCP オーバーヘッドを最小限に抑えるために、リンクでジャンボ フレームを使用していることを確認してください。また、ドライバーの割り込みスロットル レートを操作して、低レベルの処理を高速化することもできます。
データセットの処理は並列化可能ですか? データをメモリにダンプするタスクが 1 つある場合、さらにいくつかのタスクを設定して、データのチャンクを同時に処理できますか? これにより、マルチコア CPU を有効に活用できます。
最後に、これでも十分でない場合は、収集したプロファイリング/タイミング データを使用して、パフォーマンスを向上させるために調整できるシステムの部分を見つけます。微調整が必要な場所を知っていると思い込まないでください。実際のデータでバックアップしてください。驚くかもしれません。
毎秒 1 GB のトラフィックを常に処理したい場合は、非常に幅の広いバスと非常に高速な処理速度が必要です。私の経験はNIDSから得たものです。100MB (1 Gig イーサネット) のデータ (10 Gb は別の宇宙) の NIDS 処理を一貫して実行するには、特殊なハードウェアが必要です。5 ~ 10 秒で 1 GB を埋めることができ、1 GB には多くの要求が保持されるため、RAM は役に立ちません。
何らかの形態のビジネスまたは Web 処理を 10 ギガで実行しようとしている場合は、おそらく 10 GB のトラフィックに対応できるロード ディストリビューターを前面に配置する必要があります。
ps、NIDS は、トラフィックを確認するマシンで処理される 1:1 トラフィックであることを明確にする必要があります。つまり、同じマシンですべてのバイトを処理する最悪のシナリオです。一方、ビジネス/Web 処理は 1 対多: 多数のマシンと桁違いのバイト数で処理されます。
- 編集 -
データ配信間にギャップがあると述べたので (標準の 10Gb NIC はとにかく 10Gb に追いつくことはできません)、提案を行う前に処理の内容を知る必要があります。
-- 編集 2 --
複数のスレッドを使用すると、Berkeley DB (単純なデータ モデルのデータベース) は (トランザクション レートの点で) エンタープライズ データベースのように動作します。高速でディスクに書き込みたい場合は、おそらくこのソリューションを検討する必要があります。スループットを向上させるには、おそらく RAID セットアップが必要です。RAID 0+1 は、IO スループットと保護の点で最適です。
さて、お金が必要になります。1 つの方法は、負荷分散スイッチを購入して、受信データを 2 台のコンピューターに分割し、後処理して単一のデータベースにすることです。
状況を単純化するいくつかの側面があるため (2 台のマシン間の安定したポイント ツー ポイント、処理なし)、実際には、システム間で単一の TCP ストリームを使用write()
し、ディスクにデータを書き込む簡単で明白な方法を試みます。次に、パフォーマンスとプロファイルを測定して、ボトルネックがどこにあるかを判断します。
出発点として、ほとんどの高性能サーバーが開発されているC10K (10000 同時接続) 問題について読んでください。ハイ パフォーマンス サーバーの問題に関する強力な背景情報が得られるはずです。もちろん、新しい接続を確立するために select / poll / epoll について心配する必要はありません。これは大幅な簡素化です。
最近の Linux カーネルは nic->kernel からの 10Gb パケットをサポートしていると思いますが、i7/XEON 5500 プラットフォームで遊んでも、ユーザー空間にデータをコピーする効率的な方法があるとは思えません。
忘れられているように見えること: NIC が 10 GB で、レシーバーが心配な場合は、(比較的) 安心できます: ソースがその速度でデータを生成できたとしても、そのデータをサーバーに転送する際に同じ問題が発生します。受信機がラインからRAMにそれを取得しているため、10GBライン。
また、NIC が 10GB の場合、ビットはその速度でクロックされることを意味しますが、単一パケット間の時間については何も言われておらず、プロトコルについてはまだ話していません.
その間、この質問はOPでは廃止されたと思いますが、そのような割り当てがある場合は、特別なケースに必要な速度の向上を判断できるように、定期的にプログラムされたソリューションから始めてください(あなたのケースは常に特別です;- )