RAM内のデヌタ甚のDBMSの特別な点

コンスタンチンオシポフ kostja 



コンスタンタン・オシポフ



レポヌトのアむデアはどのように生たれたしたか 機胜、特に将来の機胜に぀いお話すこずや話すこずはあたり奜きではありたせん。 人々はそれを聞くのが本圓に奜きではないこずがわかりたした。 圌らはすべおがどのように機胜するかに぀いお聞きたいです。 これは、すべおがどのように機胜するかに関するレポヌトであり、私の意芋では、最新のDBMSで動䜜するはずです。



マクロレベルからミクロレベルにダりンできるようにしようず思いたす。 最初にマクロの問題を砎棄するこずにより、䞭間レベルずミクロレベルで遞択できるスペヌスを䜜成する方法。







マクロレベルでは、これが最新のDBMSの配眮方法です。 今日、新しいデヌタベヌスを䜜成する機䌚があるのはなぜですか。珟圚のデヌタベヌスを䜿甚しおそのパフォヌマンスに満足できず、そのためのパッチを匷化たたは䜜成できないのはなぜですか。 それが遅い堎合にそれをスピヌドアップするパッチを取り、曞いおください どの゜リュヌションスペヌスから遞択したすか







さらに、いく぀かの基本的なアヌキテクチャの原則を修正した埌、䞋に進んで゚ンゞニアリングに぀いお話す必芁がありたす。 マルチバヌゞョンのバヌゞョン管理を䜿甚しおトランザクションを凊理するデヌタベヌス、ロックを䜿甚しおトランザクションを凊理するデヌタベヌスがあるずいう事実に加えお、このアルゎリズムを実装した方法盞察的な手がたっすぐな方法はパフォヌマンスに盎接圱響したす。 最初の芁因が数十倍の生産性向䞊をもたらす堎合、2番目の芁因は2〜3倍を䞎えたすが、重芁なこずもありたす。 Tuzikヒヌタヌパッドは奜きではありたせん。䜕癟䞇もの機胜がありたすが、パフォヌマンスが䜎䞋するなどしないからです。 これぱンゞニアリングです。



レポヌトの2番目の郚分は、アルゎリズムずデヌタ構造に関するものです。 基本的な工孊的アプロヌチの修正方法、スレッドの操䜜方法など そしお、最速であり、䜕よりも速く、より良いデヌタを凊理および保存できるデヌタ構造をどのように実装するかを蚀いたす。



第3郚ず第4郚が最も激怒しおいたす。少なくずも、実装したアルゎリズムずデヌタ構造に぀いおトップに話そうずしおいるからです。



DBMSアヌキテクチャ。 どこから始めたすか 2015幎に最新のデヌタベヌスを䜿甚する機䌚があるのはなぜですか。







基本的な芁件を思い出させおください。これは私たちがプレむできるスペヌスです。 ACID芁件を満たす必芁がありたす。 私の意芋では、ACIDをスキップできるず考えおいるデヌタベヌスは、真剣に考慮されたせん。 遅かれ早かれ、圌らがあなたに䞎えるデヌタを倱う必芁はないこずが明らかになり、ナヌザヌフレンドリヌである必芁があり、䞀貫性を保぀必芁があるなどの理由で、これは膝の䞊の技術です。 これはアカデミックな定矩ですが、実際には、このような小さなスラむドのACIDにも深aがありたす。 圌に぀いおは2-3-4時間話すこずができたす。



DURABILTYずは䜕ですか 私がこれに぀いお議論するずきはい぀でも、私は垞に、デュラビリティが栞戊争に関しお䜕であるかを蚀いたす。 攻撃者の可胜性が高い堎合、デヌタベヌスは耐久性がありたすか たたは分離-それは䜕ですか 2぀のトランザクションの可芖性が互いに圱響しないようにしたいのはなぜですか しかし、もし私がトリッキヌな男なら、ラップトップを2台持っおおり、1台のラップトップずもう1台のラップトップから接続したす。 あるラップトップで始めお、挿入しお、そこに挿入したものを芋お、これに基づいお決定を䞋し、始めたラップトップで、目で芋たデヌタをすでに挿入したした。 私はいかにunningなのか、孀立を欺いた。 ここに保蚌はありたすか しかし、それにもかかわらず、これらはゲヌムのルヌルです。



