mirror of
https://github.com/postgres/postgres.git
synced 2025-11-06 07:49:08 +03:00
Expose track_iotiming data via the statistics collector.
Ants Aasma's original patch to add timing information for buffer I/O requests exposed this data at the relation level, which was judged too costly. I've here exposed it at the database level instead.
This commit is contained in:
@@ -604,6 +604,8 @@ CREATE VIEW pg_stat_database AS
|
||||
pg_stat_get_db_temp_files(D.oid) AS temp_files,
|
||||
pg_stat_get_db_temp_bytes(D.oid) AS temp_bytes,
|
||||
pg_stat_get_db_deadlocks(D.oid) AS deadlocks,
|
||||
pg_stat_get_db_block_time_read(D.oid) / 1000 AS block_read_time,
|
||||
pg_stat_get_db_block_time_write(D.oid) / 1000 AS block_write_time,
|
||||
pg_stat_get_db_stat_reset_time(D.oid) AS stats_reset
|
||||
FROM pg_database D;
|
||||
|
||||
|
||||
@@ -197,6 +197,8 @@ static PgStat_SubXactStatus *pgStatXactStack = NULL;
|
||||
|
||||
static int pgStatXactCommit = 0;
|
||||
static int pgStatXactRollback = 0;
|
||||
PgStat_Counter pgStatBlockTimeRead = 0;
|
||||
PgStat_Counter pgStatBlockTimeWrite = 0;
|
||||
|
||||
/* Record that's written to 2PC state file when pgstat state is persisted */
|
||||
typedef struct TwoPhasePgStatRecord
|
||||
@@ -782,13 +784,15 @@ pgstat_send_tabstat(PgStat_MsgTabstat *tsmsg)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Report accumulated xact commit/rollback whenever we send a normal
|
||||
* tabstat message
|
||||
* Report accumulated xact commit/rollback and I/O timings whenever we send
|
||||
* a normal tabstat message
|
||||
*/
|
||||
if (OidIsValid(tsmsg->m_databaseid))
|
||||
{
|
||||
tsmsg->m_xact_commit = pgStatXactCommit;
|
||||
tsmsg->m_xact_rollback = pgStatXactRollback;
|
||||
tsmsg->m_block_time_read = pgStatBlockTimeRead;
|
||||
tsmsg->m_block_time_write = pgStatBlockTimeWrite;
|
||||
pgStatXactCommit = 0;
|
||||
pgStatXactRollback = 0;
|
||||
}
|
||||
@@ -796,6 +800,8 @@ pgstat_send_tabstat(PgStat_MsgTabstat *tsmsg)
|
||||
{
|
||||
tsmsg->m_xact_commit = 0;
|
||||
tsmsg->m_xact_rollback = 0;
|
||||
tsmsg->m_block_time_read = 0;
|
||||
tsmsg->m_block_time_write = 0;
|
||||
}
|
||||
|
||||
n = tsmsg->m_nentries;
|
||||
@@ -3352,6 +3358,8 @@ pgstat_get_db_entry(Oid databaseid, bool create)
|
||||
result->n_temp_files = 0;
|
||||
result->n_temp_bytes = 0;
|
||||
result->n_deadlocks = 0;
|
||||
result->n_block_time_read = 0;
|
||||
result->n_block_time_write = 0;
|
||||
|
||||
result->stat_reset_timestamp = GetCurrentTimestamp();
|
||||
|
||||
@@ -4070,6 +4078,8 @@ pgstat_recv_tabstat(PgStat_MsgTabstat *msg, int len)
|
||||
*/
|
||||
dbentry->n_xact_commit += (PgStat_Counter) (msg->m_xact_commit);
|
||||
dbentry->n_xact_rollback += (PgStat_Counter) (msg->m_xact_rollback);
|
||||
dbentry->n_block_time_read += msg->m_block_time_read;
|
||||
dbentry->n_block_time_write += msg->m_block_time_write;
|
||||
|
||||
/*
|
||||
* Process all table entries in the message.
|
||||
@@ -4266,6 +4276,8 @@ pgstat_recv_resetcounter(PgStat_MsgResetcounter *msg, int len)
|
||||
dbentry->n_temp_bytes = 0;
|
||||
dbentry->n_temp_files = 0;
|
||||
dbentry->n_deadlocks = 0;
|
||||
dbentry->n_block_time_read = 0;
|
||||
dbentry->n_block_time_write = 0;
|
||||
|
||||
dbentry->stat_reset_timestamp = GetCurrentTimestamp();
|
||||
|
||||
|
||||
@@ -450,6 +450,7 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum,
|
||||
{
|
||||
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.time_read, io_time);
|
||||
}
|
||||
|
||||
@@ -1888,7 +1889,8 @@ FlushBuffer(volatile BufferDesc *buf, SMgrRelation reln)
|
||||
{
|
||||
XLogRecPtr recptr;
|
||||
ErrorContextCallback errcontext;
|
||||
instr_time io_start, io_end;
|
||||
instr_time io_start,
|
||||
io_time;
|
||||
|
||||
/*
|
||||
* Acquire the buffer's io_in_progress lock. If StartBufferIO returns
|
||||
@@ -1947,8 +1949,10 @@ FlushBuffer(volatile BufferDesc *buf, SMgrRelation reln)
|
||||
|
||||
if (track_iotiming)
|
||||
{
|
||||
INSTR_TIME_SET_CURRENT(io_end);
|
||||
INSTR_TIME_ACCUM_DIFF(pgBufferUsage.time_write, io_end, io_start);
|
||||
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.time_write, io_time);
|
||||
}
|
||||
|
||||
pgBufferUsage.shared_blks_written++;
|
||||
|
||||
@@ -82,6 +82,8 @@ extern Datum pg_stat_get_db_deadlocks(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_stat_get_db_stat_reset_time(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_stat_get_db_temp_files(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_stat_get_db_temp_bytes(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_stat_get_db_block_time_read(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_stat_get_db_block_time_write(PG_FUNCTION_ARGS);
|
||||
|
||||
extern Datum pg_stat_get_bgwriter_timed_checkpoints(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_stat_get_bgwriter_requested_checkpoints(PG_FUNCTION_ARGS);
|
||||
@@ -1357,6 +1359,36 @@ pg_stat_get_db_deadlocks(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_INT64(result);
|
||||
}
|
||||
|
||||
Datum
|
||||
pg_stat_get_db_block_time_read(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Oid dbid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
|
||||
if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
|
||||
result = 0;
|
||||
else
|
||||
result = (int64) (dbentry->n_block_time_read);
|
||||
|
||||
PG_RETURN_INT64(result);
|
||||
}
|
||||
|
||||
Datum
|
||||
pg_stat_get_db_block_time_write(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Oid dbid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
|
||||
if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
|
||||
result = 0;
|
||||
else
|
||||
result = (int64) (dbentry->n_block_time_write);
|
||||
|
||||
PG_RETURN_INT64(result);
|
||||
}
|
||||
|
||||
Datum
|
||||
pg_stat_get_bgwriter_timed_checkpoints(PG_FUNCTION_ARGS)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user