モスクワ取匕所の取匕および枅算システムのアヌキテクチャの進化。 パヌト2

モスクワ取匕所の取匕および枅算システムのアヌキテクチャの進化。 パヌト2

これは、Exchange の動䜜を保蚌する匷力で高負荷のシステムを䜜成するための、私たちの茚の道に぀いおの長い物語の続きです。 最初の郚分はここにありたす: habr.com/ru/post/444300

謎の゚ラヌ

数倚くのテストを経お、曎新された取匕および枅算システムが皌働したした。そしお、掚理小説を曞くこずができるようなバグに遭遇したした。

メむン サヌバヌで起動した盎埌、トランザクションの 2 ぀が゚ラヌで凊理されたした。 ただし、バックアップ サヌバヌではすべお問題ありたせんでした。 メむン サヌバヌ䞊で指数を蚈算する単玔な数孊的操䜜により、実際の匕数から負の結果が埗られるこずが刀明したした。 研究を続けたずころ、SSEXNUMX レゞスタで、浮動小数点数を扱う際の䞞めの原因ずなる XNUMX ビットの違いが芋぀かりたした。

䞞めビットを蚭定しお指数を蚈算する簡単なテスト ナヌティリティを䜜成したした。 私たちが䜿甚した RedHat Linux のバヌゞョンでは、䞍運なビットが挿入されたずきの数孊関数の操䜜にバグがあるこずが刀明したした。 私たちはこれを RedHat に報告し、しばらくしおからパッチを受け取り、公開したした。 ゚ラヌは発生しなくなりたしたが、このビットがどこから来たのかさえ䞍明でした。 関数がそれを担圓したした fesetround 私たちは、想定される゚ラヌを探すためにコヌドを慎重に分析し、考えられるすべおの状況をチェックしたした。 䞞めを䜿甚するすべおの関数を調べたした。 倱敗したセッションを再珟しようずしたした。 異なるオプションを備えた異なるコンパむラを䜿甚したした。 静的解析ず動的解析が䜿甚されたした。

゚ラヌの原因が芋぀かりたせんでした。

次に、ハヌドりェアのチェックを開始したした。プロセッサの負荷テストを実行したした。 RAMをチェックしたした。 XNUMX ぀のセルでマルチビット ゚ラヌが発生するずいう非垞にありそうもないシナリオのテストも実行したした。 無駄に。

最終的に、私たちは高゚ネルギヌ物理孊の䞖界からの理論に萜ち着きたした。぀たり、高゚ネルギヌ粒子がデヌタセンタヌに飛来し、ケヌスの壁を突き砎っおプロセッサヌに衝突し、トリガヌラッチがたさにその郚分に刺さったのです。 この䞍合理な理論は「ニュヌトリノ」ず呌ばれたした。 玠粒子物理孊から遠く離れおいる堎合は、ニュヌトリノは倖界ずほずんど盞互䜜甚せず、プロセッサの動䜜に圱響を䞎えるこずはできたせん。

障害の原因を特定できなかったため、念のため「問題のある」サヌバヌは運甚から削陀されたした。

しばらくしお、私たちはホット バックアップ システムの改善を開始したした。いわゆる「りォヌム リザヌブ」(りォヌム)、぀たり非同期レプリカを導入したした。 異なるデヌタセンタヌにある可胜性のある䞀連のトランザクションを受信したしたが、りォヌムは他のサヌバヌず積極的に察話したせんでした。

モスクワ取匕所の取匕および枅算システムのアヌキテクチャの進化。 パヌト2

なぜこれが行われたのでしょうか? バックアップ サヌバヌに障害が発生した堎合、メむン サヌバヌにりォヌム接続されたサヌバヌが新しいバックアップになりたす。 ぀たり、障害発生埌、システムは取匕セッションが終了するたで XNUMX ぀のメむン サヌバヌに留たりたせん。

そしお、新しいバヌゞョンのシステムがテストされ、運甚されるず、䞞めビット ゚ラヌが再び発生したした。 さらに、りォヌム サヌバヌの数が増加するず、゚ラヌが頻繁に発生するようになりたした。 同時に、具䜓的な蚌拠がなかったため、ベンダヌは䜕も瀺すこずができたせんでした。

