web-dev-qa-db-ja.com

低遅延プログラミング

私は低レイテンシの金融システムについて(特に、企業スパイの有名な事件以来)多くのことを読んでおり、それ以来、低レイテンシシステムのアイデアが頭に浮かびました。これらの人がやっていることを使用できるアプリケーションは100万あるので、このトピックについて詳しく知りたいと思います。問題は、そのトピックについて何か価値のあるものを見つけることができないことです。低遅延システムの本、サイト、例を誰かが推薦できますか?

44
Sambatyon

私は取引所と直接通信するための低レイテンシソフトウェアを作成する金融会社で働いています(取引の送信と価格のストリーミング用)。現在、主にJavaで開発しています。低レイテンシの面は私が直接作業する領域ではありませんが、必要とされるスキルセットについての公正な考えがあります。それは私の意見では以下を含みます。

  • Javaメモリモデルと、不要なガベージコレクション(オブジェクトプーリングなど)を回避するための手法)の詳細な知識。使用される手法の一部は、従来のOO環境では通常「アンチパターン」と見なされます。 。
  • レイテンシのデバッグと測定のためのユーティリティ(SolarisのDTraceなど)を含む、TCP/IPおよびUDPマルチキャストの詳細な知識。
  • アプリケーションのプロファイリングの経験。
  • Java.nioパッケージに関する知識、NIOベースのスケーラブルなサーバーアプリケーションの開発経験、ワイヤプロトコルの設計経験。また、フレームワークや外部ライブラリ(Google Protobufなど)の使用は通常避けて、多くのカスタムコードを作成することを推奨しています。
  • FIXおよび商用FIXライブラリ(Cameron FIXなど)に関する知識。

残念ながら、スペックに基づいて価格サーバーまたはトレーディングエンジンを実装して得られた経験に代わるものがないため、スキルの多くは「仕事で」しか開発できません。取引所またはベンダーから。ただし、私たちの会社がこの(または他の)ニッチな領域で少なくとも特定の経験を探すのではなく傾向があることも言及する価値があります。代わりに、優れた分析および問題解決スキルを持つ人々を雇うことを好みます。

45
Adamski

低レイテンシは多くのものの機能であり、2つの最も重要なものは次のとおりです。

  • ネットワークレイテンシ-つまり、ネットワークでメッセージの送受信にかかる時間。
  • 処理レイテンシ-つまり、アプリケーションがメッセージ/イベントを処理するために要した時間。

したがって、注文照合システムを作成していると言えば、ネットワーク遅延は、注文照合リクエストをネットワーク内でどれだけ早く受信できたかを表します。また、処理レイテンシは、アプリケーションが既存の開いている注文と注文を照合するのにかかる時間を表します。

Infinibandネットワークでのマルチキャスト、UDP、信頼性の高いマルチキャスト、カーネルバイパス(Java 7、Informatica Ultra Messagingなどでサポート))は、この分野のすべての企業で使用されている一般的なテクノロジーです。

