Algorithmic ¡Improvements ¡for ¡ Fast ¡Concurrent ¡Cuckoo ¡Hashing ¡ Xiaozhou ¡Li ¡ ( Princeton ) ¡ David ¡G. ¡Andersen ¡(CMU) ¡ Michael ¡Kaminsky ¡(Intel ¡Labs) ¡ Michael ¡J. ¡Freedman ¡(Princeton) ¡
In ¡this ¡talk ¡ • How ¡to ¡build ¡a ¡fast ¡concurrent ¡hash ¡table ¡ – algorithm ¡and ¡data ¡structure ¡engineering ¡ • Experience ¡with ¡hardware ¡transacJonal ¡memory ¡ – does ¡NOT ¡obviate ¡the ¡need ¡for ¡algorithmic ¡opJmizaJons ¡
Concurrent ¡hash ¡table ¡ • Indexing ¡key-‑value ¡objects ¡ – Lookup(key) – Insert(key, value) – Delete(key) • Fundamental ¡building ¡block ¡for ¡modern ¡systems ¡ – System ¡applicaJons ¡(e.g., ¡kernel ¡caches) ¡ – Concurrent ¡user-‑level ¡applicaJons ¡ • Targeted ¡workloads: ¡ small ¡objects, ¡high ¡rate ¡
Goal: ¡memory-‑efficient ¡and ¡high-‑throughput ¡ ¡ • Memory ¡efficient ¡(e.g., ¡> ¡90% ¡space ¡uJlized) ¡ • Fast ¡concurrent ¡reads ¡(scale ¡with ¡# ¡of ¡cores) ¡ • Fast ¡concurrent ¡writes ¡(scale ¡with ¡# ¡of ¡cores) ¡
Preview ¡our ¡results ¡on ¡a ¡quad-‑core ¡machine ¡ 64-‑bit ¡key ¡and ¡64-‑bit ¡value ¡ 120 ¡million ¡objects, ¡ ¡100% ¡ Insert C++11 ¡std::unordered_map ¡ Google ¡dense_hash_map ¡ Intel ¡TBB ¡concurrent_hash_map ¡ cuckoo+ ¡with ¡fine-‑grianed ¡locking ¡ cuckoo+ ¡with ¡HTM ¡ cuckoo+ ¡uses ¡(less ¡than) ¡half ¡of ¡ 0 ¡ 10 ¡ 20 ¡ 30 ¡ 40 ¡ the ¡memory ¡compared ¡to ¡others ¡ Throughput ¡(million ¡reqs ¡per ¡sec) ¡
Background: ¡separate ¡chaining ¡hash ¡table Chaining ¡items ¡hashed ¡in ¡same ¡bucket ¡ lookup K V K V K V Good: ¡simple ¡ K V Bad: ¡poor ¡cache ¡locality ¡ ¡ ¡ Bad: ¡pointers ¡cost ¡space ¡ K V - e.g., ¡Intel ¡TBB ¡ concurrent_hash_map K V
Background: ¡open ¡addressing ¡hash ¡table Probing ¡alternate ¡locaJons ¡for ¡vacancy ¡ e.g., ¡linear/quadraJc ¡probing, ¡double ¡hashing ¡ Good: ¡cache ¡friendly ¡ lookup ¡ Bad: ¡poor ¡memory ¡efficiency ¡ - performance ¡dramaJcally ¡degrades ¡when ¡the ¡ usage ¡grows ¡beyond ¡70% ¡capacity ¡or ¡so ¡ - e.g., ¡Google ¡ dense_hash_map ¡wastes ¡50% ¡ memory ¡by ¡default. ¡ ¡
Our ¡starJng ¡point ¡ • MulJ-‑reader ¡single-‑writer ¡cuckoo ¡hashing ¡[Fan, ¡NSDI’13] ¡ – Open ¡addressing ¡ – Memory ¡efficient ¡ – OpJmized ¡for ¡read-‑intensive ¡workloads ¡
Cuckoo ¡hashing ¡ Each ¡bucket ¡has ¡ b ¡slots ¡for ¡items ¡( b -‑way ¡set-‑associaJve) ¡ Each ¡key ¡is ¡mapped ¡to ¡two ¡random ¡buckets ¡ – stored ¡in ¡one ¡of ¡them ¡ buckets ¡ 0 1 2 hash 1 (x) ¡ 3 4 key ¡x ¡ 5 6 hash 2 (x) ¡ 7 8
Predictable ¡and ¡fast ¡lookup ¡ • Lookup : ¡read ¡2 ¡buckets ¡in ¡parallel ¡ – constant ¡Jme ¡in ¡the ¡worst ¡case ¡ ¡ 0 1 2 3 4 Lookup ¡x ¡ 5 6 7 x ¡ 8
Insert ¡may ¡need ¡“cuckoo ¡move” ¡ • Insert : ¡ 0 1 2 Write ¡to ¡an ¡empty ¡slot ¡in ¡ 3 one ¡of ¡the ¡two ¡buckets ¡ 4 Insert y ¡ 5 6 7 8
Insert ¡may ¡need ¡“cuckoo ¡move” ¡ • Insert : ¡ 0 1 r ¡ e ¡ 2 s ¡ 3 b ¡ Both ¡are ¡full ? ¡ c ¡ f ¡ 4 Insert y ¡ n ¡ 5 a ¡ 6 k ¡ 7 x ¡ 8
Insert ¡may ¡need ¡“cuckoo ¡move” ¡ • Insert : ¡ move ¡keys ¡to ¡alternate ¡buckets ¡ 0 1 r ¡ possible ¡ b ¡ e ¡ 2 locaBons ¡ s ¡ b ¡ 3 possible ¡ a ¡ c ¡ f ¡ 4 locaBons ¡ Insert y ¡ n ¡ 5 a ¡ possible ¡ x ¡ ¡ 6 locaBons ¡ k ¡ 7 x ¡ 8
Insert ¡may ¡need ¡“cuckoo ¡move” ¡ • Insert : ¡move ¡keys ¡to ¡alternate ¡buckets ¡ – find ¡a ¡“cuckoo ¡path” ¡to ¡an ¡empty ¡slot ¡ ¡ – move ¡hole ¡backwards ¡ 0 A ¡technique ¡in ¡[Fan, ¡NSDI’13] ¡ ¡ 1 No ¡reader/writer ¡false ¡misses ¡ 2 3 b ¡ b ¡ 4 Insert y ¡ y ¡ 5 a ¡ a ¡ 6 7 x ¡ x ¡ 8
Review ¡our ¡starJng ¡point ¡[Fan, ¡NSDI’13]: ¡ MulJ-‑reader ¡single-‑writer ¡cuckoo ¡hashing ¡ • Benefits ¡ – support ¡concurrent ¡reads ¡ – memory ¡efficient ¡for ¡small ¡objects ¡ over ¡ 90% ¡space ¡uJlized ¡when ¡ set-‑associaBvity ¡≥ ¡4 ¡ • Limits ¡ 50% ¡Lookup ¡ 100% ¡Lookup ¡ – Inserts ¡are ¡serialized ¡ poor ¡performance ¡for ¡ write-‑heavy ¡ workloads ¡
Improve ¡write ¡concurrency ¡ • Algorithmic ¡opJmizaJons ¡ - Minimize ¡criJcal ¡secJons ¡ - Exploit ¡data ¡locality ¡ • Explore ¡two ¡concurrency ¡control ¡mechanisms ¡ - Hardware ¡transacJonal ¡memory ¡ - Fine-‑grained ¡locking ¡
Algorithmic ¡opJmizaJons ¡ • Lock ¡aoer ¡discovering ¡a ¡cuckoo ¡path ¡ – minimize ¡criJcal ¡secJons ¡ • Breadth-‑first ¡search ¡for ¡an ¡empty ¡slot ¡ – fewer ¡items ¡displaced ¡ – enable ¡prefetching ¡ • Increase ¡set-‑associaJvity ¡(see ¡paper) ¡ – fewer ¡random ¡memory ¡reads ¡
Previous ¡approach: ¡writer ¡locks ¡the ¡table ¡ during ¡the ¡whole ¡insert ¡process ¡ All ¡ Insert ¡operaBons ¡of ¡other ¡threads ¡are ¡ blocked ¡ lock(); Search f for a a cu cuckoo p path; // ¡at ¡most ¡hundreds ¡of ¡bucket ¡reads ¡ Cuckoo mo move ve a and i insert; // ¡at ¡most ¡hundreds ¡of ¡writes ¡ unlock();
Lock ¡aoer ¡discovering ¡a ¡cuckoo ¡path ¡ MulBple ¡ Insert ¡threads ¡can ¡look ¡for ¡cuckoo ¡paths ¡concurrently ¡ Search for a cuckoo path; // ¡no ¡locking ¡required ¡ lock(); Cuckoo mo move ve a and i insert; unlock(); ¡ ←collision ¡
Lock ¡aoer ¡discovering ¡a ¡cuckoo ¡path ¡ MulBple ¡ Insert ¡threads ¡can ¡look ¡for ¡cuckoo ¡paths ¡concurrently ¡ while(1) { Search for a cuckoo path; // ¡no ¡locking ¡required ¡ lock(); valid; ¡ Cuckoo mo move ve a and i insert w while t the p path i is v if(success) unlock(); break; unlock(); }
Cuckoo ¡hash ¡table ¡ ⟹ ¡undirected ¡cuckoo ¡graph ¡ bucket ¡ ⟶ ¡vertex ¡ ¡ ¡ ¡ ¡ ¡ ¡key ¡ ⟶ ¡edge ¡ 0 x ¡ 0 ¡ 1 ¡ 1 a ¡ x ¡ x ¡ a ¡ a ¡ 3 3 ¡ ⟹ ¡ b ¡ b ¡ y ¡ y ¡ c ¡ b ¡ 6 7 ¡ 6 ¡ y ¡ 7 c ¡ z ¡ z ¡ c ¡ z ¡ 9 9 ¡
Previous ¡approach ¡to ¡search ¡for ¡an ¡empty ¡slot: ¡ ¡ random ¡walk ¡ on ¡the ¡cuckoo ¡graph ¡ Insert ¡ y ¡ a ¡ * ¡ cuckoo ¡path: ¡ ¡ a ➝ e ➝ s ➝ x ➝ k ➝ f ➝ d ➝ t ➝∅ ¡ * ¡ e ¡ 9 ¡writes ¡ * ¡ s ¡ x ¡ * ¡ One ¡ Insert ¡may ¡move ¡at ¡most ¡ hundreds ¡ of ¡items ¡when ¡table ¡occupancy ¡> ¡90% ¡ * ¡ k ¡ * ¡ f ¡ d ¡ * ¡ t ¡ * ¡ * ¡ ∅ ¡
Breadth-‑first ¡search ¡for ¡an ¡empty ¡slot ¡ Insert ¡ y ¡ Insert ¡ y ¡ a ¡ * ¡ a ¡ * ¡ * ¡ * ¡ * ¡ e ¡ z ¡ * ¡ * ¡ s ¡ * ¡ * ¡ * ¡ u ¡ * ¡ * ¡ * ¡ * ¡ x ¡ * ¡ * ¡ * ¡ * ¡ ∅ ¡ * ¡ k ¡ * ¡ f ¡ d ¡ * ¡ t ¡ * ¡ * ¡ ∅ ¡
Breadth-‑first ¡search ¡for ¡an ¡empty ¡slot ¡ Insert ¡ y ¡ cuckoo ¡path: ¡ ¡ a ¡ * ¡ a ➝ z ➝ u ➝∅ ¡ ¡ ¡ ¡ ¡ 4 ¡writes ¡ * ¡ * ¡ z ¡ * ¡ Reduced ¡to ¡a ¡ logarithmic ¡factor ¡ * ¡ * ¡ * ¡ u ¡ * ¡ * ¡ * ¡ * ¡ • Same ¡# ¡of ¡reads ¡ ⟶ ¡unlocked ¡ * ¡ * ¡ * ¡ ∅ ¡ • Far ¡fewer ¡writes ¡ ⟶ ¡ locked ¡ Prefetching : ¡ scan ¡ one ¡bucket ¡and ¡ load ¡ next ¡bucket ¡concurrently ¡
Concurrency ¡control ¡ • Fine-‑grained ¡locking ¡ – spinlock ¡and ¡lock ¡striping ¡ • Hardware ¡transacJonal ¡memory ¡ – Intel ¡TransacJonal ¡SynchronizaJon ¡Extensions ¡(TSX) ¡ – Hardware ¡support ¡for ¡lock ¡elision ¡
Lock ¡elision ¡ Thread ¡1 ¡ Thread ¡2 ¡ Lock: ¡ Free ¡ acquire ¡ acquire ¡ Time ¡ criJcal ¡ secJon ¡ criJcal ¡ secJon ¡ release ¡ release ¡ Hash ¡Table ¡ No ¡serializaFon ¡if ¡no ¡data ¡conflicts ¡
Recommend
More recommend