• Andres Freund's avatar
    Allow Pin/UnpinBuffer to operate in a lockfree manner. · 48354581
    Andres Freund authored
    Pinning/Unpinning a buffer is a very frequent operation; especially in
    read-mostly cache resident workloads. Benchmarking shows that in various
    scenarios the spinlock protecting a buffer header's state becomes a
    significant bottleneck. The problem can be reproduced with pgbench -S on
    larger machines, but can be considerably worse for queries which touch
    the same buffers over and over at a high frequency (e.g. nested loops
    over a small inner table).
    
    To allow atomic operations to be used, cram BufferDesc's flags,
    usage_count, buf_hdr_lock, refcount into a single 32bit atomic variable;
    that allows to manipulate them together using 32bit compare-and-swap
    operations. This requires reducing MAX_BACKENDS to 2^18-1 (which could
    be lifted by using a 64bit field, but it's not a realistic configuration
    atm).
    
    As not all operations can easily implemented in a lockfree manner,
    implement the previous buf_hdr_lock via a flag bit in the atomic
    variable. That way we can continue to lock the header in places where
    it's needed, but can get away without acquiring it in the more frequent
    hot-paths.  There's some additional operations which can be done without
    the lock, but aren't in this patch; but the most important places are
    covered.
    
    As bufmgr.c now essentially re-implements spinlocks, abstract the delay
    logic from s_lock.c into something more generic. It now has already two
    users, and more are coming up; there's a follupw patch for lwlock.c at
    least.
    
    This patch is based on a proof-of-concept written by me, which Alexander
    Korotkov made into a fully working patch; the committed version is again
    revised by me.  Benchmarking and testing has, amongst others, been
    provided by Dilip Kumar, Alexander Korotkov, Robert Haas.
    
    On a large x86 system improvements for readonly pgbench, with a high
    client count, of a factor of 8 have been observed.
    
    Author: Alexander Korotkov and Andres Freund
    Discussion: 2400449.GjM57CE0Yg@dinodell
    48354581
s_lock.h 28 KB