mirror of
https://github.com/postgres/postgres.git
synced 2025-06-16 06:01:02 +03:00
Track IO times in pg_stat_io
a9c70b46db
and 8aaa04b32S added counting of IO operations to a new view,
pg_stat_io. Now, add IO timing for reads, writes, extends, and fsyncs to
pg_stat_io as well.
This combines the tracking for pgBufferUsage with the tracking for pg_stat_io
into a new function pgstat_count_io_op_time(). This should make it a bit
easier to avoid the somewhat costly instr_time conversion done for
pgBufferUsage.
Author: Melanie Plageman <melanieplageman@gmail.com>
Reviewed-by: Andres Freund <andres@anarazel.de>
Reviewed-by: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Discussion: https://postgr.es/m/flat/CAAKRu_ay5iKmnbXZ3DsauViF3eMxu4m1oNnJXqV_HyqYeg55Ww%40mail.gmail.com
This commit is contained in:
@ -1112,23 +1112,12 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum,
|
||||
MemSet((char *) bufBlock, 0, BLCKSZ);
|
||||
else
|
||||
{
|
||||
instr_time io_start,
|
||||
io_time;
|
||||
|
||||
if (track_io_timing)
|
||||
INSTR_TIME_SET_CURRENT(io_start);
|
||||
instr_time io_start = pgstat_prepare_io_time();
|
||||
|
||||
smgrread(smgr, forkNum, blockNum, bufBlock);
|
||||
|
||||
if (track_io_timing)
|
||||
{
|
||||
INSTR_TIME_SET_CURRENT(io_time);
|
||||
INSTR_TIME_SUBTRACT(io_time, io_start);
|
||||
pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time));
|
||||
INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time);
|
||||
}
|
||||
|
||||
pgstat_count_io_op(io_object, io_context, IOOP_READ);
|
||||
pgstat_count_io_op_time(io_object, io_context,
|
||||
IOOP_READ, io_start, 1);
|
||||
|
||||
/* check for garbage data */
|
||||
if (!PageIsVerifiedExtended((Page) bufBlock, blockNum,
|
||||
@ -1837,6 +1826,7 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb,
|
||||
{
|
||||
BlockNumber first_block;
|
||||
IOContext io_context = IOContextForStrategy(strategy);
|
||||
instr_time io_start;
|
||||
|
||||
LimitAdditionalPins(&extend_by);
|
||||
|
||||
@ -2044,6 +2034,8 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb,
|
||||
}
|
||||
}
|
||||
|
||||
io_start = pgstat_prepare_io_time();
|
||||
|
||||
/*
|
||||
* Note: if smgzerorextend fails, we will end up with buffers that are
|
||||
* allocated but not marked BM_VALID. The next relation extension will
|
||||
@ -2066,6 +2058,9 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb,
|
||||
if (!(flags & EB_SKIP_EXTENSION_LOCK))
|
||||
UnlockRelationForExtension(eb.rel, ExclusiveLock);
|
||||
|
||||
pgstat_count_io_op_time(IOOBJECT_RELATION, io_context, IOOP_EXTEND,
|
||||
io_start, extend_by);
|
||||
|
||||
/* Set BM_VALID, terminate IO, and wake up any waiters */
|
||||
for (int i = 0; i < extend_by; i++)
|
||||
{
|
||||
@ -2089,8 +2084,6 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb,
|
||||
}
|
||||
|
||||
pgBufferUsage.shared_blks_written += extend_by;
|
||||
pgstat_count_io_op_n(IOOBJECT_RELATION, io_context, IOOP_EXTEND,
|
||||
extend_by);
|
||||
|
||||
*extended_by = extend_by;
|
||||
|
||||
@ -3344,8 +3337,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln, IOObject io_object,
|
||||
{
|
||||
XLogRecPtr recptr;
|
||||
ErrorContextCallback errcallback;
|
||||
instr_time io_start,
|
||||
io_time;
|
||||
instr_time io_start;
|
||||
Block bufBlock;
|
||||
char *bufToWrite;
|
||||
uint32 buf_state;
|
||||
@ -3420,10 +3412,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln, IOObject io_object,
|
||||
*/
|
||||
bufToWrite = PageSetChecksumCopy((Page) bufBlock, buf->tag.blockNum);
|
||||
|
||||
if (track_io_timing)
|
||||
INSTR_TIME_SET_CURRENT(io_start);
|
||||
else
|
||||
INSTR_TIME_SET_ZERO(io_start);
|
||||
io_start = pgstat_prepare_io_time();
|
||||
|
||||
/*
|
||||
* bufToWrite is either the shared buffer or a copy, as appropriate.
|
||||
@ -3452,15 +3441,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln, IOObject io_object,
|
||||
* When a strategy is not in use, the write can only be a "regular" write
|
||||
* of a dirty shared buffer (IOCONTEXT_NORMAL IOOP_WRITE).
|
||||
*/
|
||||
pgstat_count_io_op(IOOBJECT_RELATION, io_context, 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);
|
||||
}
|
||||
pgstat_count_io_op_time(IOOBJECT_RELATION, io_context,
|
||||
IOOP_WRITE, io_start, 1);
|
||||
|
||||
pgBufferUsage.shared_blks_written++;
|
||||
|
||||
@ -4062,14 +4044,13 @@ FlushRelationBuffers(Relation rel)
|
||||
{
|
||||
int i;
|
||||
BufferDesc *bufHdr;
|
||||
instr_time io_start,
|
||||
io_time;
|
||||
|
||||
if (RelationUsesLocalBuffers(rel))
|
||||
{
|
||||
for (i = 0; i < NLocBuffer; i++)
|
||||
{
|
||||
uint32 buf_state;
|
||||
instr_time io_start;
|
||||
|
||||
bufHdr = GetLocalBufferDescriptor(i);
|
||||
if (BufTagMatchesRelFileLocator(&bufHdr->tag, &rel->rd_locator) &&
|
||||
@ -4089,10 +4070,7 @@ 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);
|
||||
io_start = pgstat_prepare_io_time();
|
||||
|
||||
smgrwrite(RelationGetSmgr(rel),
|
||||
BufTagGetForkNum(&bufHdr->tag),
|
||||
@ -4100,19 +4078,13 @@ FlushRelationBuffers(Relation rel)
|
||||
localpage,
|
||||
false);
|
||||
|
||||
pgstat_count_io_op_time(IOOBJECT_TEMP_RELATION,
|
||||
IOCONTEXT_NORMAL, IOOP_WRITE,
|
||||
io_start, 1);
|
||||
|
||||
buf_state &= ~(BM_DIRTY | BM_JUST_DIRTIED);
|
||||
pg_atomic_unlocked_write_u32(&bufHdr->state, buf_state);
|
||||
|
||||
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 */
|
||||
|
Reference in New Issue
Block a user