Improve scalability of WAL insertions.
Heikki Linnakangas <heikki.linnakangas@iki.fi>
Improve scalability of WAL insertions. This patch replaces WALInsertLock with a number of WAL insertion slots, allowing multiple backends to insert WAL records to the WAL buffers concurrently. This is particularly useful for parallel loading large amounts of data on a system with many CPUs. This has one user-visible change: switching to a new WAL segment with pg_switch_xlog() now fills the remaining unused portion of the segment with zeros. This potentially adds some overhead, but it has been a very common practice by DBA's to clear the "tail" of the segment with an external pg_clearxlogtail utility anyway, to make the WAL files compress better. With this patch, it's no longer necessary to do that. This patch adds a new GUC, xloginsert_slots, to tune the number of WAL insertion slots. Performance testing suggests that the default, 8, works pretty well for all kinds of worklods, but I left the GUC in place to allow others with different hardware to test that easily. We might want to remove that before release. Reviewed by Andres Freund.
Files
| Path | Change | +/− |
|---|---|---|
| src/backend/access/transam/xlog.c | modified | +1626 −485 |
| src/backend/storage/lmgr/spin.c | modified | +2 −0 |
| src/backend/utils/misc/guc.c | modified | +11 −0 |
| src/include/access/xlogdefs.h | modified | +0 −10 |
| src/include/access/xlog.h | modified | +1 −0 |
| src/include/storage/lwlock.h | modified | +1 −1 |