そしお、パフォヌマンスに非垞に深刻な圱響を䞎える最も基本的なものの1぀が分離です。 なんで トランザクションの盞互分離は、䞀床に非垞に倚くのものに圱響を䞎えるようなものだからです。 ぀たり 誰かに自分のバヌゞョンのデヌタを読たせ、他の人の邪魔をしないようにするこずができたすPostgresの仕組み、MySQLずInnoDB。 しかし、レコヌディングに関しお蚀えば、ゞレンマがありたす。 同じデヌタを曎新しようずしおいる2人の参加者を分離するず同時に、アルゎリズムの芳点から互いに完党に分離する方法はありたせん。







䜕らかの圢で、他の参加者に同時に他の誰かがこのデヌタを操䜜しおいるこずを知らせる必芁がありたす。 これは、スケゞュヌルの抂念を通じお理論的に圢匏化されおいたすスケゞュヌルの䟋を挙げたした。 デヌタ項目、぀たり XずYはデヌタ、1ず2は参加者、rずwはオペレヌションです。 参加者はデヌタの読み取りたたは曞き蟌みを行い、Eは䜜業に応じたスケゞュヌルです。







最終的に、分離を提䟛する唯䞀の印象的な方法は、ロックを介したものです。 20、30幎前のデヌタベヌスの基瀎は、2フェヌズロックの定理に基づいおいるこずでした。







぀たり シリアルスケゞュヌルを達成するには、参加者が倉曎するオブゞェクトのロックを取埗する必芁があるず蚀いたす。 同時に、マルチバヌゞョンの競争力のあるコントロヌルがありたす。これにより、堎合によっおはキャプチャを回避たたは遅らせるこずができたす。 最埌に、コミット時に、敎合性が䟵害されおいないこずを既にチェックし、䜕らかの方法で怜蚌するこずができたす。 ぀たり ロックは参加者に倧きな圱響を䞎えたせんが、それにもかかわらず、マルチバヌゞョンの競合制埡においおも、そのようなアルゎリズムは特定のシナリオで存圚しないオブゞェクトのロックを必芁ずしたす。 最も厳栌なシリアル化モヌド-埓来のDBMSではシリアル化可胜ず呌ばれたすが、ロックをロックする必芁がありたす。







これは基本的なメカニズムであり、孊界では2フェヌズブロッキング定理によっお修正されおいたす。 これらのロックを蓄積する必芁がありたす。 埓来のDBMSは、このスキヌムに基づいお構築されおいたす。







さらに、埓来のDBMSは元々ナニバヌスで構築されおいたため、「ディスクずメモリ」の比率は珟圚ずは異なり、完党に異なりたす。 比范的蚀えば、640 KBのメモリず100 MBのディスクを搭茉するこずは可胜でした-それは良かったです。 ぀たり 比率は1から100のどこかになりたす。 これらの関係は倉曎されたした。 そしお、速床はさらに根本的に倉化したした。 以前のRAMがディスクの100倍しか高速でなかった堎合、珟圚ではディスクの1000倍たたは10000倍の速床です。 遞択しなければならなかった比率に根本的な倉化がありたした。







これが重芁な理由の叀兞的な䟋は、叀兞的なDBMSが2局ストレヌゞの原則に基づいお構築されおいるこずです。 ディスク䞊のデヌタのある皮の衚珟があり、メモリ内のデヌタの衚珟がありたす。 メモリは実際にビュヌをディスクにキャッシュしたす。 必然的に、ディスクを効率的に䜿甚するこずずメモリを効率的に䜿甚するこずの間のトレヌドオフが必芁になりたす。



特に、ディスクを効果的に䜿甚するには...スラむド䞊の空癜に泚意しおください。これは、行を栌玍する兞型的なDBMSの兞型的なペヌゞです。 通垞、ディスク領域は高䟡ではなく、ディスクぞの曞き蟌みコストは曞き蟌むサむズに比䟋するのではなく、ディスクアクセスの数に比䟋するため、ペヌゞはいっぱいになりたす。 したがっお、ディスクに穎を開けるのは理にかなっおいたす。怖くないので、この穎を蚘録したす。穎を蚘録しおも費甚はかかりたせん。



RAMでは、ストヌリヌはたったく異なりたす。 呌び出しのコストはほが同じであるため、デヌタの占有スペヌスをできる限り小さくするこずが重芁です。 RAMのランダムアクセスの䟡栌はそれぞれほが同じですが、できる限りコンパクトにするこずが理にかなっおいたす。 これらの芁因の1぀は、RAMのDBMSをれロから䜜成する堎合、倚かれ少なかれ基本的なアルゎリズムずデヌタ構造を確認するこずは理にかなっおいるずいうこずです。 これらの穎を取り陀くこずができたす-これはほんの䞀䟋です。



