Re: AIO v2.0
Andres Freund <andres@anarazel.de>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
aio: Fix assertion, clarify README
- 7b98c5536818 18.0 landed
- d3f97fd1dda3 19 (unreleased) landed
-
aio: Fix reference to outdated name
- f20a347e1a61 19 (unreleased) landed
- 95163cbe111c 18.0 landed
-
aio: Fix possible state confusions due to interrupt processing
- acad909321a4 18.0 landed
-
aio: Improve debug logging around waiting for IOs
- 039bfc457e43 18.0 landed
-
aio: Fix crash potential for pg_aios views due to late state update
- 0d9114b7040d 18.0 landed
-
Increase BAS_BULKREAD based on effective_io_concurrency
- 15f0cb26b530 18.0 landed
-
localbuf: Add Valgrind buffer access instrumentation
- 8ab4241b9f4f 18.0 landed
-
aio: Make AIO more compatible with valgrind
- 8e293e689bab 18.0 landed
-
aio: Avoid spurious coverity warning
- 57dec20fd469 18.0 landed
-
tests: Fix incompatibility of test_aio with *_FORCE_RELEASE
- a6285b150ad3 18.0 landed
-
tests: Cope with WARNINGs during failed CREATE DB on windows
- 43dca8a11624 18.0 landed
-
aio: Add errcontext for processing I/Os for another backend
- b3219c69fc1e 18.0 landed
-
aio: Add README.md explaining higher level design
- fdd146a8ef2b 18.0 landed
-
aio: Minor comment improvements
- e19dc74491e6 18.0 landed
-
aio: Add test_aio module
- 93bc3d75d8e1 18.0 landed
-
aio: Add pg_aios view
- 60f566b4f243 18.0 landed
-
docs: Add acronym and glossary entries for I/O and AIO
- 46250cdcb037 18.0 landed
-
Enable IO concurrency on all systems
- 2a5e709e721c 18.0 landed
-
read_stream: Introduce and use optional batchmode support
- ae3df4b34155 18.0 landed
-
docs: Reframe track_io_timing related docs as wait time
- b27f8637ea70 18.0 landed
-
bufmgr: Use AIO in StartReadBuffers()
- 12ce89fd0708 18.0 landed
-
bufmgr: Implement AIO read support
- 047cba7fa0f8 18.0 landed
-
aio: Add WARNING result status
- ef64fe26bad9 18.0 landed
-
Let caller of PageIsVerified() control ignore_checksum_failure
- d445990adc41 18.0 landed
-
pgstat: Allow checksum errors to be reported in critical sections
- b96d3c389755 18.0 landed
-
Add errhint_internal()
- 4244cf687697 18.0 landed
-
localbuf: Track pincount in BufferDesc as well
- d6d8054dc72d 18.0 landed
-
aio, bufmgr: Comment fixes/improvements
- 08ccd56ac765 18.0 landed
-
Fix mis-attribution of checksum failure stats to the wrong database
- dee80024688c 18.0 landed
-
aio: Implement support for reads in smgr/md/fd
- 50cb7505b301 18.0 landed
-
aio: Add io_method=io_uring
- c325a7633fcb 18.0 landed
-
aio: Add liburing dependency
- 8eadd5c73c44 18.0 landed
-
aio: Rename pgaio_io_prep_* to pgaio_io_start_*
- 9469d7fdd2bc 18.0 landed
-
aio: Pass result of local callbacks to ->report_return
- f321ec237a54 18.0 landed
-
aio: Be more paranoid about interrupts
- 96da9050a57a 18.0 landed
-
Redefine max_files_per_process to control additionally opened files
- adb5f85fa5a0 18.0 landed
-
aio: Change prefix of PgAioResultStatus values to PGAIO_RS_
- ca3067cc573d 18.0 landed
-
bufmgr: Improve stats when a buffer is read in concurrently
- 202b12774d09 18.0 landed
-
aio: Add io_method=worker
- 247ce06b883d 18.0 landed
-
aio: Infrastructure for io_method=worker
- 55b454d0e140 18.0 landed
-
aio: Add core asynchronous I/O infrastructure
- da7226993fd4 18.0 landed
-
aio: Basic subsystem initialization
- 02844012b304 18.0 landed
-
tests: Expand temp table tests to some pin related matters
- 1a22a8a0f131 18.0 landed
-
localbuf: Introduce FlushLocalBuffer()
- 4b4d33b9ea9f 18.0 landed
-
localbuf: Introduce TerminateLocalBufferIO()
- dd6f2618f681 18.0 landed
-
localbuf: Fix dangerous coding pattern in GetLocalVictimBuffer()
- fa6af9b25e4b 18.0 landed
-
localbuf: Introduce StartLocalBufferIO()
- 771ba90298e2 18.0 landed
-
localbuf: Introduce InvalidateLocalBuffer()
- 0762a151b0e0 18.0 landed
-
Allow lwlocks to be disowned
- f8d7f29b3e81 18.0 landed
-
Make jsonb casts to scalar types translate JSON null to SQL NULL.
- a5579a90af05 18.0 cited
-
bufmgr/smgr: Don't cross segment boundaries in StartReadBuffers()
- 755a4c10d19d 18.0 landed
-
Use aux process resource owner in walsender
- 57f370247127 18.0 landed
-
bufmgr: Return early in ScheduleBufferTagForWriteback() if fsync=off
- 488f826c729b 18.0 landed
Hi, On 2025-01-08 15:04:39 +0100, Jakub Wartak wrote: > On Mon, Jan 6, 2025 at 5:28 PM Andres Freund <andres@anarazel.de> wrote: > > I didn't think that pg_stat_* was quite the right namespace, given that it > > shows not stats, but the currently ongoing IOs. I am going with pg_aios for > > now, but I don't particularly like that. > > If you are looking for other proposals: > * pg_aios_progress ? (to follow pattern of pg_stat_copy|vaccuum_progress?) > * pg_debug_aios ? > * pg_debug_io ? I think pg_aios is better than those, if not by much. Seems others are ok with that name too. And we easily can evolve it later. > > I think we'll want a pg_stat_aio as well, tracking things like: > > > > - how often the queue to IO workes was full > > - how many times we submitted IO to the kernel (<= #ios with io_uring) > > - how many times we asked the kernel for events (<= #ios with io_uring) > > - how many times we had to wait for in-flight IOs before issuing more IOs > > If I could dream of one thing that would be 99.9% percentile of IO > response times in milliseconds for different classes of I/O traffic > (read/write/flush). But it sounds like it would be very similiar to > pg_stat_io and potentially would have to be > per-tablespace/IO-traffic(subject)-type too. Yea, that's a significant project on its own. It's not that cheap to compute reasonably accurate percentiles and we have no infrastructure for doing so right now. > AFAIU pg_stat_io has improper structure to have that there. Hm, not obvious to me why? It might make the view a bit wide to add it as an additional column, but otherwise I don't see a problem? > BTW: before trying to even start to compile that AIO v2.2* and > responding to the previous review, what are You looking interested to > hear the most about it so that it adds some value? Due to the rather limited "users" of AIO in the patchset, I think most benchmarks aren't expected to show any meaningful gains. However, they shouldn't show any significant regressions either (when not using direct IO). I think trying to find regressions would be a rather valuable thing. I'm tempted to collect a few of the reasonbly-ready read stream conversions into the patchset, to make the potential gains more visible. But I am not sure it's a good investment of time right now. One small regression I do know about, namely scans of large relations that are bigger than shared buffers but do fit in the kernel page cache. The increase of BAS_BULKREAD does cause a small slowdown - but without it we never can do sufficient asynchronous IO. I think the slowdown is small enough to just accept that, but it's worth qualifying that on a few machines. > Any workload specific measurements? just general feedback, functionality > gaps? To see the benefits it'd be interesting to compare: 1) sequential scan performance with data not in shared buffers, using buffered IO 2) same, but using direct IO when testing the patch 3) checkpoint performance In my experiments 1) gains a decent amount of performance in many cases, but nothing overwhelming - sequential scans are easy for the kernel to read ahead. I do see very significant gains for 2) - On a system with 10 striped NVMe SSDs that each can do ~3.5 GB/s I measured very parallel sequential scans (I had to use ALTER TABLE to get sufficient numbers of workers): master: ~18 GB/s patch, buffered: ~20 GB/s patch, direct, worker: ~28 GB/s patch, direct, uring: ~35 GB/s This was with io_workers=32, io_max_concurrency=128, effective_io_concurrency=1000 (doesn't need to be that high, but it's what I still have the numbers for). This was without data checksums enabled as otherwise the checksum code becomes a *huge* bottleneck. I also see significant gains with 3). Bigger when using direct IO. One complicating factor measuring 3) is that the first write to a block will often be slower than subsequent writes because the filesystem will need to update some journaled metadata, presenting a bottleneck. Checkpoint performance is also severely limited by data checksum computation if enabled - independent of this patchset. One annoying thing when testing DIO is that right now VACUUM will be rather slow if the data isn't already in s_b, as it isn't yet read-stream-ified. > Integrity/data testing with stuff like dm-dust, dm-flakey, dm-delay > to try the error handling routines? Hm. I don't think that's going to work very well even on master. If the filesystem fails there's not much that PG can do... > Some kind of AIO <-> standby/recovery interactions? I wouldn't expect anything there. I think Thomas somewhere has a patch that read-stream-ifies recovery prefetching, once that's done it would be more interesting. > * - btw, Date: 2025-01-01 04:03:33 - I saw what you did there! so > let's officially recognize the 2025 as the year of AIO in PG, as it > was 1st message :D Hah, that was actually the opposite of what I intended :). I'd hoped to post earlier, but jetlag had caught up with me... Greetings, Andres Freund