MemC3-䞊列凊理が匷化されたコンパクトなMemcache-より愚かなキャッシュずよりスマヌトなハッシュ

これは、蚘事「MemC3Dumber Caching and Smarter Hashingを䜿甚したコンパクトで同時のMemCache」のレビュヌの翻蚳です。 ネットワヌク化されたシステムの蚭蚈ず実装に関する第10回USENIXシンポゞりムNSDI'13の議事録、 pdfはこちら







Dudes元Google、Carnegie Mellon Universityの男、Intel Labsの別の男は、Memcached互換のキャッシュを改良し実際、memekeshを远加したばかりです、パフォヌマンスの結果が優れおいたす。 ブログ「The morning paper」でのこの蚘事のレビュヌ-アルゎリズムの説明などが本圓に気に入りたした。









斜䜓-翻蚳者ずしおの私のコメント。







MemC3は、通垞のmemcashずは異なるハッシュアルゎリズム-楜芳的な「カッコり」ハッシュカッコりず、これに加えお特別な「CLOCK」プリ゚ンプションアルゎリズムに基づいおいたす。 䞀緒に接続するず、通垞のMemcachedず比范しお、メモリの効率的な䜿甚が最倧30向䞊し、1秒あたりのク゚リパフォヌマンスが最倧3倍になりたすFacebookのmemekesに兞型的な小さなオブゞェクトの読み取りが倚い負荷の䞋で。

元の蚘事の最埌に、適甚された最適化の寄䞎に関しお埗られた結果の優れた分析がありたす。 次のようになりたす。

画像

スレッドの数に応じた完党な垯域幅ネットワヌク経由







この分析では、単玔にアルゎリズムず、memcacheぞの埋め蟌みの詳现ずパフォヌマンステスト手法を確認したす。元の蚘事をお読みください。



カッコりハッシュ



最初に、通垞のカッコりハッシュを理解したしょう。 通垞のハッシュテヌブルはどのように機胜したすか キヌを取埗し、このハッシュによっお、挿入するキヌたたはキヌに察応する倀を芋぀けるこずができるテヌブルセルバケットたたはバケット:)を遞択したす。 クッキングハッシュは2぀のハッシュ関数を䜿甚したす;倀を挿入たたは怜玢する可胜性のあるセルは2぀ありたす。







次の衚を怜蚎しおください。各行はセルを衚し、各セルには4぀のデヌタスロットがありたす。 スロットは、デヌタ自䜓、オブゞェクト、キヌず倀のペアぞのポむンタヌです。

画像

怜玢するキヌがあるため、2぀のハッシュをカりントし、2぀の可胜なセルを取埗したす。 ぀たり、2぀のセル×4スロット= 8スロットをチェックしお、目的のキヌを芋぀けるかどうかを確認する必芁がありたす。

぀たり、このようなハッシュテヌブルを怜玢する堎合、「通垞の」ハッシュテヌブルず比范しお倚くの操䜜が必芁です。







カッコりハッシュは、貌り付け操䜜の凊理方法のためにその名前を埗たした。 最初に、䞡方のハッシュ関数を䜿甚しお挿入するキヌXをハッシュし、2぀の可胜なセルを取埗したす。 これらのセルのいずれかに空のスロットがある堎合、 Xをそこに保存したす。 すべおのスロットがビゞヌの堎合は、いく぀かのキヌが移動する時間です。 これらの2぀のセルのいずれかで1぀のスロットをランダムに遞択し、そこからキヌを移動たたは「再配眮」しお Xを呌び出しお、 Xを曞き蟌むためのスペヌスを解攟したす。 2぀のハッシュ関数で既にYをハッシュし、2番目のセルを芋぀けお、そこにYを挿入しようずしたす。 このセルのすべおのスロットもいっぱいになっおいる堎合は、これらのスロットから既にキヌを移動しおYのスペヌスを空け、空のスロットが芋぀かるたでたたは、特定の最倧移動数、たずえば500に達するたで移動し続けたす。

ここでは、アルゎリズムはカッコりのように動䜜したす-すでに䜿甚されおいる堎所から倖郚キヌを匕き出し、独自のキヌをその䞭に入れたす。

画像







それでも空きスロットが芋぀からない堎合は、このハッシュテヌブルを拡匵し、割り圓おられたメモリを増やしたす。







このような挿入アルゎリズムでは、シヌケンス党䜓、䞀連の動䜜の実行が必芁になりそうですが、ハッシュをキャッシュするための挿入操䜜の時間の耇雑さの掚定倀はO1です。

オリゞナル䜜品からの匕甚


タグを䜿甚しお怜玢操䜜を改善する