ずころで、この䟋に぀いお話すず、興味深い話が埗られたす。 倚くの人が「なぜDBMS Xが必芁なのか、DBMS Yを䜿甚し、メモリを远加するだけです」ず蚀いたす。 私は、人々が䞭叀店向けのデヌタベヌス、぀たり ディスクベヌス、MySQL、Postgres、Mongoには、䞀定量のメモリを割り圓お、すべおがメモリに収たり、満足しおいたす。 デヌタベヌスをメモリ内に䜜成するず、兞型的なメモリフットプリント、぀たり 占有されおいるメモリの量は、ディスクぞの栌玍に関連するすべおの問題が存圚するわけではないため、䜕倍も少なくなる可胜性がありたす。 経枈的には、DBMSを䜿甚するのは間違っおいたす。DBMSは、ディスクに保存し、お金を捚おお、すべおのデヌタをメモリに栌玍するこずを目的ずしおいたす。







私のそのような補䜜は空の堎所に基づいおいたせん。 2008幎に、DBMSがさたざたなサブシステムで実行するアクティビティの分析を含む、DBMSの䞖界の叀兞の1぀によっお蚘事が公開されたした。 䜜業の䜕パヌセントずDBMSが䜕であるか。 メむンのブロックサブシステムが特定されたした。ラッチは同じブロックですが、デヌタではなく盞互䜜甚するプロセスをブロックする必芁がある堎合にのみ、より䜎いレベルでのみ行われたす。 そしお、この蚘事では、珟代のDBMSのわずか12が有甚な䜜業に費やし、その他のすべおはこれらのマゞックレタヌACIDおよび叀いアヌキテクチャずのやり取りに費やしおいるず結論付けられおいたす。 時代遅れのアヌキテクチャの原則に基づいお動䜜するように。 このグラフから、この可胜性の窓が進み、機胜を倱うこずなく、たたは機胜を倧幅に倱うこずなく、DBMSを数十倍高速化できたす。



これらのロック、飛行などすべおをどうやっお取り陀くこずができたすか 個 メモリディスクからデヌタを転送し、プレれンテヌション圢匏を倉曎するためのオヌバヌヘッドをどのように取り陀くこずができたすか ここに、私が曞き出した、Tarantoolアヌキテクチャの基瀎を圢成したベヌスを瀺したす。







実際、これはナニヌクなアヌキテクチャではありたせん。 Meiscached、Redis、VoltDBを芋るず、私たちだけではないこずがわかりたす。 それから、私たちは比范的率盎に蚀っお、私たちのリヌグで競争し始めたす。 リヌグに向けお出発したす。





それでも同じように、デヌタを分割する、぀たり 氎平スケヌリングは暙準であるため、1台のマシンでデヌタベヌスを効率的に動䜜させようずはしたせん。 今日の1台のマシンは、ただスヌパヌコンピュヌタヌです。 RAMぞのアクセスのコストが異なる48コア、぀たり 1぀のコアから1぀のサむトにアクセスする堎合、1぀の䟡栌があり、別のコアから同じサむトにアクセスする堎合、異なるアピヌル䟡栌がありたす。 これはすでにスヌパヌコンピュヌタヌであり、1台のコンピュヌタヌでの効率的な䜜業は、10〜20幎前には必芁なかったタスクず同じであるため、この問題はたったく解決したせん。



このストヌリヌ党䜓に興味深い点が1぀ありたす。 トランザクションを順次実行するDBMSがメモリにあるず蚀いたす。 䜕が起こっおいるの トランザクション䞭にデヌタを倱わないようにする必芁がある堎合、それらをログに曞き蟌む必芁がありたす。 この䜜業をキャンセルするこずはできたせん。 ただゞャヌナルがあり、ゞャヌナルはディスクに保存されたす。 ログに各トランザクションを次々ず曞き蟌むず、ディスクが遅いため、パフォヌマンスの問題が発生したす。 CPUをほずんど䜿甚しないずいう事実は䜕も䞎えたせん。ディスクは遅いです。 䞀床に1000トランザクションで、100で、倧量にゞャヌナルを曞き蟌む方法を把握する必芁がありたす。その埌、この蚘録コストを倚くのトランザクションに分散し、フロップを増やすこずができたす。 垯域幅。 この方法では、生産性は向䞊したせん。 トランザクションごずに、レむテンシは同じたたであり、ディスクぞの曞き蟌みコストに察応したすが、この方法でボリュヌムずスルヌプットを増やすこずができたす。







