web-dev-qa-db-ja.com

低レイテンシの書き込みJava

Javaで低レイテンシコードを記述するためのJava固有のテクニック(C++には当てはまらないもの)はありますか?私はしばしばJava低レイテンシの役割を見て、彼らは低レイテンシJavaを書く経験を求めます-これは時々ちょっとした矛盾のように見えます。

私が考え得る唯一の考えは、JNIの経験、ネイティブコードへのI/O呼び出しのアウトソーシングです。ディスラプターパターンを使用する可能性もありますが、それは実際のテクノロジーではありません。

低レイテンシコードを書くためのJava特定のヒントはありますか?

リアルタイムがあることを知っていますJava仕様ですが、リアルタイムは低遅延と同じではないという警告を受けています...

32
user997112

Martijnのコメントに加えて 追加します:

  1. JVMをウォームアップします。バイトコードの開始は、ホットスポットの解釈から始まり、 10Kの観測 の後にサーバーでコンパイルされます。階層型コンパイルは、良いストップギャップになる可能性があります。

  2. クラスローディングは、IO to disk)を伴う順次プロセスです。メイントランザクションフローのすべてのクラスが事前にロードされ、perm世代から追い出されないことを確認してください。

  3. 単一の作家の原則 」に従って、リトルの法則の競合とキューイング効果の影響を回避し、さらに並列化できるものとその価値についてアムダールの法則を研究します。それ。

  4. ビジネスドメインをモデル化し、すべてのアルゴリズムがO(1)または少なくともO(log n)であることを確認します。これがおそらく私の経験におけるパフォーマンスの問題の最大の原因です。パフォーマンスを確認してください主なケースをカバーするテスト。

  5. Javaの低レイテンシは、Javaに限定されているわけではありません。コードが実行されているスタック全体を理解する必要があります。これには、OSのチューニング、適切なハードウェアの選択、システムソフトウェアとデバイスドライバーのチューニングが含まれます。そのハードウェアのために。

  6. 現実的になる。低レイテンシが必要な場合は、ハイパーバイザーで実行しないでください。実行可能状態にする必要があるすべてのスレッドに対して十分なコアがあることを確認してください。

  7. キャッシュミスは、パフォーマンスに対する最大のコストです。キャッシュに適したアルゴリズムを使用し、JVMにはタスクセットまたはnumactlを、個々のスレッドにはJNIを使​​用して、プロセッサコアにアフィニティを設定します。

  8. 一時停止のないガベージコレクターを備えた、AzulのZingなどの代替JVMを検討してください。

  9. 最も重要なことは、誰かを経験に関わらせることです。これにより、長い目で見れば時間を大幅に節約できます。恥知らずなプラグ:-)

リアルタイムと低レイテンシは、しばしば関連していますが、明確に別のテーマです。リアルタイムとは、高速というよりは予測可能であることです。私の経験では、リアルタイムJVMは、ソフトリアルタイムJVMであっても、通常のJVMよりも低速です。

38
Martin Thompson

知っておくべきことがたくさんあります。現時点ではネットアクセスが限られているクレタ島にいるので、これは(かなり)短くなります。また、私は低レイテンシの専門家ではありませんが、同僚の何人かは実際に1人でプレイしています:-)。

  1. あなたは機械的同情( Martin Thompson によって造語された用語)に感謝する必要があります。つまり、基盤となるハードウェアが何をしているかを理解する必要があります。 CPUがキャッシュラインをロードする方法、読み取り/書き込み帯域幅、メインメモリの速度などを知ることは非常に重要です。どうして? JavaソースコードがランタイムJVMを介してOperatingSystem/Hardwareにどのように影響するかを推論する必要があるためです。たとえば、ソースコードでフィールド変数がレイアウトされる方法により、キャッシュラインが発生します立ち退き(150クロックサイクルのコスト)、うーん... :-)。

  2. 通常、ロックフリーのアルゴリズムとI/Oが必要です。 (ロックを使用する)最もよく設計された並行アプリケーションでさえ、ブロックの危険にさらされています。低遅延でのブロックは一般的に悪いです:-)。

  3. オブジェクトの割り当てとガベージコレクションを理解する。これは大きなトピックですが、基本的にはGCの一時停止を避けたいです(多くの場合、さまざまなGCコレクションのStop the Worldの性質によって引き起こされます)。 Azulコレクターのような専門のGCコレクターは多くの場合、この問題をすぐに解決できますが、ほとんどの人にとって、Sun/Oracle GC(CMS、G1など)のチューニング方法を理解する必要があります。

  4. Hotspot JITはすごいです。その最適化について学びますが、一般的に言えば、優れたOOテクニック(カプセル化、小さなメソッド、できるだけ多くの不変データ)のすべて)は、JITを最適化し、次のようなパフォーマンスレベルを提供します。巧妙に作成されたC/C++コードが提供します。

  5. 全体的なシステムアーキテクチャ。ネットワーク、マシンが同じ場所に配置されている方法、ファイバーなどを介して取引所に接続している場合などに注意してください。

  6. ロギングの影響に注意してください。バイナリのログを記録するか、オフラインで解析できるコード化された出力を使用することは、おそらく良い考えです。

全体的に続けることを強くお勧めします Kirk PepperdineのJavaパフォーマンスチューニングコース [免責事項:このコースは自分で教えるので、偏見があります]。 JVMのさまざまな側面と、基盤となるO/Sおよびハードウェアへの影響の概要。

PS:私はこれを後で再訪して、いくつか整理するつもりです。

23
Martijn Verburg