mirror of
https://github.com/postgres/postgres.git
synced 2025-07-11 10:01:57 +03:00
Fix performance regression from session statistics.
Session statistics, as introduced by 960869da08
, had several shortcomings:
- an additional GetCurrentTimestamp() call that also impaired the accuracy of
the data collected
This can be avoided by passing the current timestamp we already have in
pgstat_report_stat().
- an additional statistics UDP packet sent every 500ms
This is solved by adding the new statistics to PgStat_MsgTabstat.
This is conceptually ugly, because session statistics are not
table statistics. But the struct already contains data unrelated
to tables, so there is not much damage done.
Connection and disconnection are reported in separate messages, which
reduces the number of additional messages to two messages per session and a
slight increase in PgStat_MsgTabstat size (but the same number of table
stats fit).
- Session time computation could overflow on systems where long is 32 bit.
Reported-By: Andres Freund <andres@anarazel.de>
Author: Andres Freund <andres@anarazel.de>
Author: Laurenz Albe <laurenz.albe@cybertec.at>
Discussion: https://postgr.es/m/20210801205501.nyxzxoelqoo4x2qc%40alap3.anarazel.de
Backpatch: 14-, where the feature was introduced.
This commit is contained in:
@ -81,7 +81,8 @@ typedef enum StatMsgType
|
||||
PGSTAT_MTYPE_DEADLOCK,
|
||||
PGSTAT_MTYPE_CHECKSUMFAILURE,
|
||||
PGSTAT_MTYPE_REPLSLOT,
|
||||
PGSTAT_MTYPE_CONNECTION,
|
||||
PGSTAT_MTYPE_CONNECT,
|
||||
PGSTAT_MTYPE_DISCONNECT,
|
||||
} StatMsgType;
|
||||
|
||||
/* ----------
|
||||
@ -279,7 +280,7 @@ typedef struct PgStat_TableEntry
|
||||
* ----------
|
||||
*/
|
||||
#define PGSTAT_NUM_TABENTRIES \
|
||||
((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - 3 * sizeof(int) - 2 * sizeof(PgStat_Counter)) \
|
||||
((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - 3 * sizeof(int) - 5 * sizeof(PgStat_Counter)) \
|
||||
/ sizeof(PgStat_TableEntry))
|
||||
|
||||
typedef struct PgStat_MsgTabstat
|
||||
@ -291,6 +292,9 @@ typedef struct PgStat_MsgTabstat
|
||||
int m_xact_rollback;
|
||||
PgStat_Counter m_block_read_time; /* times in microseconds */
|
||||
PgStat_Counter m_block_write_time;
|
||||
PgStat_Counter m_session_time;
|
||||
PgStat_Counter m_active_time;
|
||||
PgStat_Counter m_idle_in_xact_time;
|
||||
PgStat_TableEntry m_entry[PGSTAT_NUM_TABENTRIES];
|
||||
} PgStat_MsgTabstat;
|
||||
|
||||
@ -653,20 +657,26 @@ typedef struct PgStat_MsgChecksumFailure
|
||||
} PgStat_MsgChecksumFailure;
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgConn Sent by the backend to update connection statistics.
|
||||
* PgStat_MsgConnect Sent by the backend upon connection
|
||||
* establishment
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgConn
|
||||
typedef struct PgStat_MsgConnect
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
Oid m_databaseid;
|
||||
PgStat_Counter m_count;
|
||||
PgStat_Counter m_session_time;
|
||||
PgStat_Counter m_active_time;
|
||||
PgStat_Counter m_idle_in_xact_time;
|
||||
SessionEndType m_disconnect;
|
||||
} PgStat_MsgConn;
|
||||
} PgStat_MsgConnect;
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgDisconnect Sent by the backend when disconnecting
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgDisconnect
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
Oid m_databaseid;
|
||||
SessionEndType m_cause;
|
||||
} PgStat_MsgDisconnect;
|
||||
|
||||
/* ----------
|
||||
* PgStat_Msg Union over all possible messages.
|
||||
@ -700,7 +710,8 @@ typedef union PgStat_Msg
|
||||
PgStat_MsgTempFile msg_tempfile;
|
||||
PgStat_MsgChecksumFailure msg_checksumfailure;
|
||||
PgStat_MsgReplSlot msg_replslot;
|
||||
PgStat_MsgConn msg_conn;
|
||||
PgStat_MsgConnect msg_connect;
|
||||
PgStat_MsgDisconnect msg_disconnect;
|
||||
} PgStat_Msg;
|
||||
|
||||
|
||||
@ -1010,6 +1021,7 @@ extern void pgstat_reset_single_counter(Oid objectid, PgStat_Single_Reset_Type t
|
||||
extern void pgstat_reset_slru_counter(const char *);
|
||||
extern void pgstat_reset_replslot_counter(const char *name);
|
||||
|
||||
extern void pgstat_report_connect(Oid dboid);
|
||||
extern void pgstat_report_autovac(Oid dboid);
|
||||
extern void pgstat_report_vacuum(Oid tableoid, bool shared,
|
||||
PgStat_Counter livetuples, PgStat_Counter deadtuples);
|
||||
|
Reference in New Issue
Block a user