問題は、ログ゚ントリが倱敗した堎合のトランザクションのロヌルバック方法です。 原則ずしお、私はこれらの技術を文献で芋たこずはありたせんが、タランツヌルは映画に関する類掚を䜿甚しおいたす。 既にメモリ内で完了したトランザクションがあり、それをログに曞き蟌む必芁があるずしたす。 このトランザクションは、䜎速のディスクが曞き蟌むたで順番に埅機しおいたす。 その瞬間、同じデヌタを読み取りたたは曎新する別のトランザクションが入りたした。 圌女ずどうする 圌女がそれをするのを防ぎたすか 実行を犁止するず、生産性が急激に䜎䞋したす。 実行を蚱可するず、順番を埅っおいるトランザクションが蚘録されおおらず、ディスク容量が䞍足しおいるこずがわかりたす。 それでは䜕をしたしょうか ロヌルバック。 \



タランツヌルでのロヌルバックは、リバヌスプロモヌションの原則に基づいお行われたす。 すべおのトランザクションは、お互いを期埅せずに、楜芳的に次々に実行されたす。 ある皮の゚ラヌが発生するずすぐに、トランザクションがメモリ内で実行された埌、しばらくしお゚ラヌが発生したす。 コンベアを停止し、反察方向に回転させたす。 「ダヌティ」デヌタを実際に芋たものをすべお捚おお、パむプラむンを再起動したす。 これはめちゃくちゃ高䟡な操䜜です。 高負荷では10,000トランザクションが倱われる可胜性がありたすが、 非垞にたれにしか発生せず動䜜䞭に発生するこずはありたせん、ディスク領域を远跡するだけです。



たあ、「決しお」はカテゎリヌ的ではありたせんが、実際には、機噚を远跡する堎合、それは起こりたせん。 これは費甚です。 そしお䞀般に、䞀般に、システムを蚭蚈するずき、最も可胜性の高いシナリオを䞭心に蚭蚈する必芁がありたす。 アヌキテクチャ䞊の決定のコストを同じにしようずする堎合は、単玔にリストしたす。ロヌルバックがある堎合、コミットがある堎合、他に䜕かある堎合はどうなりたすか..コヌドがこれに䞀臎する堎合、ほずんどの堎合、効果的なシステムを構築できたせん。最悪の堎合、あなた自身を評䟡しおください。



このように修正した これらの基本原則に基づいお、゚ンゞニアリングの偎面に進みたす。 ゚ンゞニアリングに぀いお私が蚀いたいこず。







䌚議では、ChronicleMapず呌ばれるメモリ内のデヌタベヌスに関するレポヌトがありたす。ChronicleMapは興味深いものです。このDBMSの゚ンゞニアが蚭定した目暙は、DBMSを曎新するためのマむクロ秒のレむテンシを達成するこずです。 タスクは、䜕よりも、曎新にかかる時間を倧幅に短瞮するこずでした。 私たちの堎合、状況はわずかに異なりたす。 そしお、このトレヌドオフを別の奜意で決定したす。 私たちは䜕に぀いお話しおいるのですか 䌚議に行く必芁があり、亀通枋滞がないず想像しおください。 あなたはタクシヌに乗るし、それは高速になりたす。 あなたは公共亀通機関を䜿甚したす-それは安いでしょう。 なぜ公共亀通機関は安いのですか 倚くの参加者に䟡倀を広めるからです。 キャリッゞが発生したす。 運甚コストを党員ず分担したす。 そしお、私たちの堎合、目暙はたさにそれです。



他のDBMSがタスクを蚭定した堎合、たずえば、埅機時間は非垞に短くなりたすが、最倧スルヌプットではない可胜性がありたす。 垯域幅、私たちの状況では、RAMが䞎えるレむテンシは私たちにずっお十分であるず蚀いたした-たずえば、1぀のリク゚ストを凊理するのに数ミリ秒です。 これは到達したいパラメヌタヌであり、残りに぀いおはスルヌプットを最適化したい、぀たり 垯域幅。 リク゚ストの最倧数がコストを共有するようにしたす。 これぱンゞニアリングの芳点からどういう意味ですか



ネットワヌクが䜎速であり、ネットワヌクは本質的に高䟡です。 私たちは40幎前の叀代のオペレヌティングシステムの䞖界に䜏んでいるので、亀換するには費甚がかかりたす。たた、コアを芋ずにオンラむンに行く方法はありたせん。 ディスクも非垞に高䟡であり、ディスクの蚘録自䜓は遅いですが、ディスクを曞き蟌む必芁がありたす。これは、デヌタを保存しお電源障害に耐えるための唯䞀の方法だからです。 たた、1぀のスレッドで動䜜し、トランザクションを次々に実行するトランザクションプロセッサもありたす。 トランザクションプロセッサはパむプラむンです。 このコンベダを最小限のアむドル状態にする方法は



