プログラム可能データプレーンにおけるフローイベントテレメトリー - SIGCOMM'20#
動機#
- ネットワークパフォーマンス異常(NPA)は、接続の喪失よりも発生しやすく、軽減が難しい。なぜなら、NPA は通常、短い時間スケールでランダムに発生し、ネットワークにわずかな痕跡を残すからである。
- NPA の原因となる場所は、ほとんどの場合、90%以上の時間を費やすボトルネックである。
- NPA の一部はネットワークによって引き起こされるが、多くのアプリケーションは通常、NPA をネットワークの障害の結果と見なすため、原因を特定するのに膨大な時間を浪費する。
- たとえネットワークが特定の NPA を引き起こしているとしても、NPA につながる可能性のある根本的な理由や場所は、クラウドネットワーク全体にわたって無数に存在する。
- 粗粒度のカウンターを組み合わせて原因を特定することは多くの時間を浪費し、エラーが発生しやすいが、細粒度のトラフィックミラーリングは混雑やパケットのドロップを引き起こす可能性がある。
- NPA の原因の場所を見つけた後の実際の回復操作は通常迅速である。
- NPA の原因となる場所は、ほとんどの場合、90%以上の時間を費やすボトルネックである。
- プログラム可能データプレーン(PDP)でのフローイベントテレメトリー(FET)を完全に実現することは合理的である。
- DP で FET を直接実行することで、監視トラフィックのボリュームとデータ処理のオーバーヘッドを削減できる。
- PDP の ASIC は、カスタマイズされたパケット処理ロジックを実行する際にラインレートを維持できる。
目的#
- フローイベントテレメトリーに基づくネットワークモニターを設計し、個々のフローを常に(常時)同時に監視し、サブセカンドレベルのフローイベントを包括的に検出し、以下の要件を満たすこと:
- カバレッジ:高速度の進行中のトラフィックからすべてのフローイベントを発見するのが実現可能であること。
- ASIC 内のイベントだけでなく、インターフェースやファイバー上のイベントも含む。
- スケーラビリティ:大規模な生産クラウドネットワークでも効果的に機能するのに十分なスケーラビリティを持つこと。
- イベントデータを圧縮する必要がある。
- 小サイズのイベントを再編成する必要がある。
- 精度:
- ゼロの偽陰性(FN)
- 非常に少ない偽陽性(FP)
- カバレッジ:高速度の進行中のトラフィックからすべてのフローイベントを発見するのが実現可能であること。
主なアイデア#
- フローイベント:混雑、パケットの一時停止、パスの変更、パケットのドロップ(スイッチ内ドロップ、スイッチ間ドロップ)
- 各プログラム可能スイッチは、元のトラフィックから包括的でコンパクトなフローイベントを導出するために以下のステップを踏む:
- イベントパケット検出:データプレーン内のパケット処理の各ステップを追跡し、各パケットに発生するすべてのイベント、特にパケットのドロップを検出する:
- スイッチ内パケットドロップ
- タイプ:パイプラインドロップ、混雑ドロップ
- 課題:プログラム可能なスイッチング ASIC の制限。
- 既存の解決策:プログラム可能なパイプラインの開始時にパケットの出現を記録し、パイプラインの末尾でパケットの出口を確認する。
- ハッシュテーブルなどの受け入れがたい大きなメモリを必要とする。
- 各パケットのためにタイマーを維持する必要がある。
- 同期メカニズムを要求する。
- 著者の解決策:ASIC 内の全パケット処理ロジックにドロップ検出ロジックを埋め込み、すべてのパケットドロップを報告する。
- 各タイプおよび理由のパケットドロップについて、NetSeer はそれらを検出するために対応する方法を使用する。
- スイッチ間パケットドロップ
- タイプ:サイレントパケットドロップまたは破損
- 課題:隣接する 2 つのスイッチ間の電気および光学コンポーネントに直接の可視性がない。
- 著者の解決策:隣接する 2 つのスイッチ間で 4 バイトの連続パケット ID を使用してパケットロスを検出する。
- リングバッファ内でのパケット番号付けと記録
- パケットの送信
- ロス検出
- ロス通知
- ロス回収
- 混雑、パスの変更、一時停止の検出
- 混雑:各パケットのキュー遅延を測定し、キュー遅延が閾値を超えるパケットを選択する。
- パスの変更:新しいフローの最初のパケットまたはポートが変更された古いフローのパケットをパス変更イベントパケットとして選択する。
- 一時停止:キュー状態検出器によって入口の対応するキュー状態を調べ、キューが一時停止している場合、そのパケットを一時停止イベントパケットとして特定する。
- スイッチ内パケットドロップ
- フローイベント生成と圧縮:1 つのフローに属する連続イベントパケットを単一のフローイベントに集約する。
- イベントパケットからフローイベントへ:イベントパケットをフローイベントに集約することで冗長性を排除し、各フローイベントに対して 1 つのカウンターを維持する - グループキャッシングに基づく重複排除アルゴリズム。
- イベント情報抽出:フローイベントから必要な情報のみを抽出することで監視トラフィックのボリュームを圧縮し、フローヘッダー、スイッチポートキュー、およびイベント固有のデータを含む。
- 循環フローイベントバッチ処理:イベントパケットをバッチ処理し、各パケット内に $\ge 1$ のイベントをパッキングして帯域幅のオーバーヘッドを削減し、CPU に優しい。
- スタックデータ構造を設計し、各受信イベントをスタックにプッシュして一時的にキャッシュする。
- パイプライン内で常に再循環する循環イベントバッチ処理パケット(CEBP)を生成する。
- CEBP がスタックにヒットすると、1 つのイベントをポップし、そのイベントをペイロードに追加する。
- ペイロードの長さが閾値を超えるか、すべてのイベントが収集されると、CEBP は CPU に転送され、後のイベントを収集するために空のペイロードでクローンされる。
- 偽陽性排除
- FP の定義:同じフローイベントに対する繰り返しのイベント報告。
- 著者の解決策:
- スイッチパイプラインが事前にハッシュ値を計算し、それをイベントに添付できるようにする。
- スイッチ CPU はインデックス用に直接値を取得できる。
- イベントパケット検出:データプレーン内のパケット処理の各ステップを追跡し、各パケットに発生するすべてのイベント、特にパケットのドロップを検出する:
- ネットワークインシデントのトラブルシューティングのために:NetSeer はネットワークオペレーターがネットワークの無実を主張したり、NPA の原因を迅速に特定したりするのを助けることができる。
- 故障した更新によって引き起こされたパス変更イベントを特定する - ネットワーク更新によるルーティングエラー。
- ACL によるパイプラインドロップを発見する - ACL 設定エラー。
- テーブルルックアップミスによるパイプラインドロップをキャッチし、フローを特定する - パリティエラーによるサイレントドロップ。
- MMU 混雑ドロップカウンターを確認して、混雑に最も寄与したフローを見つけ、適切にスケジューリングを行う - 予期しないボリュームによる混雑。
- どのスイッチによってどれだけのストレージパケットがドロップされたかを見つけ、ネットワークの責任を明確にすることでデバッグプロセスを加速する - SSD ファームウェアドライバのバグ。
強み#
- フローイベントの完全なカバレッジ:リンクの両側のプログラム可能性を活用して、スイッチ間ドロップイベントを共同で発見し、ドロップまたは破損したパケットのフロー情報を回復する。
- ネットワークサイズに対する良好なスケーラビリティ:
- データのプログラム可能性を最大限に活用してパケットを特定し、集約し、フローイベントを圧縮する。
- 小サイズのイベントメッセージを大きなパケットにバッチ処理し、データプレーン内の円形パケット駆動のイベント収集の新しい設計を使用する。
- 分散方式で FET を実行する。
- 高データ精度:イベント生成において 0 の FN を確保し、ASIC オフロードを使用して FP を発見し排除するためにスイッチ CPU を使用し、小さなオーバーヘッドで実現する。
弱み#
- NetSeer は ASIC または MMU ハードウェアの故障によるドロップをカバーできない。
- ミドルボックスは、デバイス間ドロップの認識、イベントベースの異常検出、信頼できる報告などのいくつかの原則に従う必要がある。