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

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

こんにちは、みんな 私の名前はセルゲむ・コスタンバ゚フです。取匕所で取匕システムの䞭栞を開発しおいたす。

ハリりッド映画でニュヌペヌク蚌刞取匕所が描かれるずき、それはい぀も次のようになりたす。人が矀がり、誰もが䜕かを叫び、玙を振り、完党な混乱が起こっおいたす。 ここモスクワ取匕所ではこのようなこずは䞀床も起こったこずはありたせん。取匕は圓初から電子的に行われ、Spectra (倖囜為替垂堎) ず ASTS (倖囜為替、株匏、短期金融垂堎) ずいう XNUMX ぀の䞻芁なプラットフォヌムに基づいおいるからです。 そしお今日は、ASTS 取匕および枅算システムのアヌキテクチャの進化、さたざたな゜リュヌションず発芋に぀いお話したいず思いたす。 話が長くなりそうなので郚に分けさせおいただきたした。

圓瀟は、あらゆるクラスの資産を取匕し、あらゆる皮類の取匕サヌビスを提䟛する䞖界でも数少ない取匕所の 25 ぀です。 䟋えば、昚幎は債刞取匕高で䞖界第13䜍、党蚌刞取匕所䞭XNUMX䜍、公的取匕所䞭資本金XNUMX䜍ずなりたした。

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

プロの取匕参加者にずっお、応答時間、時間分垃の安定性 (ゞッタヌ)、耇合䜓党䜓の信頌性などのパラメヌタは重芁です。 珟圚、私たちは XNUMX 日に数千䞇件のトランザクションを凊理しおいたす。 システム カヌネルによる各トランザクションの凊理には数十マむクロ秒かかりたす。 もちろん、倧晊日の携垯電話事業者や怜玢゚ンゞン自䜓の仕事量は圓瀟よりも高いですが、䞊蚘の特性ず合わせお、仕事量の点で圓瀟に匹敵するものはほずんどないず思われたす。 同時に、システムが䞀瞬たりずも速床を萜ずさず、完党に安定しお動䜜し、すべおのナヌザヌが平等な立堎にあるこずが私たちにずっお重芁です。

ちょっずした歎史

1994 幎に、オヌストラリアの ASTS システムがモスクワ銀行間通貚取匕所 (MICEX) で開始され、その瞬間からロシアの電子取匕の歎史は数えられたす。 1998 幎に、むンタヌネット取匕を導入するために取匕所のアヌキテクチャが最新化されたした。 それ以来、すべおのシステムずサブシステムにおける新しい゜リュヌションずアヌキテクチャの倉曎の実装速床は加速するばかりです。

圓時、亀換システムはハむ゚ンド ハヌドりェア、぀たり非垞に信頌性の高い HP Superdome 9000 サヌバヌ ( PA-RISC)、入出力サブシステム、ネットワヌク、RAM (実際には、RAM の RAID アレむがありたした)、プロセッサ (ホットスワップ可胜) など、すべおが耇補されおいたした。 マシンを停止せずにサヌバヌ コンポヌネントを倉曎するこずができたした。 私たちはこれらのデバむスに䟝存しおおり、事実䞊フェむルセヌフであるず考えおいたした。 オペレヌティング システムは Unix に䌌た HP UX システムでした。

しかし、2010幎頃から、高頻床取匕HFT、たたは高頻床取匕、簡単に蚀うず蚌刞取匕所ロボットず呌ばれる珟象が出珟したした。 わずか 2,5 幎半で、サヌバヌの負荷は 140 倍に増加したした。

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

叀いアヌキテクチャず蚭備では、このような負荷に耐えるこずは䞍可胜でした。 䜕らかの方法で適応する必芁がありたした。

開始

亀換システムぞのリク゚ストは XNUMX ぀のタむプに分類できたす。

  • 取匕。 ドル、株、その他のものを賌入したい堎合は、取匕システムにトランザクションを送信し、成功に関する応答を受け取りたす。
  • 情報リク゚スト。 珟圚の䟡栌を知りたい堎合は、オヌダヌブックたたはむンデックスを衚瀺しおから、情報リク゚ストを送信しおください。

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

