Re: Add session statistics to pg_stat_database - Mailing list pgsql-hackers
From | Laurenz Albe |
---|---|
Subject | Re: Add session statistics to pg_stat_database |
Date | |
Msg-id | 95a4c49710cdf8be220bc8267872b171c2e3f182.camel@cybertec.at Whole thread Raw |
In response to | Re: Add session statistics to pg_stat_database (Soumyadeep Chakraborty <soumyadeep2007@gmail.com>) |
Responses |
Re: Add session statistics to pg_stat_database
|
List | pgsql-hackers |
On Thu, 2020-09-24 at 14:38 -0700, Soumyadeep Chakraborty wrote: > Thanks for submitting this! Please find my feedback below. Thanks for the thorough review. Before I update the patch, I have a few comments and questions. > * Are we trying to capture ONLY client initiated disconnects in > m_aborted (we are not handling other disconnects by not accounting for > EOF..like if psql was killed)? If yes, why? I thought it was interesting to know how many database sessions are ended regularly as opposed to ones that get killed or end by unexpected client death. > * pgstat_send_connstats(): How about renaming the "force" argument to > "disconnected"? Yes, that might be better. I'll do that. > * > > static TimestampTz pgStatActiveStart = DT_NOBEGIN; > > static PgStat_Counter pgStatActiveTime = 0; > > static TimestampTz pgStatTransactionIdleStart = DT_NOBEGIN; > > static PgStat_Counter pgStatTransactionIdleTime = 0; > > static bool pgStatSessionReported = false; > > bool pgStatSessionDisconnected = false; > > I think we can house all of these globals inside PgBackendStatus and can > follow the protocol for reading/writing fields in PgBackendStatus. > Refer: PGSTAT_{BEGIN|END}_WRITE_ACTIVITY Are you sure that is the right way to go? Correct me if I am wrong, but isn't PgBackendStatus for relevant status information that other processes can access? I'd assume that it is not the correct place to store backend-private data that are not relevant to others. Besides, if data is written to this structure more often, readers would have deal with more contention, which could affect performance. But I agree with the following: > Also, some of these fields are not required: > > I don't think we need pgStatActiveStart and pgStatTransactionIdleStart - > instead of these two we could use > PgBackendStatus.st_state_start_timestamp which marks the beginning TS of > the backend's current state (st_state). We can look at that field along > with the current and to-be-transitioned-to states inside > pgstat_report_activity() when there is a transition away from > STATE_RUNNING, STATE_IDLEINTRANSACTION or > STATE_IDLEINTRANSACTION_ABORTED, in order to update pgStatActiveTime and > pgStatTransactionIdleTime. We would also need to update those counters > on disconnect/PGSTAT_STAT_INTERVAL timeout if the backend's current > state was STATE_RUNNING, STATE_IDLEINTRANSACTION or > STATE_IDLEINTRANSACTION_ABORTED (in pgstat_send_connstats()) Yes, that would be better. > pgStatSessionDisconnected is not required as it can be determined if a > session has been disconnected by looking at the force argument to > pgstat_report_stat() [unless we would want to distinguish between > client-initiated disconnects, which I am not sure why, as I have > brought up above]. But wouldn't that mean that we count *every* end of a session as regular disconnection, even if the backend was killed? I personally would want all my database connections to be closed by the client, unless something unexpected happens. > pgStatSessionReported is not required. We can glean this information by > checking if the function local static last_report in > pgstat_report_stat() is 0 and passing this on as another param > "first_report" to pgstat_send_connstats(). Yes, that is better. > * PGSTAT_FILE_FORMAT_ID needs to be updated when a stats collector data > structure changes and we had a change in PgStat_StatDBEntry. I think that should be left to the committer. > * We can directly use PgBackendStatus.st_proc_start_timestamp for > calculating m_session_time. We can also choose to report session uptime > even when the report is for the not-disconnect case > (PGSTAT_STAT_INTERVAL elapsed). No reason why not. Then we would need to > pass in the value of last_report to pgstat_send_connstats() -> calculate > m_session_time to be number of time units from > PgBackendStatus.st_proc_start_timestamp for the first report and then > number of time units from the last_report for all subsequent reports. Yes, that would make for better statistics, since client connections can last quite long. > * We would need to bump the catalog version since we have made > changes to system views. Refer: #define CATALOG_VERSION_NO Again, I think that's up to the committer. Thanks again! Yours, Laurenz Albe
pgsql-hackers by date: