Re: Question on pg_stat_io showing zero reads/writes for I/O workers

From: Xuneng Zhou <xunengzhou(at)gmail(dot)com>
To: pgsql-hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: Re: Question on pg_stat_io showing zero reads/writes for I/O workers
Date: 2025-10-31 09:43:46
Message-ID: CABPTF7WVHy+M09Nc9MvkMkDZTacUVJDEVpjEz8EpwXowgFz+gQ@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-admin pgsql-hackers

Hi,

On Fri, Oct 31, 2025 at 5:30 PM Xuneng Zhou <xunengzhou(at)gmail(dot)com> wrote:
>
> Hi,
>
> On Fri, Oct 31, 2025 at 4:17 PM Shardul Borhade <shardul(at)dbtune(dot)com> wrote:
> >
> > Hi team,
> >
> > I’m running into an issue with pg_stat_io. When I run the following query:
> >
> > SELECT backend_type, reads, writes, read_time
> > FROM pg_stat_io
> > WHERE backend_type LIKE '%io%';
> >
> > I consistently get:
> >
> > backend_type | reads | writes | read_time
> > --------------+-------+--------+-----------
> > io worker | 0 | 0 | 0
> > io worker | 0 | 0 | 0
> > io worker | 0 | 0 | 0
> > io worker | 0 | 0 | 0
> > io worker | 0 | 0 | 0
> > io worker | 0 | 0 | 0
> > io worker | | 0 |
> > io worker | 0 | 0 | 0
> > (8 rows)
> >
> > I tried running a heavy sequential scan on a 55 GB table as well as a bitmap heap scan, but the reads and writes columns still show zero.
> >
> > However, I can clearly observe performance differences when I tune the io_workers configuration, so I believe they are active.
> >
> > Am I missing something here? Could someone please help me understand why the stats aren’t being reflected in pg_stat_io? Do I need to enable any other server parameter to log this information?
>
> When your client backend issues a query:
>
> 1. Your backend calls `AsyncReadBuffers()` and counts the IO stats
> 2. The IO worker performs the actual I/O but doesn't increment its own counters
> 3. Stats accumulate under "client backend", not "io worker"
>
> Check your *client backend* stats instead:
>
> ```sql
> You should see reads/writes here:
>
> SELECT backend_type, context, object, reads, writes
> FROM pg_stat_io
> WHERE backend_type = 'client backend'
> AND reads > 0
> ORDER BY reads DESC;
>
> -- Verify IO workers exist:
>
> SELECT pid, backend_type, wait_event
> FROM pg_stat_activity
> WHERE backend_type = 'io worker';
>
>
> Quick Test
>
> -- Reset stats
>
> SELECT pg_stat_reset_shared('io');
>
> -- Run your heavy scan
>
> SELECT COUNT(*) FROM your_large_table;
>
> -- Check client backend stats (should increase)
>
> SELECT SUM(reads) as total_reads
> FROM pg_stat_io
> WHERE backend_type = 'client backend';
>
> -- Check IO worker stats (will remain zero)
>
> SELECT SUM(reads) as total_reads
> FROM pg_stat_io
> WHERE backend_type = 'io worker';
>
> See source code:
>
> - `src/backend/storage/buffer/bufmgr.c` (AsyncReadBuffers, line 1938)
> - stats counted at submission
> - `src/backend/utils/activity/pgstat_io.c` (pgstat_count_io_op, line
> 74) - uses submitter's MyBackendType
> - `src/backend/storage/aio/aio_io.c` (pgaio_io_perform_synchronously)
> - IO worker doesn't call stat functions
>

However, this behavior seems not great here. If the above analysis is
sound, should we add something like this to not track i/o worker
// In pgstat_tracks_io_bktype()
case B_IO_WORKER:
return false; // Don't show zero-value rows
or track actual IO worker stats?

Best,
Xuneng

In response to

Browse pgsql-admin by date

  From Date Subject
Next Message Shardul Borhade 2025-10-31 09:50:02 Re: Question on pg_stat_io showing zero reads/writes for I/O workers
Previous Message Xuneng Zhou 2025-10-31 09:40:55 Re: Question on pg_stat_io showing zero reads/writes for I/O workers

Browse pgsql-hackers by date

  From Date Subject
Next Message Hayato Kuroda (Fujitsu) 2025-10-31 09:48:10 RE: Newly created replication slot may be invalidated by checkpoint
Previous Message Xuneng Zhou 2025-10-31 09:40:55 Re: Question on pg_stat_io showing zero reads/writes for I/O workers