• Andres Freund's avatar
    Lockless StrategyGetBuffer clock sweep hot path. · d72731a7
    Andres Freund authored
    StrategyGetBuffer() has proven to be a bottleneck in a number of
    buffer acquisition heavy workloads. To some degree this has already
    been alleviated by 5d7962c6, but it still can be quite a heavy
    bottleneck.  The problem is that in unfortunate usage patterns a
    single StrategyGetBuffer() call will have to look at a large number of
    buffers - in turn making it likely that the process will be put to
    sleep while still holding the spinlock.
    
    Replace most of the usage of the buffer_strategy_lock spinlock for the
    clock sweep by a atomic nextVictimBuffer variable. That variable,
    modulo NBuffers, is the current hand of the clock sweep. The buffer
    clock-sweep then only needs to acquire the spinlock after a
    wraparound. And even then only in the process that did the wrapping
    around. That alleviates nearly all the contention on the relevant
    spinlock, although significant contention on the cacheline can still
    exist.
    
    Reviewed-By: Robert Haas and Amit Kapila
    
    Discussion: 20141010160020.GG6670@alap3.anarazel.de,
        20141027133218.GA2639@awork2.anarazel.de
    d72731a7
buf_internals.h 7.88 KB