さらに、低遅延アプリケーションを処理するための設計パターンを実装する、disruptor(http://code.google.com/p/disruptor/)などの低遅延プログラミングフレームワークがあります。あなたを殺す可能性があるのは、メインのワークフローの一部としてDBまたはログファイルに書き込む必要があることです。解決しようとしている問題の要件を満たす独自のソリューションを考え出す必要があります。

Javaなどの言語では、ガベージを(ほとんど)作成しないようにアプリを実装することがレイテンシにとって非常に重要になります。 Adamskiが言うように、Javaメモリモデルについての知識は非常に重要です。さまざまなJVMの実装とその制限を理解してください。一般的なJava小さなオブジェクトの作成に関する設計パターンウィンドウから捨てる最初のものです-Java低レイテンシを実現するのに十分なガベージコレクターを修正することはできません-修正できる唯一のことはガベージです。

幸運を!

24
inder

この投稿には多くの良い答えがあります。私の経験も追加したいと思います

  • Javaで低レイテンシを実現するには、JavaでGCを制御する必要があります。たとえば、オブジェクトを事前に割り当てる(つまり、フライウェイトデザインパターンを使用する)、プリミティブオブジェクトを使用するなど、多くの方法があります- troveはそのために非常に適しています。すべてのデータ構造はプリミティブに基づいています。たとえば、新しいオブジェクトの作成を減らすためにシステム全体のディクショナリを作成するためにオブジェクトインスタンスを再利用します。stream/ socket/dbからデータを読み取るときの非常に良いオプション

    • 待機フリーアルゴ(少し難しい)を使用して、フリーアルゴをロックしてください。あなたはそのための例のトンを見つけることができます

    • インメモリコンピューティングを使用します。メモリは安価で、テラバイトのデータをメモリに保持できます。

    • ビット単位のアルゴリズムを習得できれば、非常に優れたパフォーマンスが得られます。

    • 機械的な同情を使う-lmaxかく乱器、優れたフレームワークを紹介する

8
Ashkrit Sharma

低遅延プログラミングについていくつかコメントしたいと思います。現在、金融ソフトウェアで低レイテンシおよび高実行エンジンを開発した経験は5年以上あります。

レイテンシとは何かを理解する必要がありますか?

レイテンシとは、プロセスを完了するのに時間がかかることを意味します。 Java、c ++ 、. netなど、使用している開発ツールに依存する必要はありません。プログラミングスキルとシステムに依存します。

Javaを使用していると仮定しますが、1つの間違いによりプロセスが遅延する可能性があります。たとえば、価格更新のたびにいくつかの関数を呼び出すなどの取引アプリケーションを開発したとします。これにより、余分な変数、不要なメモリの使用、プロセスの遅延を引き起こす可能性のある不要なループが発生します。netで開発された同じアプリケーションは、Javaよりもパフォーマンスが良い場合があります。

また、アプリケーションがマルチスレッド化されている場合、マルチプロセッサシステムが適切に機能する可能性があるなど、サーバーシステムにも依存します。

7
harshad lakkad

ZeroMQを見てください。 http://www.zeromq.org

そのサイトのホワイトペーパーを読むと、低レイテンシプログラミングに必要なものについての洞察が得られます。

6
Ed James

まあ、それは単に「伝統的な」リアルタイムプログラミングではなく、そのすべてです。私は証券取引所で働いています-スピードは王様です。典型的な問題は、ファイルに書き込む最も速い方法は何ですか?オブジェクトをシリアル化する最も速い方法は?等.

5
alex lerner

Java低レイテンシの開発に関心がある場合は、ガベージコレクターを制御下に置いておけば、RTSJ(リアルタイム)JVMがなくても実行できることを知っておく必要があります。 Java GCオーバーヘッドのない開発)について説明している この記事 を見てください。 私たちのサイト には、他にも多くの記事があります。低遅延Javaコンポーネント。

4
rdalmeida

リアルタイムプログラミングに関することなら何でもいいでしょう。それは正確にはあなたが求めているものではない、と私は思うが、それは始めるのに非常に良い場所だ。

4
Paul Sonier

低レイテンシのサーバー設計について話す場合、これらはいくつかの良い指針です: http://www.kegel.com/c10k.html http://pl.atyp.us/content/tech/ servers.html

2
sunil

http://g-wan.com/ ANSI Cスクリプトを使用して、すべて200 KBで実行します。

1
Michel

私が正しく覚えている場合、リアルタイムでJava( [〜#〜] rtsj [〜#〜] )がこの領域で使用されていますが、良いものは見つかりませんでした今リンクする記事。

1
starblue

通常、低レイテンシ環境で作業することは、呼び出しの依存関係を理解し​​、依存関係を最小限に抑えるためにそれらを削減する方法を理解することを意味します。これには、必要なキャッシュ可能なデータを格納するためのデータ構造とライブラリの使用、相互依存性を減らすための既存のリソースのリファクタリングが含まれます。

1
Paul Sonier