Re: refactoring relation extension and BufferAlloc(), faster COPY
Andres Freund <andres@anarazel.de>
Hi, On 2022-10-28 19:54:20 -0700, Andres Freund wrote: > I've done a fair bit of benchmarking of this patchset. For COPY it comes out > ahead everywhere. It's possible that there's a very small regression for > extremly IO miss heavy workloads, more below. > > > server "base" configuration: > > max_wal_size=150GB > shared_buffers=24GB > huge_pages=on > autovacuum=0 > backend_flush_after=2MB > max_connections=5000 > wal_buffers=128MB > wal_segment_size=1GB > > benchmark: pgbench running COPY into a single table. pgbench -t is set > according to the client count, so that the same amount of data is inserted. > This is done oth using small files ([1], ringbuffer not effective, no dirty > data to write out within the benchmark window) and a bit larger files ([2], > lots of data to write out due to ringbuffer). > > To make it a fair comparison HEAD includes the lwlock-waitqueue fix as well. > > s_b=24GB > > test: unlogged_small_files, format: text, files: 1024, 9015MB total > seconds tbl-MBs seconds tbl-MBs seconds tbl-MBs > clients HEAD HEAD patch patch no_fsm no_fsm > 1 58.63 207 50.22 242 54.35 224 > 2 32.67 372 25.82 472 27.30 446 > 4 22.53 540 13.30 916 14.33 851 > 8 15.14 804 7.43 1640 7.48 1632 > 16 14.69 829 4.79 2544 4.50 2718 > 32 15.28 797 4.41 2763 3.32 3710 > 64 15.34 794 5.22 2334 3.06 4061 > 128 15.49 786 4.97 2452 3.13 3926 > 256 15.85 768 5.02 2427 3.26 3769 > 512 16.02 760 5.29 2303 3.54 3471 I just spent a few hours trying to reproduce these benchmark results. For the longest time I could not get the numbers for *HEAD* to even get close to the above, while the numbers for the patch were very close. I was worried it was a performance regression in HEAD etc. But no, same git commit as back then produces the same issue. As it turns out, I somehow screwed up my benchmark tooling, and I did not set set the CPU "scaling_governor" and "energy_performance_preference" to "performance". In a crazy turn of events, that approximately makes no difference with the patch applied, and a 2x difference for HEAD. I suspect this is some pathological issue when encountering heavy lock contention (likely leading to the CPU reducing speed into a deeper state, which then takes longer to get out of when the lock is released). As the lock contention is drastically reduced with the patch, that affect is not visible anymore. After fixing the performance scaling issue, the results are quite close to the above numbers again... Aargh, I want my afternoon back. Greetings, Andres Freund
Commits
-
lwlock: Fix quadratic behavior with very long wait lists
- 81038228582a 12.18 landed
- dc9d424cf0cd 13.14 landed
- 5f6ec27a6477 14.11 landed
- f374fb4aab3e 15.6 landed
- a4adc31f6902 16.0 landed
-
Support RBM_ZERO_AND_CLEANUP_LOCK in ExtendBufferedRelTo(), add tests
- 43a33ef54e50 16.0 landed
-
Use ExtendBufferedRelTo() in XLogReadBufferExtended()
- 26158b852d3a 16.0 landed
-
hio: Use ExtendBufferedRelBy() to extend tables more efficiently
- 00d1e02be249 16.0 landed
-
heapam: Pass number of required pages to RelationGetBufferForTuple()
- 5279e9db8e8d 16.0 landed
-
Convert many uses of ReadBuffer[Extended](P_NEW) to ExtendBufferedRel()
- acab1b0914e4 16.0 landed
-
Use ExtendBufferedRelTo() in {vm,fsm}_extend()
- fcdda1e4b502 16.0 landed
-
bufmgr: Introduce infrastructure for faster relation extension
- 31966b151e6a 16.0 landed
-
bufmgr: Support multiple in-progress IOs by using resowner
- 12f3867f5534 16.0 landed
-
bufmgr: Acquire and clean victim buffer separately
- dad50f677c42 16.0 landed
-
bufmgr: Add Pin/UnpinLocalBuffer()
- 794f25944790 16.0 landed
-
bufmgr: Add some more error checking [infrastructure] around pinning
- 819b69a81d30 16.0 landed
-
Add smgrzeroextend(), FileZero(), FileFallocate()
- 4d330a61bb19 16.0 landed
-
Don't initialize page in {vm,fsm}_extend(), not needed
- 3d6a98457d8e 16.0 landed
-
bufmgr: Remove buffer-write-dirty tracepoints
- 8a2b1b147728 16.0 landed
-
hio: Release extension lock before initializing page / pinning VM
- 14f98e0af996 16.0 landed
-
bufmgr: Fix undefined behaviour with, unrealistically, large temp_buffers
- 558cf8038768 16.0 landed
-
Fix memory leak and inefficiency in CREATE DATABASE ... STRATEGY WAL_LOG
- 5df319f3d55d 16.0 cited
-
pgstat: Track more detailed relation IO statistics
- f30d62c2fc60 16.0 cited
-
Use unnamed POSIX semaphores on Cygwin.
- f2857af485a0 16.0 cited
-
Include RelFileLocator fields individually in BufferTag.
- 82ac34db2036 16.0 cited