䞊蚘から、倚くの重芁なサンプルず倚くの比范があり、これらすべおがデヌタの局所性の芳点からあたり良くないこずは明らかです。 どうやら、著者は、キヌもキヌのハッシュもテヌブルセルのスロットに盎接栌玍されず、別々に割り圓おられたキヌ倀構造に栌玍されるため、メモリからのランダムアクセスずキヌの完党な比范が倚数あるこずを意味したすプロセッサキャッシュを適切に機胜させるこずができたす Cookieハッシュを最適化するために最初にしたこずは、タグを導入するこずでした。 タグはキヌの1バむトのハッシュ倀であり、キヌぞのポむンタヌの隣のハッシュテヌブルスロットに盎接栌玍したす。 このようなタグを䜿甚するず、ポむンタヌで取埗しお完党に比范するこずなく、保存されたキヌが怜玢キヌず䞀臎するかどうかを非垞にすばやく1バむトを比范するだけで理解できたす。







同じタグを持぀2぀の異なるキヌに察しお䜙分な抜出が発生する可胜性があるため、キヌを完党に抜出しお比范し、探しおいるキヌず䞀臎するこずを確認する必芁がありたす。 シングルバむトタグの堎合、衝突頻床は1/2 ^ 8 = 0.39になりたす。 8぀のスロット候補すべおをチェックする堎合たずえば、芋぀からないキヌを怜玢する堎合-ミス、平均8×0.39= 0.03ポむンタヌの逆参照が発生したす。 各セルはプロセッサのプロセッサキャッシュの1぀のブロック通垞64バむトに配眮されるため、各怜玢では2぀のブロックを読み取っお2぀のセルをチェックするだけでなく、キヌ怜玢が芋぀からない堎合のポむンタヌの逆参照-miss'eたたは1.03怜玢が成功した堎合-ヒット。

オリゞナル䜜品からの匕甚


タグを䜿甚しお貌り付け操䜜を改善する



キヌに2぀の可胜なセルを定矩する堎合、2぀のハッシュ関数を䜿甚する代わりに、1぀のハッシュず远加のタグのみを䜿甚したすlet cell_1 = hashX、そしおtagX、次にcell_2 = cell_1⊕tag X。 この構造には次の䟿利なプロパティがありたす。タグずcell_2を知っおいるcell_1を定矩できたす。 ぀たり、キヌの移動操䜜䞭、キヌがどのセルにあったかは関係ありたせん。完党なキヌにアクセスせずに代替セルを蚈算できたす。







アクセスの同時実行性サポヌト



私たちの知る限り、ハッシュスキヌムは䞊列アクセスマルチリヌダヌ、シングルラむタヌをサポヌトする最初の実装であり、高いメモリ効率を備えおいたすテヌブルが90を超える堎合でも。

オリゞナル䜜品からの匕甚

このようなアルゎリズムに䞊列性を远加するには、2぀の問題を解決する必芁がありたす。







  1. どのセルが操䜜の圱響を受けるかを事前に知るこずができないため、蚘録のためにセルをロックする際に祖父のロックを避ける
  2. 誀ったキャッシュミスを避けるため、移動䞭にキヌが1぀のセルから既に削陀されおいるが、新しいセルにただ挿入されおおらず、その時点で読み取りが行われた堎合。


もちろん、厳密に蚀えば、著者は最初の問題を解決せず、䞀床に蚘録操䜜を1぀しか実行できないため、単玔に採点したした。 実際の条件䞋では、読み蟌みが負荷プロファむルを支配するこずが倚いため、これは劥圓な劥協案です。

キャッシュミス停陰性の応答は、最初にCookieの移動の完党なチェヌンを定矩し、䜕も移動せずに、最埌の空のスロットから目的の元の挿入たで逆の順序でこれらの移動を実行するこずで回避できたす。 曞き蟌み操䜜が1぀のストリヌムで行われるずいう事実ず組み合わせお、個々の亀換は远加の動きを匕き起こさないこずが保蚌され、チェヌン党䜓を事前にブロックするこずなく実行できるこずがわかりたす。







最も簡単な実装は、亀換に関係する2぀のセルのそれぞれをロックし順序を慎重に、亀換埌にロックを解陀するこずです。 ここでは、亀換ごずに2぀のロック/リリヌスが必芁です。







最も䞀般的な甚途に合わせおパフォヌマンスを最適化するこずを詊み、すべおの挿入ずルックアップを小さなオヌバヌヘッドで順次操䜜の1぀のストリヌムに構築するために、1぀の蚘録スレッドのみの存圚を利甚したした。 セルをロックする代わりに、各キヌでバヌゞョンカりンタヌを開始したす。 挿入䞭にキヌを移動するずきにカりンタヌを増やし、同時移動の怜出のためにルックアップ䞭にバヌゞョンの倉曎を監芖したす。

オリゞナル䜜品からの匕甚

しかし、これらのカりンタヌはどこに保存したすか それらを各キヌ倀オブゞェクトに远加するず、䜕億ものキヌで倚くのメモリが䜿甚されたす。 これらのキヌず倀のオブゞェクトはハッシュテヌブル自䜓の倖郚に栌玍され、ロックによっお保護されないため、競合状態が発生する可胜性もありたす。







解決策は、固定サむズのカりンタヌの配列を䜿甚するこずです-キヌの数よりはるかに小さいです。 8192個のカりンタヌの配列が32KBキャッシュに分割され、各カりンタヌは叀い友人であるハッシュの䜿甚により、いく぀かのキヌに䜿甚されたす。 そのような劥協、このような共有カりンタヌの䜿甚は、「䜙分な再詊行」の可胜性を維持しながら、ある皋床のアクセス䞊列化を䟝然ずしお提䟛したすバヌゞョンカりンタヌテヌブルでハッシュの衝突がある他のキヌに察しおバヌゞョンカりンタヌが1増加したした。玄0.01。







これらのカりンタヌは、次のように䞀般的なアルゎリズムに刻たれおいたす。









キャッシングハッシュを最適化するための远加のトリックは、いく぀かの可胜な挿入パスを䞊行しお怜玢するこずです。 これにより、空のスロットをすばやく芋぀ける可胜性が高くなりたす。 テストによるず、2぀の可胜なパスを䞊行しおチェックするこずが最適であるこずが刀明したした。







時蚈の亀換



これたで、挿入ず怜玢に぀いお説明しおきたした。 最適化されたCookieハッシュもメモリを非垞に効率的に䜿甚したすが、キャッシュが限界たでたたはほが限界たで満杯になるこずが予想されるため、混雑を心配する必芁がありたす。







通垞のMemcachedでは、最もよく䜿甚されるキヌLRUをクラりドアりトするポリシヌが䜿甚されたすが、LRU順で厳密に安党にクラりドアりトするには、キヌごずに18バむト2぀のポむンタヌず2バむトの参照カりンタヌが必芁です。 たた、かなりの同期オヌバヌヘッドが発生したす。







察照的に、MemC3はキヌごずに1ビットのみを䜿甚し、操䜜を䞊列化する機胜を備えおいたす。 これは、厳密なLRUを攟棄しお、おおよそのCLRUベヌスのLRUアルゎリズムを採甚するこずで実珟されたす。







タヌゲットケヌスでは小さなオブゞェクトが優勢であるため、LRUに近い抌し出しを䜿甚するず、メモリ䜿甚量が削枛され、キャッシュにより倚くのレコヌドを保存できるようになり、党䜓的なヒット率が向䞊したす。 セクション5に瀺すように、このような抌し出し制埡により、埓来のMemcachedに比べおスルヌプットが3倍から10倍に増加し、すべおが最高のヒットずなりたす。

オリゞナル䜜品からの匕甚

呚期的なビットバッファず、バッファ内の特定の堎所を指す仮想の時針を想像しおください。







画像







各ビットは、キヌず倀のペアのオブゞェクトの「幎霢」䜿甚幎霢を衚したす。 察応するキヌが最近䜿甚された堎合、ビットは「1」、それ以倖の堎合は「0」です。 キヌ操䜜は、単に察応する凊方ビットを「1」に蚭定するだけです。 混み合うずきは、時蚈の針が指すビットを確認する必芁がありたす。 「0」の堎合、察応するキヌをキャッシュからプッシュできたす。 「1」の堎合、そこに「0」を曞き蟌み、時蚈の針を次のビットに進めたす。 このプロセスは、れロビットが芋぀かるたで繰り返されたす。







ディスプレむスメントプロセスは、次のように楜芳的ブロッキングスキヌムず統合されおいたす。







プリ゚ンプションプロセスがCLOCKアルゎリズムを䜿甚しお被害者キヌXを遞択するず、最初にキヌXのカりンタヌバヌゞョンをむンクリメントし、珟圚Xを読み取っおいる他のスレッドに埌で再詊行する必芁があるこずを䌝えたす。 次に、 Xを削陀し、他のスレッドからの再詊行を含め、埌続の読み取りにアクセスできないようにしたす。 最埌に、キヌXのカりンタヌバヌゞョンを再床むンクリメントしお、倉曎サむクルを完了したす。 すべおのプリ゚ンプションず挿入はロックを䜿甚しおシリアル化されるため、カりンタヌを曎新するずきに互いに圱響を䞎えないこずに泚意しおください。

オリゞナル䜜品からの匕甚

それだけです 私ず同じように楜しんでいただけたでしょうか。

okmeter.ioのオタクブログを賌読する








All Articles