抂略的に、システムのコアは XNUMX ぀のレベルに分割できたす。

  • ブロヌカヌずクラむアントが動䜜するクラむアント レベル。 これらはすべおアクセス サヌバヌず察話したす。
  • ゲヌトりェむ サヌバヌは、すべおの情報芁求をロヌカルで凊理するキャッシュ サヌバヌです。 ズベルバンク株が珟圚どのくらいの䟡栌で取匕されおいるか知りたいですか? リク゚ストはアクセス サヌバヌに送信されたす。
  • ただし、株匏を賌入したい堎合、リク゚ストは䞭倮サヌバヌ (Trade Engine) に送られたす。 垂堎の皮類ごずにそのようなサヌバヌが XNUMX ぀あり、それらは重芁な圹割を果たしおおり、私たちがこのシステムを䜜成したのは圌らのためにです。

取匕システムの䞭栞は、すべおの取匕が為替取匕である賢いメモリ内デヌタベヌスです。 ベヌスは C で曞かれおおり、唯䞀の倖郚䟝存関係は libc ラむブラリであり、動的なメモリ割り圓おはたったくありたせんでした。 凊理時間を短瞮するために、システムは配列の静的セットず静的デヌタの再配眮から開始したす。たず、圓日のすべおのデヌタがメモリにロヌドされ、それ以䞊のディスク アクセスは実行されず、すべおの䜜業がメモリ内でのみ実行されたす。 システムの起動時には、すべおの参照デヌタがすでに゜ヌトされおいるため、怜玢は非垞に効率的に機胜し、実行時間はほずんどかかりたせん。 すべおのテヌブルは動的デヌタ構造の䟵入型リストずツリヌで䜜成されおいるため、実行時にメモリ割り圓おが必芁ありたせん。

圓瀟の取匕および枅算システムの開発の歎史を簡単に振り返っおみたしょう。
取匕および枅算システム アヌキテクチャの最初のバヌゞョンは、いわゆる Unix むンタラクションに基づいお構築されたした。共有メモリ、セマフォ、キュヌが䜿甚され、各プロセスは単䞀のスレッドで構成されおいたした。 このアプロヌチは 1990 幎代初頭に広く普及したした。

システムの最初のバヌゞョンには、XNUMX ぀のレベルのゲヌトりェむず取匕システムの䞭倮サヌバヌが含たれおいたした。 䜜業の流れはこんな感じでした。

  • クラむアントがリク゚ストを送信するず、そのリク゚ストはゲヌトりェむに到達したす。 圢匏の有効性 (デヌタ自䜓の有効性はチェックしたせん) をチェックし、䞍正なトランザクションを拒吊したす。
  • 情報芁求が送信された堎合、それはロヌカルで実行されたす。 トランザクションに぀いお話しおいる堎合、トランザクションは䞭倮サヌバヌにリダむレクトされたす。
  • 次に、取匕゚ンゞンはトランザクションを凊理し、ロヌカル メモリを倉曎し、別のレプリケヌション ゚ンゞンを䜿甚しおレプリケヌションのためにトランザクションずトランザクション自䜓に応答を送信したす。
  • ゲヌトりェむはセントラル ノヌドから応答を受信し、それをクラむアントに転送したす。
  • しばらくするず、ゲヌトりェむはレプリケヌション メカニズムを通じおトランザクションを受信し、今床はそれをロヌカルで実行し、次の情報芁求で最新のデヌタが衚瀺されるようにデヌタ構造を倉曎したす。

実際、これはゲヌトりェむが取匕システムで実行されるアクションを完党に耇補する耇補モデルを蚘述しおいたす。 別個のレプリケヌション チャネルにより、耇数のアクセス ノヌド間でトランザクションが同じ順序で実行されるこずが保蚌されたす。

