mirror of
https://github.com/postgres/postgres.git
synced 2025-08-30 06:01:21 +03:00
Create and use wait events for read, write, and fsync operations.
Previous commits, notably53be0b1add
and6f3bd98ebf
, made it possible to see from pg_stat_activity when a backend was stuck waiting for another backend, but it's also fairly common for a backend to be stuck waiting for an I/O. Add wait events for those operations, too. Rushabh Lathia, with further hacking by me. Reviewed and tested by Michael Paquier, Amit Kapila, Rajkumar Raghuwanshi, and Rahila Syed. Discussion: http://postgr.es/m/CAGPqQf0LsYHXREPAZqYGVkDqHSyjf=KsD=k0GTVPAuzyThh-VQ@mail.gmail.com
This commit is contained in:
@@ -280,6 +280,7 @@ static const char *pgstat_get_wait_activity(WaitEventActivity w);
|
||||
static const char *pgstat_get_wait_client(WaitEventClient w);
|
||||
static const char *pgstat_get_wait_ipc(WaitEventIPC w);
|
||||
static const char *pgstat_get_wait_timeout(WaitEventTimeout w);
|
||||
static const char *pgstat_get_wait_io(WaitEventIO w);
|
||||
|
||||
static void pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype);
|
||||
static void pgstat_send(void *msg, int len);
|
||||
@@ -3176,6 +3177,9 @@ pgstat_get_wait_event_type(uint32 wait_event_info)
|
||||
case PG_WAIT_TIMEOUT:
|
||||
event_type = "Timeout";
|
||||
break;
|
||||
case PG_WAIT_IO:
|
||||
event_type = "IO";
|
||||
break;
|
||||
default:
|
||||
event_type = "???";
|
||||
break;
|
||||
@@ -3246,6 +3250,13 @@ pgstat_get_wait_event(uint32 wait_event_info)
|
||||
event_name = pgstat_get_wait_timeout(w);
|
||||
break;
|
||||
}
|
||||
case PG_WAIT_IO:
|
||||
{
|
||||
WaitEventIO w = (WaitEventIO) wait_event_info;
|
||||
|
||||
event_name = pgstat_get_wait_io(w);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
event_name = "unknown wait event";
|
||||
break;
|
||||
@@ -3438,6 +3449,228 @@ pgstat_get_wait_timeout(WaitEventTimeout w)
|
||||
return event_name;
|
||||
}
|
||||
|
||||
/* ----------
|
||||
* pgstat_get_wait_io() -
|
||||
*
|
||||
* Convert WaitEventIO to string.
|
||||
* ----------
|
||||
*/
|
||||
static const char *
|
||||
pgstat_get_wait_io(WaitEventIO w)
|
||||
{
|
||||
const char *event_name = "unknown wait event";
|
||||
|
||||
switch (w)
|
||||
{
|
||||
case WAIT_EVENT_BUFFILE_READ:
|
||||
event_name = "BufFileRead";
|
||||
break;
|
||||
case WAIT_EVENT_BUFFILE_WRITE:
|
||||
event_name = "BufFileWrite";
|
||||
break;
|
||||
case WAIT_EVENT_CONTROL_FILE_READ:
|
||||
event_name = "ControlFileRead";
|
||||
break;
|
||||
case WAIT_EVENT_CONTROL_FILE_SYNC:
|
||||
event_name = "ControlFileSync";
|
||||
break;
|
||||
case WAIT_EVENT_CONTROL_FILE_SYNC_UPDATE:
|
||||
event_name = "ControlFileSyncUpdate";
|
||||
break;
|
||||
case WAIT_EVENT_CONTROL_FILE_WRITE:
|
||||
event_name = "ControlFileWrite";
|
||||
break;
|
||||
case WAIT_EVENT_CONTROL_FILE_WRITE_UPDATE:
|
||||
event_name = "ControlFileWriteUpdate";
|
||||
break;
|
||||
case WAIT_EVENT_COPY_FILE_READ:
|
||||
event_name = "CopyFileRead";
|
||||
break;
|
||||
case WAIT_EVENT_COPY_FILE_WRITE:
|
||||
event_name = "CopyFileWrite";
|
||||
break;
|
||||
case WAIT_EVENT_DATA_FILE_EXTEND:
|
||||
event_name = "DataFileExtend";
|
||||
break;
|
||||
case WAIT_EVENT_DATA_FILE_FLUSH:
|
||||
event_name = "DataFileFlush";
|
||||
break;
|
||||
case WAIT_EVENT_DATA_FILE_IMMEDIATE_SYNC:
|
||||
event_name = "DataFileImmediateSync";
|
||||
break;
|
||||
case WAIT_EVENT_DATA_FILE_PREFETCH:
|
||||
event_name = "DataFilePrefetch";
|
||||
break;
|
||||
case WAIT_EVENT_DATA_FILE_READ:
|
||||
event_name = "DataFileRead";
|
||||
break;
|
||||
case WAIT_EVENT_DATA_FILE_SYNC:
|
||||
event_name = "DataFileSync";
|
||||
break;
|
||||
case WAIT_EVENT_DATA_FILE_TRUNCATE:
|
||||
event_name = "DataFileTruncate";
|
||||
break;
|
||||
case WAIT_EVENT_DATA_FILE_WRITE:
|
||||
event_name = "DataFileWrite";
|
||||
break;
|
||||
case WAIT_EVENT_DSM_FILL_ZERO_WRITE:
|
||||
event_name = "DSMFillZeroWrite";
|
||||
break;
|
||||
case WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ:
|
||||
event_name = "LockFileAddToDataDirRead";
|
||||
break;
|
||||
case WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC:
|
||||
event_name = "LockFileAddToDataDirSync";
|
||||
break;
|
||||
case WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE:
|
||||
event_name = "LockFileAddToDataDirWrite";
|
||||
break;
|
||||
case WAIT_EVENT_LOCK_FILE_CREATE_READ:
|
||||
event_name = "LockFileCreateRead";
|
||||
break;
|
||||
case WAIT_EVENT_LOCK_FILE_CREATE_SYNC:
|
||||
event_name = "LockFileCreateSync";
|
||||
break;
|
||||
case WAIT_EVENT_LOCK_FILE_CREATE_WRITE:
|
||||
event_name = "LockFileCreateWRITE";
|
||||
break;
|
||||
case WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ:
|
||||
event_name = "LockFileReCheckDataDirRead";
|
||||
break;
|
||||
case WAIT_EVENT_LOGICAL_REWRITE_CHECKPOINT_SYNC:
|
||||
event_name = "LogicalRewriteCheckpointSync";
|
||||
break;
|
||||
case WAIT_EVENT_LOGICAL_REWRITE_MAPPING_SYNC:
|
||||
event_name = "LogicalRewriteMappingSync";
|
||||
break;
|
||||
case WAIT_EVENT_LOGICAL_REWRITE_MAPPING_WRITE:
|
||||
event_name = "LogicalRewriteMappingWrite";
|
||||
break;
|
||||
case WAIT_EVENT_LOGICAL_REWRITE_SYNC:
|
||||
event_name = "LogicalRewriteSync";
|
||||
break;
|
||||
case WAIT_EVENT_LOGICAL_REWRITE_TRUNCATE:
|
||||
event_name = "LogicalRewriteTruncate";
|
||||
break;
|
||||
case WAIT_EVENT_LOGICAL_REWRITE_WRITE:
|
||||
event_name = "LogicalRewriteWrite";
|
||||
break;
|
||||
case WAIT_EVENT_RELATION_MAP_READ:
|
||||
event_name = "RelationMapRead";
|
||||
break;
|
||||
case WAIT_EVENT_RELATION_MAP_SYNC:
|
||||
event_name = "RelationMapSync";
|
||||
break;
|
||||
case WAIT_EVENT_RELATION_MAP_WRITE:
|
||||
event_name = "RelationMapWrite";
|
||||
break;
|
||||
case WAIT_EVENT_REORDER_BUFFER_READ:
|
||||
event_name = "ReorderBufferRead";
|
||||
break;
|
||||
case WAIT_EVENT_REORDER_BUFFER_WRITE:
|
||||
event_name = "ReorderBufferWrite";
|
||||
break;
|
||||
case WAIT_EVENT_REORDER_LOGICAL_MAPPING_READ:
|
||||
event_name = "ReorderLogicalMappingRead";
|
||||
break;
|
||||
case WAIT_EVENT_REPLICATION_SLOT_READ:
|
||||
event_name = "ReplicationSlotRead";
|
||||
break;
|
||||
case WAIT_EVENT_REPLICATION_SLOT_RESTORE_SYNC:
|
||||
event_name = "ReplicationSlotRestoreSync";
|
||||
break;
|
||||
case WAIT_EVENT_REPLICATION_SLOT_SYNC:
|
||||
event_name = "ReplicationSlotSync";
|
||||
break;
|
||||
case WAIT_EVENT_REPLICATION_SLOT_WRITE:
|
||||
event_name = "ReplicationSlotWrite";
|
||||
break;
|
||||
case WAIT_EVENT_SLRU_FLUSH_SYNC:
|
||||
event_name = "SLRUFlushSync";
|
||||
break;
|
||||
case WAIT_EVENT_SLRU_READ:
|
||||
event_name = "SLRURead";
|
||||
break;
|
||||
case WAIT_EVENT_SLRU_SYNC:
|
||||
event_name = "SLRUSync";
|
||||
break;
|
||||
case WAIT_EVENT_SLRU_WRITE:
|
||||
event_name = "SLRUWrite";
|
||||
break;
|
||||
case WAIT_EVENT_SNAPBUILD_READ:
|
||||
event_name = "SnapbuildRead";
|
||||
break;
|
||||
case WAIT_EVENT_SNAPBUILD_SYNC:
|
||||
event_name = "SnapbuildSync";
|
||||
break;
|
||||
case WAIT_EVENT_SNAPBUILD_WRITE:
|
||||
event_name = "SnapbuildWrite";
|
||||
break;
|
||||
case WAIT_EVENT_TIMELINE_HISTORY_FILE_SYNC:
|
||||
event_name = "TimelineHistoryFileSync";
|
||||
break;
|
||||
case WAIT_EVENT_TIMELINE_HISTORY_FILE_WRITE:
|
||||
event_name = "TimelineHistoryFileWrite";
|
||||
break;
|
||||
case WAIT_EVENT_TIMELINE_HISTORY_READ:
|
||||
event_name = "TimelineHistoryRead";
|
||||
break;
|
||||
case WAIT_EVENT_TIMELINE_HISTORY_SYNC:
|
||||
event_name = "TimelineHistorySync";
|
||||
break;
|
||||
case WAIT_EVENT_TIMELINE_HISTORY_WRITE:
|
||||
event_name = "TimelineHistoryWrite";
|
||||
break;
|
||||
case WAIT_EVENT_TWOPHASE_FILE_READ:
|
||||
event_name = "TwophaseFileRead";
|
||||
break;
|
||||
case WAIT_EVENT_TWOPHASE_FILE_SYNC:
|
||||
event_name = "TwophaseFileSync";
|
||||
break;
|
||||
case WAIT_EVENT_TWOPHASE_FILE_WRITE:
|
||||
event_name = "TwophaseFileWrite";
|
||||
break;
|
||||
case WAIT_EVENT_WALSENDER_TIMELINE_HISTORY_READ:
|
||||
event_name = "WALSenderTimelineHistoryRead";
|
||||
break;
|
||||
case WAIT_EVENT_WAL_BOOTSTRAP_SYNC:
|
||||
event_name = "WALBootstrapSync";
|
||||
break;
|
||||
case WAIT_EVENT_WAL_BOOTSTRAP_WRITE:
|
||||
event_name = "WALBootstrapWrite";
|
||||
break;
|
||||
case WAIT_EVENT_WAL_COPY_READ:
|
||||
event_name = "WALCopyRead";
|
||||
break;
|
||||
case WAIT_EVENT_WAL_COPY_SYNC:
|
||||
event_name = "WALCopySync";
|
||||
break;
|
||||
case WAIT_EVENT_WAL_COPY_WRITE:
|
||||
event_name = "WALCopyWrite";
|
||||
break;
|
||||
case WAIT_EVENT_WAL_INIT_SYNC:
|
||||
event_name = "WALInitSync";
|
||||
break;
|
||||
case WAIT_EVENT_WAL_INIT_WRITE:
|
||||
event_name = "WALInitWrite";
|
||||
break;
|
||||
case WAIT_EVENT_WAL_READ:
|
||||
event_name = "WALRead";
|
||||
break;
|
||||
case WAIT_EVENT_WAL_SYNC_METHOD_ASSIGN:
|
||||
event_name = "WALSyncMethodAssign";
|
||||
break;
|
||||
case WAIT_EVENT_WAL_WRITE:
|
||||
event_name = "WALWrite";
|
||||
break;
|
||||
|
||||
/* no default case, so that compiler will warn */
|
||||
}
|
||||
|
||||
return event_name;
|
||||
}
|
||||
|
||||
|
||||
/* ----------
|
||||
* pgstat_get_backend_current_activity() -
|
||||
*
|
||||
|
Reference in New Issue
Block a user