次に状況を分析したずころ、問題は OS に関連しおいる可胜性があるずいう理論が浮䞊したした。 無限ルヌプで関数を呌び出す単玔なプログラムを䜜成したした。 fesetround、珟圚の状態を蚘憶し、スリヌプを通じお確認したす。これは倚くの競合スレッドで行われたす。 スリヌプずスレッド数のパラメヌタヌを遞択した埌、ナヌティリティを実行しおから玄 5 分埌にビット障害を䞀貫しお再珟し始めたした。 ただし、Red Hat サポヌトはそれを再珟できたせんでした。 他のサヌバヌをテストしたずころ、特定のプロセッサを搭茉したサヌバヌのみが゚ラヌの圱響を受けやすいこずが刀明したした。 同時に、新しいカヌネルに切り替えるこずで問題は解決されたした。 結局OSを入れ替えただけで、バグの本圓の原因は䞍明のたたでした。

そしお昚幎突然、ハブレに蚘事が掲茉されたした。Intel Skylake プロセッサのバグを芋぀けた方法」 そこに蚘茉されおいる状況は私たちの状況ず非垞に䌌おいたしたが、著者はさらに調査を進め、゚ラヌはマむクロコヌドにあるずいう理論を提唱したした。 たた、Linux カヌネルが曎新されるず、メヌカヌはマむクロコヌドも曎新したす。

システムの曎なる発展

゚ラヌは解消されたしたが、この話によりシステム アヌキテクチャを再考する必芁がありたした。 結局のずころ、私たちはそのようなバグの繰り返しから守られおいたせんでした。

次の原則は、予玄システムの次の改善の基瀎ずなりたした。

  • 誰も信甚するこずはできたせん。 サヌバヌが正しく機胜しない可胜性がありたす。
  • 倚数予玄。
  • コンセンサスの確保。 過半数の予玄ぞの論理的な远加ずしお。
  • 二重の倱敗が発生する可胜性がありたす。
  • 掻力。 新しいホット スタンバむ スキヌムは、以前のスキヌムよりも劣るものではありたせん。 取匕は最埌のサヌバヌたで䞭断されるこずなく続行されたす。
  • 遅延がわずかに増加したす。 ダりンタむムが発生するず、倚倧な経枈的損倱が発生したす。
  • ネットワヌクの盞互䜜甚を最小限に抑え、遅延を可胜な限り䜎く保ちたす。
  • 新しいマスタヌサヌバヌを数秒で遞択したす。

垂堎で入手可胜な゜リュヌションはどれも私たちには合わず、Raft プロトコルはただ初期段階にあったため、独自の゜リュヌションを䜜成したした。

モスクワ取匕所の取匕および枅算システムのアヌキテクチャの進化。 パヌト2

ネットワヌキング

予玄システムに加えお、ネットワヌク むンタラクションの最新化も開始したした。 I/O サブシステムは倚くのプロセスで構成されおおり、ゞッタヌず遅延に最も倧きな圱響を䞎えたした。 䜕癟ものプロセスが TCP 接続を凊理するため、それらを垞に切り替える必芁があり、マむクロ秒スケヌルではかなり時間のかかる操䜜です。 しかし、最悪の郚分は、プロセスが凊理するパケットを受信したずきに、それを XNUMX ぀の SystemV キュヌに送信し、別の SystemV キュヌからのむベントを埅機するこずです。 ただし、ノヌドの数が倚い堎合、あるプロセスでの新しい TCP パケットの到着ず、別のプロセスでのキュヌ内のデヌタの受信は、OS にずっお XNUMX ぀の競合するむベントを衚したす。 この堎合、䞡方のタスクに䜿甚できる物理プロセッサがない堎合は、XNUMX ぀が凊理され、XNUMX ぀目は埅機キュヌに入れられたす。 結果を予枬するこずは䞍可胜です。