コヌドはシングルスレッドであったため、倚くのクラむアントにサヌビスを提䟛するために、プロセス フォヌクを䜿甚した叀兞的なスキヌムが䜿甚されたした。 ただし、デヌタベヌス党䜓をフォヌクするには非垞にコストがかかるため、TCP セッションからパケットを収集し、それらを XNUMX ぀のキュヌ (SystemV メッセヌゞ キュヌ) に転送する軜量のサヌビス プロセスが䜿甚されたした。 Gateway ず Trade Engine はこのキュヌでのみ動䜜し、そこからトランザクションを実行したす。 どのサヌビス プロセスがそれを読み取るべきかが明確ではなかったため、それに応答を送信するこずはできなくなりたした。 そこで私たちはあるトリックに頌りたした。フォヌクされた各プロセスはそれ自䜓の応答キュヌを䜜成し、受信キュヌにリク゚ストが入るず、応答キュヌのタグが即座にキュヌに远加されたした。

倧量のデヌタをキュヌからキュヌぞ絶えずコピヌするず、特に情報芁求によく芋られる問題が発生したした。 そこで、別のトリックを䜿甚したした。応答キュヌに加えお、各プロセスが共有メモリ (SystemV 共有メモリ) も䜜成したした。 パッケヌゞ自䜓はその䞭に配眮され、タグのみがキュヌに保存されるため、元のパッケヌゞを芋぀けるこずができたす。 これは、プロセッサのキャッシュにデヌタを保存するのに圹立ちたした。

SystemV IPC には、キュヌ、メモリ、およびセマフォ オブゞェクトの状態を衚瀺するためのナヌティリティが含たれおいたす。 私たちはこれを積極的に䜿甚しお、特定の瞬間にシステムで䜕が起こっおいるか、パケットがどこに蓄積されおいるか、䜕がブロックされおいるかなどを理解したした。

最初のアップグレヌド

たず第䞀に、単䞀プロセスのゲヌトりェむを廃止したした。 その重倧な欠点は、クラむアントからの XNUMX ぀のレプリケヌション トランザクションたたは XNUMX ぀の情報芁求を凊理できるこずです。 たた、負荷が増加するず、ゲヌトりェむはリク゚ストの凊理に時間がかかり、レプリケヌション フロヌを凊理できなくなりたす。 さらに、クラむアントがトランザクションを送信した堎合は、その有効性を確認しおさらに転送するだけで枈みたす。 したがっお、単䞀のゲヌトりェむ プロセスを、䞊列実行できる耇数のコンポヌネント、぀たりマルチスレッドの情報プロセスずトランザクション プロセスを、RW ロックを䜿甚しお共有メモリ領域䞊で互いに独立しお実行できるものに眮き換えたした。 そしお同時にディスパッチずレプリケヌションのプロセスを導入したした。

高頻床取匕の圱響

䞊蚘のバヌゞョンのアヌキテクチャは 2010 幎たで存圚しおいたした。 その䞀方で、私たちは HP Superdome サヌバヌのパフォヌマンスに満足できなくなりたした。 さらに、PA-RISC アヌキテクチャは事実䞊機胜䞍党に陥り、ベンダヌは重芁なアップデヌトを提䟛したせんでした。 その結果、HP UX/PA RISC から Linux/x86 ぞの移行が始たりたした。 移行は、アクセス サヌバヌの適応から始たりたした。

なぜ再びアヌキテクチャを倉曎する必芁があったのでしょうか? 実際のずころ、高頻床取匕によりシステム コアの負荷プロファむルが倧幅に倉化したした。

重倧な䟡栌倉動を匕き起こした小芏暡な取匕があるずしたす。誰かが XNUMX 億ドルを賌入したずしたす。 数ミリ秒埌、すべおの垂堎参加者がこれに気づき、修正を開始したす。 圓然のこずながら、リク゚ストは巚倧なキュヌに䞊び、システムがキュヌをクリアするには長い時間がかかりたす。

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

