Improve IO accounting for temp relation writes
authorAndres Freund <[email protected]>
Fri, 7 Apr 2023 20:24:26 +0000 (13:24 -0700)
committerAndres Freund <[email protected]>
Fri, 7 Apr 2023 20:24:26 +0000 (13:24 -0700)
Both pgstat_database and pgBufferUsage count IO timing for reads of temporary
relation blocks into local buffers. However, both failed to count write IO
timing for flushes of dirty local buffers. Fix.

Additionally, FlushRelationBuffers() seems to have omitted counting write
IO (both count and timing) stats for both pgstat_database and
pgBufferUsage. Fix.

Author: Melanie Plageman <[email protected]>
Reviewed-by: Andres Freund <[email protected]>
Discussion: https://postgr.es/m/20230321023451.7rzy4kjj2iktrg2r%40awork3.anarazel.de

src/backend/storage/buffer/bufmgr.c
src/backend/storage/buffer/localbuf.c

index 908a8934bd469014f83a413fca93f16450fc5795..ef69f21adf4a8a8039d55bb77cccf75c881a1e08 100644 (file)
@@ -4062,6 +4062,8 @@ FlushRelationBuffers(Relation rel)
 {
    int         i;
    BufferDesc *bufHdr;
+   instr_time  io_start,
+               io_time;
 
    if (RelationUsesLocalBuffers(rel))
    {
@@ -4087,6 +4089,11 @@ FlushRelationBuffers(Relation rel)
 
                PageSetChecksumInplace(localpage, bufHdr->tag.blockNum);
 
+               if (track_io_timing)
+                   INSTR_TIME_SET_CURRENT(io_start);
+               else
+                   INSTR_TIME_SET_ZERO(io_start);
+
                smgrwrite(RelationGetSmgr(rel),
                          BufTagGetForkNum(&bufHdr->tag),
                          bufHdr->tag.blockNum,
@@ -4098,6 +4105,16 @@ FlushRelationBuffers(Relation rel)
 
                pgstat_count_io_op(IOOBJECT_TEMP_RELATION, IOCONTEXT_NORMAL, IOOP_WRITE);
 
+               if (track_io_timing)
+               {
+                   INSTR_TIME_SET_CURRENT(io_time);
+                   INSTR_TIME_SUBTRACT(io_time, io_start);
+                   pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time));
+                   INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time);
+               }
+
+               pgBufferUsage.local_blks_written++;
+
                /* Pop the error context stack */
                error_context_stack = errcallback.previous;
            }
index 3846d3eaca4f97315a842f058174cbc0676d294b..3639296bc17ead0f82c62043bd48cb5d21767694 100644 (file)
@@ -176,6 +176,8 @@ GetLocalVictimBuffer(void)
    int         trycounter;
    uint32      buf_state;
    BufferDesc *bufHdr;
+   instr_time  io_start,
+               io_time;
 
    ResourceOwnerEnlargeBuffers(CurrentResourceOwner);
 
@@ -239,6 +241,11 @@ GetLocalVictimBuffer(void)
 
        PageSetChecksumInplace(localpage, bufHdr->tag.blockNum);
 
+       if (track_io_timing)
+           INSTR_TIME_SET_CURRENT(io_start);
+       else
+           INSTR_TIME_SET_ZERO(io_start);
+
        /* And write... */
        smgrwrite(oreln,
                  BufTagGetForkNum(&bufHdr->tag),
@@ -252,6 +259,15 @@ GetLocalVictimBuffer(void)
 
        /* Temporary table I/O does not use Buffer Access Strategies */
        pgstat_count_io_op(IOOBJECT_TEMP_RELATION, IOCONTEXT_NORMAL, IOOP_WRITE);
+
+       if (track_io_timing)
+       {
+           INSTR_TIME_SET_CURRENT(io_time);
+           INSTR_TIME_SUBTRACT(io_time, io_start);
+           pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time));
+           INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time);
+       }
+
        pgBufferUsage.local_blks_written++;
    }