Skip to content

[FEATURE] Use a sharded locking structure instead of a single lock for the Global Allocator #552

@KarthikSubbarao

Description

@KarthikSubbarao

The problem/use-case that the feature addresses

Use a sharded locking structure instead of a single global lock.

There is a major bottle neck in fulltext (maybe even non vector queries) where the allocations from reader/writer threads are stuck waiting on the single global bottle neck. Depending on the workload, 30%-40% of time is just spent here.

An idea for reducing this bottle neck is to move from a single lock + hashset to a sharded system where have multiple ((e.g. 64 or 128)) such structures that track pointers and have their own individual locks

Example:

Samples: 423K of event 'task-clock:ppp', 4000 Hz, Event count (approx.): 72318823208 lost: 0/0 drop: 0/118909
Overhead  Shared Object         Symbol
  34.91%  libsearch.so          [.] absl::lts_20240722::Mutex::Lock()                                                                     ◆
   9.17%  libsearch.so          [.] valkey_search::indexes::text::RadixTree<valkey_search::indexes::text::InvasivePtr<valkey_search::index▒
   8.33%  libsearch.so          [.] vmsdk::ReportFreeMemorySize(unsigned long)                                                            ▒
   7.27%  libsearch.so          [.] vmsdk::ReportAllocMemorySize(unsigned long)                                                           ▒
   6.65%  libsearch.so          [.] __wrap_free                                                                                           ▒
   5.22%  libsearch.so          [.] absl::lts_20240722::Mutex::Unlock()                                                                   ▒
   3.05%  libsearch.so          [.] valkey_search::indexes::text::Postings::KeyIterator::ContainsFields(unsigned long) const              ▒
   2.57%  [kernel]              [k] 0xffffffff94cec011                                                                                    ▒
   1.90%  libsearch.so          [.] valkey_search::indexes::PrefilterEvaluator::EvaluateText(valkey_search::query::TextPredicate const&, b▒
   1.70%  libstdc++.so.6.0.33   [.] std::_Rb_tree_increment(std::_Rb_tree_node_base const*)                                               ▒
   1.42%  libsearch.so          [.] absl::lts_20240722::Mutex::LockSlowLoop(absl::lts_20240722::SynchWaitParams*, int)                    ▒
   1.36%  valkey-server         [.] VM_Alloc                                                                                              ▒
   1.13%  valkey-server         [.] valkey_free                                                                                           ▒
   0.92%  libc.so.6             [.] syscall                                                                                               ▒
   0.86%  libsearch.so          [.] absl::lts_20240722::Mutex::UnlockSlow(absl::lts_20240722::SynchWaitParams*)                           ▒
   0.80%  libsearch.so          [.] valkey_search::query::TermPredicate::Evaluate(valkey_search::indexes::text::TextIndex const&, valkey_s▒
   0.75%  [kernel]              [k] 0xffffffff93bd7ddd                                                                                    ▒
   0.75%  libsearch.so          [.] valkey_search::indexes::text::TermIterator::FindMinimumValidKey()                                     ▒
   0.70%  valkey-server         [.] je_malloc_usable_size                                                                                 ▒
   0.68%  libsearch.so          [.] valkey_search::query::TermPredicate::GetTextIndexSchema() const                                       ▒
   0.57%  libsearch.so          [.] valkey_search::indexes::text::Postings::KeyIterator::SkipForwardKey(valkey_search::InternedStringPtr c▒
   0.53%  libsearch.so          [.] std::deque<valkey_search::indexes::Neighbor, std::allocator<valkey_search::indexes::Neighbor> >::_M_de▒
   0.53%  [kernel]              [k] 0xffffffff93bd7df6                                                                                    ▒
   0.29%  [kernel]              [k] 0xffffffff94cd60d5                                                                                    ▒
   0.26%  libsearch.so          [.] absl::lts_20240722::Enqueue(absl::lts_20240722::base_internal::PerThreadSynch*, absl::lts_20240722::Sy▒
   0.23%  libsearch.so          [.] absl::lts_20240722::synchronization_internal::FutexWaiter::Wait(absl::lts_20240722::synchronization_in▒
   0.23%  [kernel]              [k] 0xffffffff93cc1f53                                                                                    ▒
   0.22%  libsearch.so          [.] absl::lts_20240722::synchronization_internal::FutexWaiter::Post()  

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions