-
Notifications
You must be signed in to change notification settings - Fork 281
Description
Hi,
In our application, we are observing high spin times inside spinlock
. Typical use case that we observe the contention is many threads (64+ threads running on a 32 psychical cores machine with hyper-threading enabled, the contention starts the show up after 16 threads) and all of them contenting on find
API trying to acquire the spinlock for the same keys from the hashtable.
We tried adding Exclusive/Shared locking semantics to the spinlock implementation (which we have tested internally and confirmed it helped reducing the spinlock wait times significantly under high concurrency mostly with read-only threads), we'd like to get your opinions on this.
I created a PR for your assessment a67ae05
We are not currently using this change in production (therefore it's not battle-tested so to speak), we'd like to understand the original reasoning behind the single mode spinlock implementation and also the implementation in the PR whether it's not violating assumptions of the hashtable.
Please also note that, there were 2 lines I had to remove from lock_two
function for normal_mode_shared
specialization as following;
rehash_lock<kIsLazy>(l1);
rehash_lock<kIsLazy>(l2);
Because these 2 lines were calling mutating functions downstream even when find
API used. To be honest, I couldn't understand why they were exercised even for read path so please advise whether it was ok to remove these lines for read-only find
API (If it was intentional for find
APIs to make these calls when calling lock_two
, can you help us to understand why?)
Note, I ran existing unit tests and stress tests, they seem to be passing. If you think the PR is reasonable, I can add more stress testing focusing on locking mode aspect of different API calls.
Similar issue I found was #146 but the proposal was different, so I wanted to post this separately.
Thank you in advance,
Serkan