Re: [PATCH v4] parallel pg_restore: avoid disk seeks when jumping short distance forward
Dimitrios Apostolou <jimis@gmx.net>
From: Dimitrios Apostolou <jimis@gmx.net>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Chao Li <li.evan.chao@gmail.com>,
Nathan Bossart <nathandbossart@gmail.com>,
Thomas Munro <thomas.munro@gmail.com>, pgsql-hackers@lists.postgresql.org
Date: 2025-10-21T13:57:31Z
Lists: pgsql-hackers
Attachments
- v1-0001-WIP-increase-glibc-buffering-for-pg_restore-custo.patch (text/x-patch) patch v1-0001
On Tuesday 2025-10-21 00:23, Tom Lane wrote: > HEAD repeats > > read(4k) > lseek(~128k forward) > > which is to be expected if we have to read data block headers > that are ~128K apart; while patched repeats > > read(4k) > read(~128k) > > which is a bit odd in itself, why isn't it merging the reads better? The read(4k) happens because of the getc() calls that read the next block's length. As noticed in a message above [1], glibc seems to do 4KB buffering by default, for some reason. setvbuf() can mitigate this. [1] https://www.postgresql.org/message-id/1po8os49-r63o-2923-p37n-12698o1qn7p0%40tzk.arg I'm attaching a patch that sets glibc buffering to 1MB just as a proof of concept. It's obviously WIP, it allocates and never frees. :-) Feel free to pick it up and change it as you see fit. With this patch, read() calls are unified in strace. lseeks() remain, even if they are not actually reading anything. It seems to me that glibc could implement an optimisation for fseeko(): store the current position in the file, and do not issue the lseek() system call if the position does not change. >> I was using an HDD, > > Ah. Your original message mentioned NVMe so I was assuming you > were also looking at solid-state drives. I can imagine that > seeking is more painful on HDDs ... Sorry for the confusion, in all this time I've run tests on too many different hardware combinations. Not the best way to draw conclusions, but it's what I had available at each time. Dimitris
Commits
-
Avoid short seeks in pg_restore.
- fba60a1b107d 19 (unreleased) landed
-
Don't rely on zlib's gzgetc() macro.
- 277dec651472 19 (unreleased) cited
-
Add more TAP test coverage for pg_dump.
- 20ec9958921a 19 (unreleased) landed
-
Split 002_pg_dump.pl into two test files.
- 9dcf7f1172cd 19 (unreleased) landed
-
Align the data block sizes of pg_dump's various compression modes.
- 66ec01dc4124 19 (unreleased) landed
-
Fix serious performance problems in LZ4Stream_read_internal.
- 1f8062dd9668 19 (unreleased) landed
-
Fix poor buffering logic in pg_dump's lz4 and zstd compression code.
- fe8192a95e6c 19 (unreleased) landed
-
Fix issue with reading zero bytes in Gzip_read.
- bf18e9bd70de 17.7 landed
- a239c4a0c226 19 (unreleased) landed
- 6a4009747c36 18.1 landed
- 1518b7d76aad 16.11 landed
-
Restore test coverage of LZ4Stream_gets().
- eac2b1697d48 17.7 landed
- 661b320ed4e0 18.1 landed
- 26d1cd375f15 19 (unreleased) landed