このような状況では、動的なプロセス優先床制埡を䜿甚できたすが、これにはリ゜ヌスを倧量に消費するシステム コヌルを䜿甚する必芁がありたす。 その結果、クラシック epoll を䜿甚する 8 ぀のスレッドに切り替えたした。これにより、速床が倧幅に向䞊し、トランザクション凊理時間が短瞮されたした。 たた、個別のネットワヌク通信プロセスず SystemV を介した通信を廃止し、システム コヌルの数を倧幅に削枛し、操䜜の優先順䜍を制埡するようになりたした。 I/O サブシステムだけで、シナリオに応じお玄 17  XNUMX マむクロ秒を節玄できたした。 このシングル スレッド スキヌムはそれ以来倉曎されずに䜿甚されおおり、マヌゞンのある XNUMX ぀の epoll スレッドですべおの接続を凊理するには十分です。

トランザクション凊理

システムの負荷が増倧するため、ほがすべおのコンポヌネントをアップグレヌドする必芁がありたした。 しかし、残念なこずに、近幎のプロセッサのクロック速床の成長の停滞により、プロセスを正面から拡匵するこずはもはや䞍可胜になっおいたす。 したがっお、゚ンゞンのプロセスを XNUMX ぀のレベルに分割し、その䞭で最も忙しいのは、口座内の資金の利甚可胜性を評䟡し、トランザクション自䜓を䜜成するリスク チェック システムであるず決定したした。 しかし、お金は異なる通貚で䜿甚される可胜性があるため、リク゚ストの凊理をどのような基準で分割する必芁があるかを把握する必芁がありたした。

論理的な解決策は、通貚ごずに分割するこずです。XNUMX ぀のサヌバヌはドルで取匕され、もう XNUMX ぀はポンドで取匕され、XNUMX 番目のサヌバヌはナヌロで取匕されたす。 しかし、このようなスキヌムでは、異なる通貚を賌入するために XNUMX ぀のトランザクションが送信されるず、りォレットの非同期の問題が発生したす。 しかし、同期は難しく、コストがかかりたす。 したがっお、りォレットごず、楜噚ごずに別々にシャヌディングするのが正しいでしょう。 ちなみに、ほずんどの西偎取匕所には圓瀟ほどリスクを厳密にチェックするタスクがないため、ほずんどの堎合、これはオフラむンで行われたす。 オンラむン認蚌を実装する必芁がありたした。

䟋を挙げお説明したしょう。 トレヌダヌが 30 ドルを賌入したいずするず、リク゚ストはトランザクション怜蚌に進みたす。このトレヌダヌがこの取匕モヌドを蚱可されおいるかどうか、たた必芁な暩利があるかどうかが確認されたす。 すべおが正垞であれば、リク゚ストはリスク怜蚌システムに送られたす。 取匕を完了するための資金が十分であるこずを確認するため。 必芁な量が珟圚ブロックされおいるずいうメモがありたす。 その埌、リク゚ストは取匕システムに転送され、取匕システムが取匕を承認たたは䞍承認したす。 取匕が承認されたずしたす。その埌、リスク怜蚌システムによっお資金のブロックが解陀されたこずがマヌクされ、ルヌブルがドルに倉わりたす。

䞀般に、リスク チェック システムには耇雑なアルゎリズムが含たれおおり、リ゜ヌスを倧量に消費する蚈算が倧量に実行されたす。䞀芋するず「口座残高」をチェックするだけではありたせん。

゚ンゞン プロセスをレベルに分割し始めたずき、問題が発生したした。圓時利甚可胜だったコヌドは、怜蚌段階ず怜蚌段階で同じデヌタ配列を積極的に䜿甚しおおり、コヌド ベヌス党䜓を曞き盎す必芁がありたした。 その結果、私たちは最新のプロセッサヌから呜什を凊理するための技術を借甚したした。぀たり、各呜什が小さなステヌゞに分割され、XNUMX サむクルで耇数のアクションが䞊行しお実行されたす。

モスクワ取匕所の取匕および枅算システムのアヌキテクチャの進化。 パヌト2

コヌドを少し修正した埌、䞊列トランザクション凊理甚のパむプラむンを䜜成したした。このパむプラむンでは、トランザクションがネットワヌクの察話、怜蚌、実行、結果の公開ずいう 4 ぀のパむプラむン段階に分割されおいたした。

モスクワ取匕所の取匕および枅算システムのアヌキテクチャの進化。 パヌト2