この 50 ミリ秒間隔では、平均速床は 16 秒あたり玄 20 トランザクションになりたす。 りィンドりを 90 ミリ秒に短瞮するず、平均速床は 200 秒あたり XNUMX 䞇トランザクション、ピヌク時には XNUMX 䞇トランザクションになりたす。 蚀い換えれば、負荷は䞀定ではなく、突然のバヌストを䌎いたす。 たた、リク゚ストのキュヌは垞に迅速に凊理される必芁がありたす。

しかし、そもそもなぜ行列ができるのでしょうか したがっお、この䟋では、倚くのナヌザヌが䟡栌の倉曎に気づき、それに応じおトランザクションを送信したした。 これらは Gateway に到着し、シリアル化され、特定の順序が蚭定されおネットワヌクに送信されたす。 ルヌタヌはパケットをシャッフルしお転送したす。 誰の荷物が最初に到着したか、その取匕は「勝ち」ずなりたす。 その結果、取匕所クラむアントは、同じトランザクションが耇数のゲヌトりェむから送信された堎合、そのトランザクションが高速に凊理される可胜性が高たるこずに気づき始めたした。 すぐに、亀換ロボットがゲヌトりェむにリク゚ストを倧量に送り蟌み始め、雪厩のようにトランザクションが発生したした。

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

新たな進化のラりンド

広範なテストず研究を行った埌、私たちはリアルタむム オペレヌティング システム カヌネルに切り替えたした。 このために、RedHat Enterprise MRG Linux (MRG はメッセヌゞング リアルタむム グリッドの略) を遞択したした。 リアルタむム パッチの利点は、可胜な限り高速に実行できるようにシステムを最適化するこずです。すべおのプロセスが FIFO キュヌに䞊べられ、コアを分離でき、むゞェクトがなく、すべおのトランザクションが厳密な順序で凊理されたす。

モスクワ取匕所の取匕および枅算システムのアヌキテクチャの進化。 パヌト1
èµ€ - 通垞のカヌネルでキュヌを䜿甚しお動䜜、緑 - リアルタむム カヌネルで動䜜。

ただし、通垞のサヌバヌで䜎遅延を実珟するのはそれほど簡単ではありたせん。

  • x86 アヌキテクチャにおいお重芁な呚蟺機噚を操䜜するための基瀎ずなる SMI モヌドは、倧きく干枉したす。 あらゆる皮類のハヌドりェア むベントの凊理ずコンポヌネントずデバむスの管理は、いわゆるトランスペアレント SMI モヌドでファヌムりェアによっお実行されたす。このモヌドでは、オペレヌティング システムはファヌムりェアが䜕を行っおいるかをたったく認識したせん。 原則ずしお、すべおの䞻芁ベンダヌは、SMI 凊理量を削枛できるファヌムりェア サヌバヌ甚の特別な拡匵機胜を提䟛しおいたす。
  • プロセッサ呚波数を動的に制埡しおはなりたせん。これにより、ダりンタむムがさらに発生したす。
  • ファむル システム ログがフラッシュされるず、カヌネル内で特定のプロセスが発生し、予枬できない遅延が発生したす。
  • CPU アフィニティ、割り蟌みアフィニティ、NUMA などに泚意する必芁がありたす。

リアルタむム凊理甚の Linux ハヌドりェアずカヌネルのセットアップに関するトピックは、別の蚘事に倀するず蚀わざるを埗たせん。 良い結果が埗られるたで、私たちは実隓ず研究に倚くの時間を費やしたした。

PA-RISC サヌバヌから x86 に移行する堎合、実際にはシステム コヌドを倧幅に倉曎する必芁はなく、適応しお再構成するだけで枈みたした。 同時に、いく぀かのバグを修正したした。 たずえば、PA RISC がビッグ ゚ンディアン システムであり、x86 がリトル ゚ンディアン システムであるずいう事実の圱響は、すぐに衚面化したした。たずえば、デヌタが正しく読み取られなかったなどです。 さらに厄介なバグは、PA RISC が䜿甚するものでした。 䞀貫しお䞀貫した (逐次的に䞀貫性のある) メモリ アクセスに察しお、x86 は読み取り操䜜の順序を倉曎できるため、あるプラットフォヌムでは完党に有効だったコヌドが別のプラットフォヌムでは壊れおしたいたす。

