Re: [rfc] [patch 1/2 ] Process private hash tables for private futexes

Eric Dumazet
2009-03-22T08:17:45Z

Ravikiran G Thirumalai a écrit :
>>
>> Did you tried to change FUTEX_HASHBITS instead, since current value is really really
>> ridiculous ?
>
> We tried it in the past and I remember on a 16 core machine, we had to
> use 32k hash slots to avoid false sharing.
>
>
> Yes, dynamically changing the hash table is better (looking at the patch you
> have posted), but still there are no locality guarantees here. A process
> pinned to node X may still end up accessing remote memory locations while
> accessing the hash table. A process private table on the other hand should
> not have this problem. I think using a global hash for entirely process local
> objects is bad design wise here.
>
>

Bad design, or bad luck... considering all kernel already use such global tables
(dentries, inodes, tcp, ip route cache, ...).

Problem is to size this hash table, being private or not. You said hou had
to have a 32768 slots to avoid false sharing on a 16 core machine. This seems
strange to me, given we use jhash. What is the size of the cache line on your
platforms ???

Say we have 32768 slots for the global hash table, and 256 slots for a private one,
you probably can have a program running slowly with this private 256 slots table,
if this program uses all available cores.

If we use large private hash table, the setup cost is higher (need to initialize
all spinlocks and plist heads at each program startup), unless we use a dedicate
kmem_cache to keep a pool of preinitialized priv hash tables...