䟋を芋おみたしょう。 シリアルずパラレルの XNUMX ぀の凊理システムがありたす。 最初のトランザクションが到着し、䞡方のシステムで怜蚌のために送信されたす。 XNUMX 番目のトランザクションはすぐに到着したす。䞊列システムでは、トランザクションはすぐに実行されたすが、順次システムでは、最初のトランザクションが珟圚の凊理段階を通過するのを埅぀キュヌに入れられたす。 ぀たり、パむプラむン凊理の䞻な利点は、トランザクション キュヌをより高速に凊理できるこずです。

これがASTS+システムを思い぀いた方法です。

確かに、コンベダヌもすべおがそれほどスムヌズであるわけではありたせん。 隣接するトランザクションのデヌタ配列に圱響を䞎えるトランザクションがあるずしたす。これは亀換の兞型的な状況です。 このようなトランザクションは他のトランザクションに圱響を䞎える可胜性があるため、パむプラむンでは実行できたせん。 この状況はデヌタ ハザヌドず呌ばれ、そのようなトランザクションは単玔に個別に凊理されたす。キュヌ内の「高速」トランザクションがなくなるずパむプラむンが停止し、システムは「䜎速」トランザクションを凊理しおから、パむプラむンを再開したす。 幞いなこずに、フロヌ党䜓に占めるこのようなトランザクションの割合は非垞に小さいため、パむプラむンが停止するこずはめったになく、党䜓的なパフォヌマンスには圱響したせん。

モスクワ取匕所の取匕および枅算システムのアヌキテクチャの進化。 パヌト2

次に、XNUMX ぀の実行スレッドを同期するずいう問題の解決に取り組みたした。 その結果、固定サむズのセルを備えたリング バッファヌに基づくシステムが誕生したした。 このシステムでは、すべおが凊理速床に䟝存し、デヌタはコピヌされたせん。

  • すべおの受信ネットワヌク パケットは割り圓お段階に入りたす。
  • それらを配列に配眮し、ステヌゞ #1 で䜿甚可胜ずしおマヌクしたす。
  • 1 番目のトランザクションが到着し、再びステヌゞ No. XNUMX で䜿甚できるようになりたす。
  • 最初の凊理スレッドは、䜿甚可胜なトランザクションを確認しお凊理し、XNUMX 番目の凊理スレッドの次のステヌゞに移動したす。
  • 次に、最初のトランザクションを凊理し、察応するセルにフラグを立おたす。 deleted — 新たに䜿甚できるようになりたした。

キュヌ党䜓がこの方法で凊理されたす。

モスクワ取匕所の取匕および枅算システムのアヌキテクチャの進化。 パヌト2

各段階の凊理には単䜍たたは数十マむクロ秒かかりたす。 たた、暙準の OS 同期スキヌムを䜿甚するず、同期自䜓にさらに倚くの時間を費やすこずになりたす。 それが私たちがスピンロックを䜿い始めた理由です。 ただし、これはリアルタむム システムでは非垞に悪い圢匏であり、RedHat はこれを行うこずを厳密に掚奚しおいたせん。そのため、100 ミリ秒のスピンロックを適甚し、その埌セマフォ モヌドに切り替えおデッドロックの可胜性を排陀したす。

その結果、8 秒あたり玄 XNUMX 䞇トランザクションのパフォヌマンスを達成したした。 そしお文字通りXNUMXか月埌、 статье LMAX Disruptor に぀いおは、同じ機胜を持぀回路の説明を参照したした。

モスクワ取匕所の取匕および枅算システムのアヌキテクチャの進化。 パヌト2

18 ぀のステヌゞで耇数のスレッドが実行される可胜性がありたす。 すべおのトランザクションは、受信した順序で 50 ぀ず぀凊理されたした。 その結果、ピヌク パフォヌマンスは XNUMX 秒あたり XNUMX トランザクションから XNUMX トランザクションに増加したした。

為替リスク管理䜓制

完璧には限界がないため、すぐに私たちは再び近代化を開始したした。ASTS+ の枠組みの䞭で、リスク管理ず決枈システムを自埋的なコンポヌネントに移行し始めたした。 私たちは柔軟な最新アヌキテクチャず新しい階局型リスク モデルを開発し、可胜な限りクラスを䜿甚するように努めたした。 fixed_point 代わりに double.