各リク゚ストにパむプラむンがある堎合、ネットワヌクに行き、ディスクに行きたすが、ほずんどの堎合、2回行う必芁がありたす。 圌はリク゚ストを読み、凊理し、ディスクに曞き蟌み、応答し、結果をクラむアントに枡す必芁がありたす。 ぀たり ディスクごずに1回、ネットワヌクに2回アクセスしたす。 このカタバシアはすべお非垞に長い時間がかかりたす。 1぀の芁求に察しお、できるだけ安く、ネットワヌクからできるだけ早く読み取るようにする必芁がありたす。 これのために䜕をしおいたすか プロトコルは完党に非同期で、パむプラむンモヌドで動䜜したす。 1぀の接続から倚くのクラむアントの芁求を読み取り、すべおのクラむアントに同時に応答できたす。 ぀たり 各クラむアントが独自の回答を取埗し、これらすべおを1぀の゜ケットで倚重化し、すべおのレベルでパむプ凊理を行いたす。 あらゆるレベルの䜜業でパむプラむン化。 これは、DBMSを構築する䞊で非垞に重芁なトレヌドオフです。 したがっお、私たちは同じスレッドで䜜業するため、マルチトレッドである他の゜リュヌションよりも埅ち時間が短くなりたすが、それにより1぀のリク゚ストのコストが削枛されたす。







実装の芳点から、私たちが存圚するパラダむムを䞊列化する方法を芋぀ける必芁がありたす。そのパラダむムではすべおを䞊列化したす。 このようなパラダむムは次のいずれかです。







実際に、これらのいずれかを遞択する必芁がありたす。 競合するスレッドがあるず蚀う堎合、これらのスレッド間で䜕らかの方法で情報を亀換するため、亀換方法を遞択する必芁がありたす。



私たちの堎合、これが特に重芁なのはなぜですか スレッド間で亀換する方法を遞択するず、これらのコストに圱響を䞎えるため、これらのコストは倚かれ少なかれ明らかです-カヌネル、ディスク、ネットワヌクに行くだけでなく、キャッシュ、プロセッサのキャッシュをフラッシュする頻床など、暗黙の事柄がありたす。぀たり 私たちずキャッシュはうたく機胜したすか そしお、これが暗黙的に起こるこずを考えるず、これは実際には霧の䞭の怜玢です。 䜕かが倉曎されたした-キャッシュが少し良くなり始め、生産性がわずかに向䞊したした。



実際、私たちは今、どの䞖界に䜏んでいたすか 凊理しおいるこの倧きなRAMに加えお、16〜32 MBのレベル3キャッシュがあり、これはすべおのコアで共有され、レベル3キャッシュの䜿甚をより効率的に開始すればするほど、うたく動䜜したす。 。 したがっお、私たちのタスクは、3次キャッシュを実際に機胜させ、効率的に機胜させるこずです。



さお、このような遞択肢がありたす䞊蚘のスラむドを参照。パラダむムに぀いお話しおいる堎合、これがすべお゚ンコヌドされおいるある皮のパラダむムを遞択する必芁がありたす。



今埌は、最埌のパラダむムを遞択したず蚀いたす-これは俳優モデルです、なぜですか







ロックはどうですか 私はすべおの意識的な生掻の䞭でミュヌテックスを䜿甚しおプログラミングしたした-玠晎らしいツヌルです。 効果的なプログラミングのためのmutexの䞻芁な問題の1぀は、合成の問題です。 私たちは䜕に぀いお話しおいるのですか たずえば、競合するデヌタ構造に挿入するクリティカルセクションがあるずしたす。 デヌタ構造は、倚数のスレッドで機胜したす。 この重芁なセクションを取り、それを䜕らかの方法でカプセル化したす。 䜕らかの競合デヌタ構造に挿入メ゜ッドがありたす。 次に、このデヌタ構造を䜿甚する特定のマクロ構造があり、クリティカルセクションでも機胜するはずです。 圌女も競争力がなければなりたせん。 ロックを䜿甚するず、単に1぀のメ゜ッドを別のメ゜ッドから取埗しお呌び出すこずができたせん;なぜ10回以䞊考える必芁がありたすか これにより、デッドロックや、ここで説明した他の問題が発生するこずはありたせん。 これはどこから来たのですか 単に盞互にロックを䜿甚するコヌドを勝手に䜿甚するこずはできたせん。カプセル化を実行し、問題をより小さなものに分解するず、メむンのプログラミングプロパティが倱われたす。 実際、埅機のないアルゎリズムは、デッドロックの問題ずいう1぀の問題を解決したす。 埅機なしのアルゎリズムは埅機しおいないため、デッドロックされたせん。 しかし、圌らは他の問題を解決したせんか アルゎリズムに関連する ロックモデルを䞭心に構築されおいたす。







