]> granicus.if.org Git - postgresql/commit
Move buffer I/O and content LWLocks out of the main tranche.
authorRobert Haas <rhaas@postgresql.org>
Tue, 15 Dec 2015 18:32:54 +0000 (13:32 -0500)
committerRobert Haas <rhaas@postgresql.org>
Tue, 15 Dec 2015 18:32:54 +0000 (13:32 -0500)
commit6150a1b08a9fe7ead2b25240be46dddeae9d98e1
tree50a43b8b4c8c5307e40bfdd7de76c901e211451e
parent3fed417452b226d9bd85a3a54d7056b06eb14897
Move buffer I/O and content LWLocks out of the main tranche.

Move the content lock directly into the BufferDesc, so that locking and
pinning a buffer touches only one cache line rather than two.  Adjust
the definition of BufferDesc slightly so that this doesn't make the
BufferDesc any larger than one cache line (at least on platforms where
a spinlock is only 1 or 2 bytes).

We can't fit the I/O locks into the BufferDesc and stay within one
cache line, so move those to a completely separate tranche.  This
leaves a relatively limited number of LWLocks in the main tranche, so
increase the padding of those remaining locks to a full cache line,
rather than allowing adjacent locks to share a cache line, hopefully
reducing false sharing.

Performance testing shows that these changes make little difference
on laptop-class machines, but help significantly on larger servers,
especially those with more than 2 sockets.

Andres Freund, originally based on an earlier patch by Simon Riggs.
Review and cosmetic adjustments (including heavy rewriting of the
comments) by me.
src/backend/storage/buffer/buf_init.c
src/backend/storage/buffer/bufmgr.c
src/backend/storage/lmgr/lwlock.c
src/include/storage/buf_internals.h
src/include/storage/lwlock.h
src/tools/pgindent/typedefs.list