低レイテンシJavaの記述[終了]


30

Javaで低レイテンシコードを記述するためのJava固有の手法(C ++には当てはまらないもの)はありますか?私はJavaの低レイテンシーの役割をよく見ますが、彼らは低レイテンシーのJavaを書いた経験を求めます。

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

低レイテンシコードを記述するためのJava固有のヒントはありますか?

リアルタイムJava仕様があることは承知していますが、リアルタイムは低遅延と同じではないと警告されています。


コレクションサイクルをトリガーする可能性のあるオブジェクトをあまり多く作成しないでください
ラチェットフリーク

@ratchet、ネットワークまたはディスクに関連するものはJNIでもあると思いますか?
ユーザー997112

その他のリンクとプレゼンテーションについては、Performance Java User's Group plus.google.com/u/1/communities/107178245817384004088
Peter Lawrey

sun.misc.Unsafeを使用して追加すると、直接または間接的に便利です。多くのUnsafeメソッドは組み込みとして扱われます。つまり、JNIを回避するマシンコードに置き換えられます。
ピーターローリー

主な手法は、GCのオーバーヘッドを完全に回避することです。この記事については、GCを使用しないJava開発
-rdalmeida

回答:


35

加えて、マルタインのコメント私は追加したいです:

  1. JVMをウォームアップします。バイトコードはHotspot用に解釈され始め、10Kの観測後にサーバー上でコンパイルされます。階層型コンパイルはストップギャップとして適切です。

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

  3. シングルライターの原則」に従って、リトルの法則の競合とキューイング効果の意味を回避し、さらに並行して何が価値があるかについてアムダールの法則を調べてください。

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

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

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

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

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

  9. 最も重要なのは、誰かを経験に関与させることです。これにより、長い目で見れば時間を大幅に節約できます。ハレンチプラグ:-)

リアルタイムと低遅延は、しばしば関連していますが、明確に別個の主題です。リアルタイムとは、高速よりも予測可能なことです。私の経験では、リアルタイムJVMは、ソフトリアルタイムJVMでさえ、通常のJVMよりも低速です。


2
+1がすばらしい答えです。このような送信処理の投稿に興味がある人は、研究の出発点として最適です。
マクフィニガン

23

はい、知っておくべきことがたくさんあります。私は現在、ネットアクセスが制限されているクレタ島にいるので、これは(かなり)短くなります。また、私は低遅延の専門家ではありませんが、私の同僚の何人かは実生活で1人を演じています:-)。

  1. Mechanical Sympathy(Martin Thompsonによって造られた用語)を高く評価する必要があります。つまり、基礎となるハードウェアが何をしているのかを理解する必要があります。CPUがキャッシュラインを読み込む方法、読み取り/書き込み帯域幅、メインメモリの速度などを知ることは非常に重要です。どうして?JavaソースコードがランタイムJVMを介してOperatingSystem / Hardwareにどのように影響するかを推論する必要があるからです。たとえば、ソースコードでフィールド変数をレイアウトする方法は、キャッシュラインエビクション(〜150クロックサイクルかかります)、hmmm ... :-)を引き起こします。

  2. 一般に、ロックのないアルゴリズムとI / Oが必要です。(ロックを使用する)最も適切に設計された並行アプリケーションでさえ、ブロッキングのリスクがあります。低レイテンシでのブロッキングは一般に悪いです:-)。

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

  4. Hotspot JITは驚異的です。その最適化について学びますが、一般的に言えば、すべての優れたオブジェクト指向技術(カプセル化、小さなメソッド、可能な限り多くの不変データ)によってJITが最適化され、巧妙に作成されたC / C ++コードが提供するさまざまなパフォーマンスレベルが得られます。

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

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

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

PS:これについては後で再検討し、整理してみます。


Mechanical Sympathyの経験者が、特定の境界を越えたことを検出するためのトリックをいくつか共有できれば、本当に素晴らしいでしょう。

Twitterにpingを送信して、本当の専門家を獲得しようと試みました:-)
Martijn Verburg

クール、マーティントンプソンは、私のアドバイスに値する価値があります。
マルタインVerburg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.