デッドロックは埅機サむクルです。 コヌド内のある堎所からA、Bの順序でロックを䜿甚し、コヌド内の別の堎所からB、Aの順序でロックを䜿甚したす。 そしお、負荷の䞋で、このすべおが厩壊したした-デッドロック。



護衛ずホットスポットずは䜕ですか これは、埅ち時間のないアルゎリズムにも適甚されたす。 問題は䜕ですか このクリティカルセクションが2぀のスレッドで機胜するずいう前提でプログラムを䜜成したした。 たずえば、圌女にはプロデュヌサヌスレッド、コンシュヌマスレッドがあり、これらのスレッドは平均しおこのクリティカルセクションにアクセスしたす...毎秒1000リク゚ストの負荷があるずしたす。 したがっお、圌らは1秒間に1000回クリティカルセクションを参照したす。すべおがあなたのために機胜したす。 その埌、状況が倉わりたす。 ハヌドりェアが倉曎されおいるか、スレッドが実行しおいる䜜業が倉曎されおいる、たたはそれらが動䜜する環境が倉曎されおいたす。 このシステムにはただ未知のものがありたす。 構成可胜性、぀たり システムの拡匵ず調敎を開始するず、クリティカルセクションが突然熱くなりたす。 クリティカルセクションの䞋で実際に2぀の倉数を曎新する小さなこずを考えおみたしょう。ただし、蚈画どおりに1秒間に1000回ではなく、1秒間に10,000回、1秒間に100,000回、痙攣し始めたす。スレッドはコントロヌルなどから削陀されたす。 次に䜕が起こるでしょうか



優先順䜍や順序、぀たり 䞀郚のリク゚ストは優先床が高く、䞀郚のリク゚ストは優先床が䜎いず蚀いたす。 これにより、クリティカルセクションぞの優先床の高いリク゚ストが優先床の䜎いリク゚ストより優先されるようになる可胜性がありたす。 優先床が䜎くなるこずはありたせん-これは飢starです。



コンボむずは、倧きなクリティカルセクションに小さなクリティカルセクションが埋め蟌たれおいる堎合の状況であり、このため小さなクリティカルセクションに突入するこずはできたせん。



1぀の結論で䜕らかの圢で衚珟されるさたざたな状況がありたす-ロックは耇合的ではありたせん。 システムはロックを䞭心に蚘述されおおり、これがプログラミングの䞻芁なプリミティブである堎合、これからスケヌラブルなシステムを構築するこずはできたせん。



これは私だけでなく、30〜40幎前にアヌランを䜜ったアヌランのクリ゚むタヌにずっおも明らかでした。 抂しお、Tarantoolを蚘述するツヌルに぀いお話す堎合、このツヌルはおそらくErlangず呌ばれたす。







䞀般に、合成可胜性の問題を解決できるアプロヌチの1぀は、クリティカルセクションが明瀺的に定矩されおおらず、実行䞭に機胜の䟝存関係に基づいお䞊列凊理が決定される関数型プログラミングアプロヌチです。 ぀たり、どこにもロックをかけたせんが、同じ機胜を持っおいる堎合は、機胜的に別のロックに䟝存しおいるため、䜜成者に察しお透過的に実行を䞊列化できたす。



これは、これをかなりうたく行うこずができるあらゆる皮類の関数型蚀語で䜿甚されたす。 共通のデヌタがないため、共通のデヌタに関しお競合はありたせん。 関数型プログラミングが適しおいるようです。



しかし、残念ながら、システムプログラミング、぀たり 機胜的なアプロヌチずシステムプログラミングを組み合わせるために、䟝存する環境はありたせん。



このように、私は最初に私が甘やかしたモデルに来たす、そしお、これはたさに我々が熟考する必芁があるものです、それは我々が耇雑なシステムを䜜り、それを安くするこずを可胜にしたす。







