バックグラウンド
Wiresharkという有名なツールがあります。私は何年もそれを使用してきました。それは素晴らしいですが、パフォーマンスが問題です。一般的な使用シナリオには、後で分析するデータ サブセットを抽出するためのいくつかのデータ準備手順が含まれます。そのステップがなければ、フィルタリングを行うのに数分かかります (トレースが大きいと、Wireshark はほとんど使用できなくなります)。
実際のアイデアは、データ アグリゲーター/ストレージとして使用される、高速で並列かつ効率的な、より優れたソリューションを作成することです。
要件
実際の要件は、最新のハードウェアによって提供されるすべての電力を使用することです。さまざまな種類の最適化の余地があると言わざるを得ません。上位層でうまくいったことを願っていますが、現在の主な問題はテクノロジです。現在の設計によると、パケット デコーダ (ディセクタ) にはいくつかの種類があります。
- インタラクティブ デコーダー: デコード ロジックは実行時に簡単に変更できます。このようなアプローチは、プロトコル開発者にとって非常に便利です。デコード速度はそれほど重要ではありませんが、柔軟性と高速な結果がより重要です。
- 組み込み可能なデコーダー: ライブラリーとして使用できます。このタイプは、優れたパフォーマンスを持ち、利用可能なすべての CPU とコアを使用するのに十分な柔軟性を備えていると想定されています。
- サービスとしてのデコーダー: クリーンな API を介してアクセスできます。このタイプは、最高のパフォーマンスと効率を提供する必要があります
結果
私の現在の解決策は、JVM ベースのデコーダーです。実際のアイデアは、コードの再利用、移植の排除などですが、それでも効率は良好です。
- 対話型デコーダー: Groovy に実装
- 組み込み可能なデコーダー: Java で実装
- サービスとしてのデコーダー: Tomcat + 最適化 + サーブレットにラップされた組み込み可能なデコーダー (バイナリー入力、XML アウト)
解決すべき問題
- Groovy は多くのパワーとあらゆるものへの道を提供しますが、この特定のケースでは表現力に恵まれていません
- ツリー構造へのプロトコルのデコードは行き止まりです -- あまりにも多くのリソースが単純に無駄になります
- メモリ消費量を制御するのはやや困難です。いくつかの最適化を行いましたが、プロファイリングの結果にまだ満足していません
- さまざまな付加機能を備えた Tomcat では、依然として多くのオーバーヘッドが発生します (主に接続処理)。
どこでも JVM を正しく使用していますか? 最初の目標を達成するための他の優れたエレガントな方法はありますか?
プロトコル、結果の形式などは固定されていません。