Re: rwlocks: poor performance with adaptive spinning
- From: "Attilio Rao" <attilio@xxxxxxxxxxx>
- Date: Wed, 26 Sep 2007 08:59:37 +0200
2007/9/26, Jeff Roberson <jroberson@xxxxxxxxxxxxxx>:
On Tue, 25 Sep 2007, John Baldwin wrote:
So I looked at this some more and now I don't understand why the trywait() and
cancel() changes were done. Some background:
I wanted the turnstile chain lock to protect only the association between
the turnstile and lock. This way it further reduces the contention domain
for the hard lock/unlock cases. We sometimes see a lot of contention on
the turnstile chain that may be due to hash collisions. If this reduced
contention doesn't help I think it would be possible to revert this
change.
Well, the change jhb is suggesting won't reduce tc_lock contention for
sure, but it will prevent the turnstile lookup/locking if not
necessary.
Mainly, we need a spinlock held in order to protect mtx_lock bitfield
(as well as rw_lock) by setting waiters flags.
While in the past code this lock was only tc_lock, currently mtx_lock
is both protected by tc_lock and ts_lock, which it doesn't seem
strictly necessary.
if, for example, you lock tc_lock than you scan the chain and lock
ts_lock (basically what turnstile_trywait() does) and later you find
lock is released or that the state of lock changed and you cannot set
a waiters flag, you did the ts_locking and hash table scanning even if
it wasn't needed.
I'm not sure why you're calling this O(n). It's O(n) with the number of
hash collisions, but it's a hash lookup. We should consider using a real
hash algorithm here if the distribution is bad.
Well, the hash lookup (worst case) has O(n) complexity.
This linear complexity cames from the O(1) * O(n) which is the access
to the list and the scanning of this one. So this is reduced to the
same complexity of a linked list.
However, some time ago I saw empirically that starting from a 'struct
thread' allocated address the highest level of entropy in the word
came after a right shift of 10 bits (for ia32) and 12 bits for amd64.
Currently, turnstile and sleepqueues only uses 8 bits of right
shifting.
Thanks,
Attilio
--
Peace can only be achieved by understanding - A. Einstein
_______________________________________________
freebsd-arch@xxxxxxxxxxx mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-arch
To unsubscribe, send any mail to "freebsd-arch-unsubscribe@xxxxxxxxxxx"
- Follow-Ups:
- Re: rwlocks: poor performance with adaptive spinning
- From: Jeff Roberson
- Re: rwlocks: poor performance with adaptive spinning
- References:
- rwlocks: poor performance with adaptive spinning
- From: Attilio Rao
- Re: rwlocks: poor performance with adaptive spinning
- From: John Baldwin
- Re: rwlocks: poor performance with adaptive spinning
- From: Jeff Roberson
- Re: rwlocks: poor performance with adaptive spinning
- From: John Baldwin
- Re: rwlocks: poor performance with adaptive spinning
- From: Jeff Roberson
- rwlocks: poor performance with adaptive spinning
- Prev by Date: Re: Request for feedback on common data backstore in the kernel
- Next by Date: Re: rwlocks: poor performance with adaptive spinning
- Previous by thread: Re: rwlocks: poor performance with adaptive spinning
- Next by thread: Re: rwlocks: poor performance with adaptive spinning
- Index(es):
Relevant Pages
|
|