アクタヌモデルを魅力的にするもの、぀たり 独立したメッセヌゞングモデル シングルスレッドシステムがありたす。このシステムには、すでに協調マルチタスクがありたす。 1぀のスレッドのレベルで、線圢に実行されるマむクロフロヌを䜜成したした。共有メモリを介しお盞互に察話できたす。問題はありたせんが、メッセヌゞを送信しお盞互に察話するこずもできたす。



スレッド間の盞互䜜甚の問題を解決するこずは私たちに残っおいたす。 「マスメッセヌゞングシステム」の図に戻りたしょう。







Networkスレッド、Transaction Processorスレッド、Write Ahead Loggingスレッドがあり、各スレッドのリク゚ストごずに、抂念的にぱンティティアクタヌ、アクタヌがありたす。 ネットワヌクスレッド内のアクタヌのタスクは、リク゚ストを取埗し、解析し、その正圓性を分析し、「このリク゚ストを実行しおください」ずいうメッセヌゞをトランザクションプロセッサに送信するこずです。 トランザクションプロセッサはリク゚ストを受け取り、そこに重耇キヌがあるかどうかを確認し、他の制玄違反があるかどうかを確認し、いく぀かのトリガヌを実行し、どこにでも挿入し、先読みログの察応するbadiに察しお「OK」-このリク゚ストを曞き蟌みたすドラむブ。 圌はリク゚ストを受け取り、ディスクに曞き蟌みたす。



文字通り、私たちがやった堎合、私たちは各リク゚ストに察しおメッセヌゞを亀換したす。 これを枛らしたい、぀たり このパラダむムでは、プログラムの゚ンティティにメッセヌゞを亀換しおもらいたいのですが、この亀換のコストは最小限です。 亀換を倚重化する䜕らかの方法が必芁です。 たた、アクタヌモデルは、メッセヌゞの亀換をカプセル化するずいう事実により、メッセヌゞをバッチで送信できたす。 ぀たり アクタヌモデルを䜿甚したす。䜕かを行うには、異なるスレッドの察応するアクタヌ間でメッセヌゞを送信する必芁がありたす。メッセヌゞが送信されるたびに、察応するアクタヌを停装したす。 。 コントロヌルからそれを削陀し、コントロヌルを次のアクタに転送したす。 したがっお、コルヌチンに基づいお、各スレッドで絶えず動䜜したすが、アクタヌ間で絶えず切り替わりたす。



なぜこれが私にずっお䞭心的な問題なのですか 「アクタヌモデル」スラむド䞊蚘参照に矎しいハむパヌキュヌブを描きたした。そこでは、たさにそのようなパラダむムの重芁性を匷調しおいたす。 ハむパヌキュヌブの特性は䜕ですか そこに結合の数がノヌドの数に比䟋しお増加するずいう事実、すなわち 二次関数ではなく、比䟋的に。



Tarantoolを䜿甚する堎合、このハむパヌキュヌブの頂点は個別のスレッドず芋なすこずができたす。 スレッド間の接続を䜎くしお、頂点間のリンクを介しおスレッド間のリンクを圢成する必芁がありたす。 そしお、私たちの仕事は、亀換が安䟡になるように、接続の数を少なく維持するこずです。



Kreiaなどの叀代のスヌパヌコンピュヌタヌを思い出しお蚭蚈を芋るず、実際にはハむパヌキュヌブの原理に基づいお構築されおいるこずがわかりたす。 䞀般に、通垞の機械匏電話スむッチを芋るず、同じ問題を解決しようずしおいたす-盞互䜜甚する倚くの゚ンティティの倚重化を3次元空間に適合させ、効果的に行う方法です。 これは、゚ンゞニアリングではなく、䜕らかの空間的思考であるこずが刀明したした。



4次元の超立方䜓が描画されるのはなぜですか 1぀のスレッドず1぀のスレッドでの盞互䜜甚に぀いおのみ説明したしたが、シャヌディング時に同じ問題が発生したす。リク゚ストがクラスタヌ内の任意のノヌドに到着し、このノヌドはこのリク゚ストを凊理するためにすべおのノヌドず察話する必芁がありたす。 債刞の数が2次成長するずいう同じ問題がありたす。 参加者数からのn個の2乗リンクがありたす。 そしお、接続数を制埡する唯䞀の方法は、䜕らかの方法でそのようなスペヌスに接続するこずです。



なぜ珟代のシステムの芳点からこのモデルが良いのですか 兞型的なチップを䜿甚する堎合、䞭心にあるこの小さなものはレベル3キャッシュです。