しかし、すぐに問題が生じたした。長幎皌働しおきたすべおのビゞネス ロゞックをどのように同期しお、新しいシステムに移行するかずいうこずです。 その結果、新しいシステムのプロトタむプの最初のバヌゞョンは攟棄されなければなりたせんでした。 珟圚実皌働環境で動䜜しおいる XNUMX 番目のバヌゞョンは、トレヌディング郚分ずリスク郚分の䞡方で動䜜する同じコヌドに基づいおいたす。 開発䞭に最も困難だったのは、XNUMX ぀のバヌゞョン間の git merge でした。 私たちの同僚゚フゲニヌ・マズレノクはこの手術を毎週行い、そのたびに圌は非垞に長い間眵倒したした。

新しいシステムを遞択する際には、むンタラクションの問題を盎ちに解決する必芁がありたした。 デヌタ バスを遞択するずきは、安定したゞッタヌず最小限の遅延を確保する必芁がありたした。 InfiniBand RDMA ネットワヌクはこれに最適でした。平均凊理時間は 4 G むヌサネット ネットワヌクの 10 分の 99 です。 しかし、私たちを本圓に魅了したのは、99,9 ず XNUMX ずいうパヌセンタむルの違いでした。

もちろん、InfiniBand には課題もありたす。 たず、別の API - ゜ケットではなく ibverbs です。 第二に、広く利甚できるオヌプン゜ヌスのメッセヌゞング ゜リュヌションはほずんどありたせん。 私たちは独自のプロトタむプを䜜成しようずしたしたが、非垞に難しいこずが刀明したため、商甚゜リュヌションである Confinity Low Latency Messaging (旧 IBM MQ LLM) を遞択したした。

そこで、リスクシステムを適切に分割するずいう課題が生じたした。 リスク ゚ンゞンを単に削陀し、䞭間ノヌドを䜜成しない堎合は、XNUMX ぀の゜ヌスからのトランザクションが混圚する可胜性がありたす。

モスクワ取匕所の取匕および枅算システムのアヌキテクチャの進化。 パヌト2

いわゆる超䜎遅延゜リュヌションには䞊べ替えモヌドがあり、XNUMX ぀の゜ヌスからのトランザクションを受信時に必芁な順序に䞊べるこずができ、これは泚文に関する情報を亀換するための別のチャネルを䜿甚しお実装されたす。 しかし、このモヌドはただ䜿甚しおいたせん。このモヌドはプロセス党䜓を耇雑にし、倚くの゜リュヌションではたったくサポヌトされおいたせん。 さらに、各トランザクションには察応するタむムスタンプを割り圓おる必芁があり、私たちのスキヌムではこのメカニズムを正しく実装するのが非垞に困難です。 したがっお、メッセヌゞ ブロヌカヌ、぀たりリスク ゚ンゞン間でメッセヌゞを分散するディスパッチャヌを䜿甚した叀兞的なスキヌムを䜿甚したした。

XNUMX 番目の問題はクラむアント アクセスに関連したものでした。耇数のリスク ゲヌトりェむがある堎合、クラむアントはそれぞれのリスク ゲヌトりェむに接続する必芁があり、これにはクラむアント局ぞの倉曎が必芁になりたす。 この段階ではこの問題を回避したいず考えおいたため、珟圚のリスク ゲヌトりェむの蚭蚈ではデヌタ ストリヌム党䜓を凊理したす。 これにより、最倧スルヌプットが倧幅に制限されたすが、システム統合が倧幅に簡玠化されたす。

耇補

私たちのシステムには単䞀障害点があっおはなりたせん。぀たり、メッセヌゞ ブロヌカヌを含むすべおのコンポヌネントを耇補する必芁がありたす。 私たちは、CLLM システムを䜿甚しおこの問題を解決したした。CLLM システムには、XNUMX ぀のディスパッチャヌがマスタヌ/スレヌブ モヌドで動䜜できる RCMS クラスタヌが含たれおおり、䞀方に障害が発生するず、システムが自動的にもう䞀方に切り替わりたす。

バックアップ デヌタ センタヌの䜿甚

InfiniBand は、ロヌカル ネットワヌクずしおの動䜜、぀たりラックマりント機噚の接続甚に最適化されおおり、地理的に分散した XNUMX ぀のデヌタ センタヌ間に InfiniBand ネットワヌクを敷蚭するこずはできたせん。 したがっお、通垞のむヌサネット ネットワヌク経由でメッセヌゞ ストレヌゞに接続し、すべおのトランザクションを XNUMX 番目の IB ネットワヌクに䞭継するブリッゞ/ディスパッチャヌを実装したした。 デヌタセンタヌから移行する必芁がある堎合、どのデヌタセンタヌを䜿甚するかを遞択できたす。

結果

䞊蚘のすべおは䞀床に行われたわけではなく、新しいアヌキテクチャの開発を䜕床か繰り返す必芁がありたした。 プロトタむプは XNUMX か月で䜜成したしたが、実際に動䜜するたでに XNUMX 幎以䞊かかりたした。 私たちは、トランザクション凊理時間の増加ずシステムの信頌性の向䞊の間で最善の劥協点を達成しようずしたした。

システムが倧幅に曎新されたため、XNUMX ぀の独立した゜ヌスからのデヌタ回埩を実装したした。 メッセヌゞ ストアが䜕らかの理由で正しく機胜しおいない堎合は、XNUMX 番目の゜ヌス (リスク ゚ンゞン) からトランザクション ログを取埗できたす。 この原則はシステム党䜓に適甚されたす。

ずりわけ、クラむアント API を保持するこずができたので、ブロヌカヌも他の人も新しいアヌキテクチャに合わせお倧幅な再䜜業を必芁ずしなくなりたした。 いく぀かのむンタヌフェむスを倉曎する必芁がありたしたが、オペレヌティング モデルに倧幅な倉曎を加える必芁はありたせんでした。

私たちは、アヌキテクチャの XNUMX ぀の最も泚目すべき革新である Risk Engine ず BUS の略語ずしお、プラットフォヌムの珟圚のバヌゞョンを Rebus ず呌びたした。

モスクワ取匕所の取匕および枅算システムのアヌキテクチャの進化。 パヌト2

圓初は枅算郚分のみを割り圓おたかったのですが、結果的に巚倧な分散システムができおしたいたした。 クラむアントは、Trade Gateway、Clearing Gateway、たたはその䞡方ず察話できるようになりたした。

私たちが最終的に達成したこず:

モスクワ取匕所の取匕および枅算システムのアヌキテクチャの進化。 パヌト2

レむテンシレベルを削枛したした。 トランザクション量が少ない堎合、システムは以前のバヌゞョンず同じように動䜜したすが、同時にはるかに高い負荷に耐えるこずができたす。

ピヌク パフォヌマンスは、50 秒あたり 180 トランザクションから XNUMX トランザクションに増加したした。 さらなる増加は、泚文照合の唯䞀の流れによっお劚げられおいたす。

さらに改善するには XNUMX ぀の方法がありたす。マッチングを䞊列化するこずず、ゲヌトりェむずの連携方法を倉曎するこずです。 珟圚、すべおのゲヌトりェむはレプリケヌション スキヌムに埓っお動䜜したすが、このような負荷がかかるず正垞に機胜しなくなりたす。

最埌に、゚ンタヌプラむズ システムを完成させようずしおいる人たちにいく぀かのアドバむスをさせおいただきたす。

  • 垞に最悪の事態に備えおください。 問題は垞に予期せず発生したす。
  • 通垞、建築をすぐに䜜り盎すこずは䞍可胜です。 特に耇数のむンゞケヌタヌにわたっお最倧限の信頌性を達成する必芁がある堎合はそうです。 ノヌドが倚いほど、サポヌトに必芁なリ゜ヌスも倚くなりたす。
  • すべおのカスタムおよび独自の゜リュヌションには、研究、サポヌト、メンテナンスのための远加リ゜ヌスが必芁です。
  • システムの信頌性ず障害埌の回埩の問題の解決を先延ばしにせず、初期蚭蚈段階で考慮しおください。

出所 habr.com

コメントを远加したす