x86 に切り替えた埌、パフォヌマンスはほが 60 倍に向䞊し、平均トランザクション凊理時間は XNUMX ÎŒs に短瞮されたした。

次に、システム アヌキテクチャにどのような重芁な倉曎が加えられたかを詳しく芋おみたしょう。

ホットリザヌブ゚ピック

コモディティサヌバヌに切り替えるずき、私たちは信頌性が䜎いこずを認識しおいたした。 したがっお、新しいアヌキテクチャを䜜成するずきは、XNUMX ぀以䞊のノヌドで障害が発生する可胜性を事前に想定しおいたした。 したがっお、バックアップ マシンに迅速に切り替えるこずができるホット スタンバむ システムが必芁でした。

さらに、他にも次のような芁件がありたした。

  • いかなる状況でも、凊理されたトランザクションが倱われるこずはありたせん。
  • システムはむンフラストラクチャに察しお完党に透過的である必芁がありたす。
  • クラむアントには切断された接続が衚瀺されないはずです。
  • これは亀換にずっお重芁な芁玠であるため、予玄によっお倧幅な遅延が生じおはなりたせん。

ホット スタンバむ システムを䜜成するずき、二重障害 (たずえば、XNUMX 台のサヌバヌ䞊のネットワヌクが動䜜を停止し、メむン サヌバヌがフリヌズする) などのシナリオは考慮しおいたせんでした。 ゜フトりェアの゚ラヌはテスト䞭に特定されるため、その可胜性は考慮されおいたせんでした。 たた、ハヌドりェアの誀った動䜜は考慮されおいたせんでした。

その結果、次のようなスキヌムにたどり着きたした。

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

  • メむン サヌバヌはゲヌトりェむ サヌバヌず盎接察話したした。
  • メむン サヌバヌで受信されたすべおのトランザクションは、別のチャネルを介しおバックアップ サヌバヌに即座に耇補されたした。 問題が発生した堎合は、裁定者 (ガバナヌ) が切り替えを調敎したす。

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

  • メむン サヌバヌは各トランザクションを凊理し、バックアップ サヌバヌからの確認を埅ちたした。 遅延を最小限に抑えるために、バックアップ サヌバヌでトランザクションが完了するのを埅぀必芁はありたせんでした。 トランザクションがネットワヌクを通過するのにかかる時間は実行時間ず同皋床であったため、远加の遅延は発生したせんでした。
  • 前回のトランザクションではメむンサヌバずバックアップサヌバの凊理状況しか確認できず、今回のトランザクションの凊理状況は䞍明でした。 ただシングルスレッドプロセスを䜿甚しおいたので、バックアップからの応答を埅っおいるず凊理フロヌ党䜓が遅くなる可胜性があるため、合理的な劥協策を講じたした。぀たり、前のトランザクションの結果を確認したした。

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

このスキヌムは次のように機胜したした。

メむンサヌバヌが応答を停止しおも、ゲヌトりェむは通信を続けおいるずしたす。 バックアップ サヌバヌでタむムアりトが発生するず、バックアップ サヌバヌはガバナヌに連絡し、ガバナヌがバックアップ サヌバヌにメむン サヌバヌの圹割を割り圓お、すべおのゲヌトりェむが新しいメむン サヌバヌに切り替わりたす。

メむン サヌバヌがオンラむンに戻るず、䞀定期間ゲヌトりェむからサヌバヌぞの呌び出しがないため、内郚タむムアりトもトリガヌされたす。 それから圌は知事にも頌っお、知事は圌を蚈画から陀倖した。 その結果、取匕所は取匕期間の終了たで XNUMX ぀のサヌバヌで動䜜したす。 サヌバヌ障害の可胜性が非垞に䜎いため、このスキヌムは非垞に蚱容できるず考えられ、耇雑なロゞックが含たれおおらず、テストが簡単でした。

継続するために。

出所 habr.com

コメントを远加したす