この意味で非垞に面癜いのは、2015幎のCISCずRISCアヌキテクチャのファンの間の論争です。 私は䞡手でARMプロセッサを支持しおいたす-圌らは最高の省゚ネなどを持っおいたすが、アヌキテクチャに関する議論は私を笑わせたす。なぜなら、抂しお、珟代のCPUは第3レベルの巚倧なキャッシュであり、他のすべおはチップ。 , – , 3- , .







Actor model , , ? 3- , , . , - , .. , , . , Intel , . . – , 1000 10000 . , latency 1-2 , , .



3 , -, – , .







1 2? , .



– , , . , , .



? , ?



, . , , ?







, , . , . , : « , ?». , , , , , – . .



. . , , , .. . , , , .. , , , multiversion concurrency control, .







, . , , .. , . , , , , – () runtime.



runtime , . . – , – . , .



. :







, 4 . . , , .. . . , , , – . , , , , , .



( , ) slab'. slab' , . , , . ぀たり 8 , . , , .







, - . thread local , slab_cache, buddy system.



buddy . , , , .. . , slab 4 , . Buddy slab_cache , 2 4 . , , .. , – buddy. , , .. . , , slab cache', .



, , – , , .. , , , . , - , , , . .







pool – object pool, slab cache , slab', , 2 , 4 , slab' - . – .



, connection fiber, user, – . , , mempool'. mempool', , .







mempool'e slab , . slab . , , . slab' . – 24 24 – , , slab' 4 . 32 – - slab' 4 , 40 – slab' 4 , 48 – slab' 8 . , , .



slab – , slab. ぀たり , , 200 , slab' 4 , – – ! – 800 -, , . , . slab – – – . , 8 , .. . 8 slab.



, tarantool. url – github.com/tarantool/small , , , , , , . , , rtfs.







? , . , – . , , - – region , , .. obj-. JCC , , open source. , . ぀たり region slab slab'.



string, string? : , – , , .. ぀たり . , , .



, , ? . ? , - . , ? , , . – , – . . , , - , .. , , - , .. . – . – , « «», , , ». ぀たり . , . , , .. , .



, . , , 4- . , , , . ?







, , – - . ? ( , ). small – small object allocation. – memory address translation. ぀たり – user space tlb. , 32- . , , , , , 8- , 32- . - , - . . . , . , , 16 , 32, 64 .. – . 32- . 圌はどのように働いおいたすか



, 3- . root root extent' . extent' – 2048, root 11 32- . extent, .. , , – , .. 11 . , , .. , , .



, .. . , , free . – 10 . - . - , , l-3 , .



? , .. . , . ? , , – - extent' , , copy on write . , , .. , free . . , , , .



? , .. , . , Tarantool std::map? , , . , , std::map .







, ( 1.7), , slab . , , .. , , garbage collection, .



? , -, .. – . . , : 10 – , 15 – , , , , , , . . .



, ? , , - - extent' , .. , . 䜕ができたすか extent , , , , , – .



, , , , , , .. slab , . , , – . . , , .



?







, . -? , – – . , . , , . , , , , , , , ? , .



, , ++ , , , . , , . , , , , , , .







– , . ぀たり . , , . どのように機胜したすか



, 16 . 8 – , , 32- – . .



. – , . ぀たり , 3 , 4, 4 – 4, 5 – 8. , . , , . 1 .



– , . , – 2, 0. , , , , 4 , , 4 – . 5- , . 5 , , 8-. , , 4-, 4 , 8 . 0 , , , .



– , .. , .. . , – , , , , , . 1 .



: cver , . , , , .



« ». . , MySQL, Monty Hash, MySQL. .



? , , .







. ? Tarantool 1.3 1.4 , , ? : – , , , 16 , – , . – . AVL , B , , , – , .. , 30-40% . , , .. , , , , , - , , . – B+* :







? , , – 20 , , , 40. , , , , .



, , , . , . ぀たり , , , . , , , , 32- .



:







, 3- , - - . , .



B+, B+* B , ..? 2/3, , , . . , 1/2, - . 1/2, 1/2 – , , , , - 1/2 . 2/3, .. , , , , . , , . , .



?







, , .. 1.1 log(N) . , , .



, , , – 1.6. 30-40% , .. , – , 40 %, 2-3- , 2 . ぀たり , , .



連絡先



» kostja

» Mail.ru



— HighLoad++ . 2016 — HighLoad++ , 7 8 .



— HighLoad++ . 2016 Tarantool " ".



, HighLoad++ Tarantool . () , , .



- HighLoad.Guide — , , , . 30 . !





All Articles