Take the statistics collector out of the loop for monitoring backends'
current commands; instead, store current-status information in shared memory. This substantially reduces the overhead of stats_command_string and also ensures that pg_stat_activity is fully up to date at all times. Per my recent proposal.
This commit is contained in:
parent
6075feed40
commit
b13c9686d0
@ -1,4 +1,4 @@
|
||||
<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.65 2006/06/18 15:38:35 petere Exp $ -->
|
||||
<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.66 2006/06/19 01:51:21 tgl Exp $ -->
|
||||
|
||||
<chapter Id="runtime-config">
|
||||
<title>Server Configuration</title>
|
||||
@ -2845,43 +2845,6 @@ SELECT * FROM parent WHERE key = 2400;
|
||||
<sect1 id="runtime-config-statistics">
|
||||
<title>Run-Time Statistics</title>
|
||||
|
||||
<sect2 id="runtime-config-statistics-monitor">
|
||||
<title>Statistics Monitoring</title>
|
||||
<variablelist>
|
||||
|
||||
<varlistentry>
|
||||
<term><varname>log_statement_stats</varname> (<type>boolean</type>)</term>
|
||||
<term><varname>log_parser_stats</varname> (<type>boolean</type>)</term>
|
||||
<term><varname>log_planner_stats</varname> (<type>boolean</type>)</term>
|
||||
<term><varname>log_executor_stats</varname> (<type>boolean</type>)</term>
|
||||
<indexterm>
|
||||
<primary><varname>log_statement_stats</> configuration parameter</primary>
|
||||
</indexterm>
|
||||
<indexterm>
|
||||
<primary><varname>log_parser_stats</> configuration parameter</primary>
|
||||
</indexterm>
|
||||
<indexterm>
|
||||
<primary><varname>log_planner_stats</> configuration parameter</primary>
|
||||
</indexterm>
|
||||
<indexterm>
|
||||
<primary><varname>log_executor_stats</> configuration parameter</primary>
|
||||
</indexterm>
|
||||
<listitem>
|
||||
<para>
|
||||
For each query, write performance statistics of the respective
|
||||
module to the server log. This is a crude profiling
|
||||
instrument. <varname>log_statement_stats</varname> reports total
|
||||
statement statistics, while the others report per-module statistics.
|
||||
<varname>log_statement_stats</varname> cannot be enabled together with
|
||||
any of the per-module options. All of these options are disabled by
|
||||
default. Only superusers can change these settings.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
</variablelist>
|
||||
|
||||
</sect2>
|
||||
<sect2 id="runtime-config-statistics-collector">
|
||||
<title>Query and Index Statistics Collector</title>
|
||||
|
||||
@ -2893,8 +2856,38 @@ SELECT * FROM parent WHERE key = 2400;
|
||||
Refer to <xref linkend="monitoring"> for more information.
|
||||
</para>
|
||||
|
||||
<note>
|
||||
<para>
|
||||
As of <productname>PostgreSQL</productname> 8.2,
|
||||
<varname>stats_command_string</varname> controls a separate data
|
||||
collection mechanism that can be turned on or off independently
|
||||
of whether the statistics-collection subprocess is running.
|
||||
The subprocess is only needed to support collection of
|
||||
block-level or row-level statistics.
|
||||
</para>
|
||||
</note>
|
||||
|
||||
<variablelist>
|
||||
|
||||
<varlistentry id="guc-stats-command-string" xreflabel="stats_command_string">
|
||||
<term><varname>stats_command_string</varname> (<type>boolean</type>)</term>
|
||||
<indexterm>
|
||||
<primary><varname>stats_command_string</> configuration parameter</primary>
|
||||
</indexterm>
|
||||
<listitem>
|
||||
<para>
|
||||
Enables the collection of information on the currently
|
||||
executing command of each session, along with the time at
|
||||
which that command began execution. This parameter is off by
|
||||
default. Note that even when enabled, this information is not
|
||||
visible to all users, only to superusers and the user owning
|
||||
the session being reported on; so it should not represent a
|
||||
security risk.
|
||||
Only superusers can change this setting.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry id="guc-stats-start-collector" xreflabel="stats_start_collector">
|
||||
<term><varname>stats_start_collector</varname> (<type>boolean</type>)</term>
|
||||
<indexterm>
|
||||
@ -2914,25 +2907,6 @@ SELECT * FROM parent WHERE key = 2400;
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry id="guc-stats-command-string" xreflabel="stats_command_string">
|
||||
<term><varname>stats_command_string</varname> (<type>boolean</type>)</term>
|
||||
<indexterm>
|
||||
<primary><varname>stats_command_string</> configuration parameter</primary>
|
||||
</indexterm>
|
||||
<listitem>
|
||||
<para>
|
||||
Enables the collection of statistics on the currently
|
||||
executing command of each session, along with the time at
|
||||
which that command began execution. This parameter is off by
|
||||
default. Note that even when enabled, this information is not
|
||||
visible to all users, only to superusers and the user owning
|
||||
the session being reported on; so it should not represent a
|
||||
security risk.
|
||||
Only superusers can change this setting.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry id="guc-stats-block-level" xreflabel="stats_block_level">
|
||||
<term><varname>stats_block_level</varname> (<type>boolean</type>)</term>
|
||||
<indexterm>
|
||||
@ -2968,16 +2942,54 @@ SELECT * FROM parent WHERE key = 2400;
|
||||
</indexterm>
|
||||
<listitem>
|
||||
<para>
|
||||
If on, collected statistics are zeroed out whenever the server
|
||||
is restarted. If off, statistics are accumulated across server
|
||||
restarts. The default is <literal>off</>. This parameter can only
|
||||
be set at server start.
|
||||
If on, collected block-level and row-level statistics are zeroed out
|
||||
whenever the server is restarted. If off, statistics are accumulated
|
||||
across server restarts. This parameter is off by default.
|
||||
This parameter can only be set at server start.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
</variablelist>
|
||||
</sect2>
|
||||
|
||||
<sect2 id="runtime-config-statistics-monitor">
|
||||
<title>Statistics Monitoring</title>
|
||||
<variablelist>
|
||||
|
||||
<varlistentry>
|
||||
<term><varname>log_statement_stats</varname> (<type>boolean</type>)</term>
|
||||
<term><varname>log_parser_stats</varname> (<type>boolean</type>)</term>
|
||||
<term><varname>log_planner_stats</varname> (<type>boolean</type>)</term>
|
||||
<term><varname>log_executor_stats</varname> (<type>boolean</type>)</term>
|
||||
<indexterm>
|
||||
<primary><varname>log_statement_stats</> configuration parameter</primary>
|
||||
</indexterm>
|
||||
<indexterm>
|
||||
<primary><varname>log_parser_stats</> configuration parameter</primary>
|
||||
</indexterm>
|
||||
<indexterm>
|
||||
<primary><varname>log_planner_stats</> configuration parameter</primary>
|
||||
</indexterm>
|
||||
<indexterm>
|
||||
<primary><varname>log_executor_stats</> configuration parameter</primary>
|
||||
</indexterm>
|
||||
<listitem>
|
||||
<para>
|
||||
For each query, write performance statistics of the respective
|
||||
module to the server log. This is a crude profiling
|
||||
instrument. <varname>log_statement_stats</varname> reports total
|
||||
statement statistics, while the others report per-module statistics.
|
||||
<varname>log_statement_stats</varname> cannot be enabled together with
|
||||
any of the per-module options. All of these options are disabled by
|
||||
default. Only superusers can change these settings.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
</variablelist>
|
||||
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
<sect1 id="runtime-config-autovacuum">
|
||||
|
@ -1,4 +1,4 @@
|
||||
<!-- $PostgreSQL: pgsql/doc/src/sgml/monitoring.sgml,v 1.33 2006/06/18 15:38:35 petere Exp $ -->
|
||||
<!-- $PostgreSQL: pgsql/doc/src/sgml/monitoring.sgml,v 1.34 2006/06/19 01:51:21 tgl Exp $ -->
|
||||
|
||||
<chapter id="monitoring">
|
||||
<title>Monitoring Database Activity</title>
|
||||
@ -109,9 +109,14 @@ postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
|
||||
<productname>PostgreSQL</productname>'s <firstterm>statistics collector</>
|
||||
is a subsystem that supports collection and reporting of information about
|
||||
server activity. Presently, the collector can count accesses to tables
|
||||
and indexes in both disk-block and individual-row terms. It also supports
|
||||
determining the exact command currently being executed by other server
|
||||
processes.
|
||||
and indexes in both disk-block and individual-row terms.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
<productname>PostgreSQL</productname> also supports determining the exact
|
||||
command currently being executed by other server processes. This is an
|
||||
independent facility that can be enabled or disabled whether or not
|
||||
block-level and row-level statistics are being collected.
|
||||
</para>
|
||||
|
||||
<sect2 id="monitoring-stats-setup">
|
||||
@ -136,15 +141,21 @@ postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The parameters <xref linkend="guc-stats-command-string">,
|
||||
<xref linkend="guc-stats-block-level">, and <xref
|
||||
The parameters <xref linkend="guc-stats-block-level"> and <xref
|
||||
linkend="guc-stats-row-level"> control how much information is
|
||||
actually sent to the collector and thus determine how much run-time
|
||||
overhead occurs. These respectively determine whether a server
|
||||
process sends its current command string, disk-block-level access
|
||||
statistics, and row-level access statistics to the collector.
|
||||
process tracks disk-block-level access
|
||||
statistics and row-level access statistics and sends these to the collector.
|
||||
Additionally, per-database transaction commit and abort statistics
|
||||
are collected if any of these parameters are set.
|
||||
are collected if either of these parameters are set.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The parameter <xref linkend="guc-stats-command-string"> enables monitoring
|
||||
of the current command being executed by any server process.
|
||||
The statistics collector subprocess need not be running to enable this
|
||||
feature.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
@ -165,7 +176,7 @@ postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
|
||||
very few statistics are collected in the default
|
||||
configuration. Enabling one or more of these configuration
|
||||
variables will significantly enhance the amount of useful data
|
||||
produced by the statistics collector, at the expense of
|
||||
produced by the statistics facilities, at the expense of
|
||||
additional run-time overhead.
|
||||
</para>
|
||||
</note>
|
||||
@ -190,10 +201,9 @@ postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
|
||||
progress does not affect the displayed totals. Also, the collector itself
|
||||
emits a new report at most once per <varname>PGSTAT_STAT_INTERVAL</varname>
|
||||
milliseconds (500 unless altered while building the server). So the
|
||||
displayed information lags behind actual activity. Current-query
|
||||
information is reported to the collector immediately, but is still subject
|
||||
to the <varname>PGSTAT_STAT_INTERVAL</varname> delay before it becomes
|
||||
visible.
|
||||
displayed information lags behind actual activity. However, current-query
|
||||
information collected by <varname>stats_command_string</varname> is
|
||||
always up-to-date.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
@ -202,7 +212,10 @@ postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
|
||||
the collector process and then continues to use this snapshot for all
|
||||
statistical views and functions until the end of its current transaction.
|
||||
So the statistics will appear not to change as long as you continue the
|
||||
current transaction.
|
||||
current transaction. Similarly, information about the current queries of
|
||||
all processes is collected when any such information is first requested
|
||||
within a transaction, and the same information will be displayed throughout
|
||||
the transaction.
|
||||
This is a feature, not a bug, because it allows you to perform several
|
||||
queries on the statistics and correlate the results without worrying that
|
||||
the numbers are changing underneath you. But if you want to see new
|
||||
@ -232,9 +245,8 @@ postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
|
||||
parameter <varname>stats_command_string</varname> has been
|
||||
turned on. Furthermore, these columns read as null unless the
|
||||
user examining the view is a superuser or the same as the user
|
||||
owning the process being reported on. (Note that because of the
|
||||
collector's reporting delay, the current query will only be
|
||||
up-to-date for long-running queries.)</entry>
|
||||
owning the process being reported on.
|
||||
</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
@ -549,7 +561,7 @@ postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
|
||||
<entry><literal><function>pg_stat_get_last_vacuum_time</function>(<type>oid</type>)</literal></entry>
|
||||
<entry><type>timestamptz</type></entry>
|
||||
<entry>
|
||||
Time of the last vacuum initiated by the user
|
||||
Time of the last vacuum initiated by the user on this table
|
||||
</entry>
|
||||
</row>
|
||||
|
||||
@ -557,7 +569,7 @@ postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
|
||||
<entry><literal><function>pg_stat_get_last_autovacuum_time</function>(<type>oid</type>)</literal></entry>
|
||||
<entry><type>timestamptz</type></entry>
|
||||
<entry>
|
||||
Time of the last vacuum initiated by the autovacuum daemon
|
||||
Time of the last vacuum initiated by the autovacuum daemon on this table
|
||||
</entry>
|
||||
</row>
|
||||
|
||||
@ -565,7 +577,7 @@ postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
|
||||
<entry><literal><function>pg_stat_get_last_analyze_time</function>(<type>oid</type>)</literal></entry>
|
||||
<entry><type>timestamptz</type></entry>
|
||||
<entry>
|
||||
Time of the last analyze initiated by the user
|
||||
Time of the last analyze initiated by the user on this table
|
||||
</entry>
|
||||
</row>
|
||||
|
||||
@ -573,7 +585,8 @@ postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
|
||||
<entry><literal><function>pg_stat_get_last_autoanalyze_time</function>(<type>oid</type>)</literal></entry>
|
||||
<entry><type>timestamptz</type></entry>
|
||||
<entry>
|
||||
Time of the last analyze initiated by the autovacuum daemon
|
||||
Time of the last analyze initiated by the autovacuum daemon on this
|
||||
table
|
||||
</entry>
|
||||
</row>
|
||||
|
||||
@ -677,7 +690,7 @@ postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
|
||||
<entry><literal><function>pg_stat_reset</function>()</literal></entry>
|
||||
<entry><type>boolean</type></entry>
|
||||
<entry>
|
||||
Reset all currently collected statistics
|
||||
Reset all block-level and row-level statistics to zero
|
||||
</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -37,7 +37,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.486 2006/06/18 15:38:37 petere Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.487 2006/06/19 01:51:21 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
*
|
||||
@ -2109,9 +2109,6 @@ reaper(SIGNAL_ARGS)
|
||||
{
|
||||
AutoVacPID = 0;
|
||||
autovac_stopped();
|
||||
/* Tell the collector about process termination */
|
||||
pgstat_beterm(pid);
|
||||
|
||||
if (exitstatus != 0)
|
||||
HandleChildCrash(pid, exitstatus,
|
||||
_("autovacuum process"));
|
||||
@ -2252,8 +2249,6 @@ CleanupBackend(int pid,
|
||||
#ifdef EXEC_BACKEND
|
||||
ShmemBackendArrayRemove(pid);
|
||||
#endif
|
||||
/* Tell the collector about backend termination */
|
||||
pgstat_beterm(pid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -2299,8 +2294,6 @@ HandleChildCrash(int pid, int exitstatus, const char *procname)
|
||||
#ifdef EXEC_BACKEND
|
||||
ShmemBackendArrayRemove(pid);
|
||||
#endif
|
||||
/* Tell the collector about backend termination */
|
||||
pgstat_beterm(pid);
|
||||
/* Keep looping so we can signal remaining backends */
|
||||
}
|
||||
else
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/storage/ipc/ipci.c,v 1.83 2006/05/08 00:00:10 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/storage/ipc/ipci.c,v 1.84 2006/06/19 01:51:21 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -21,6 +21,7 @@
|
||||
#include "access/twophase.h"
|
||||
#include "access/xlog.h"
|
||||
#include "miscadmin.h"
|
||||
#include "pgstat.h"
|
||||
#include "postmaster/bgwriter.h"
|
||||
#include "postmaster/postmaster.h"
|
||||
#include "storage/bufmgr.h"
|
||||
@ -86,6 +87,7 @@ CreateSharedMemoryAndSemaphores(bool makePrivate, int port)
|
||||
size = add_size(size, MultiXactShmemSize());
|
||||
size = add_size(size, LWLockShmemSize());
|
||||
size = add_size(size, ProcArrayShmemSize());
|
||||
size = add_size(size, BackendStatusShmemSize());
|
||||
size = add_size(size, SInvalShmemSize());
|
||||
size = add_size(size, FreeSpaceShmemSize());
|
||||
size = add_size(size, BgWriterShmemSize());
|
||||
@ -167,6 +169,7 @@ CreateSharedMemoryAndSemaphores(bool makePrivate, int port)
|
||||
if (!IsUnderPostmaster)
|
||||
InitProcGlobal();
|
||||
CreateSharedProcArray();
|
||||
CreateSharedBackendStatus();
|
||||
|
||||
/*
|
||||
* Set up shared-inval messaging
|
||||
|
@ -23,7 +23,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/storage/ipc/procarray.c,v 1.11 2006/03/05 15:58:37 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/storage/ipc/procarray.c,v 1.12 2006/06/19 01:51:21 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -732,42 +732,6 @@ IsBackendPid(int pid)
|
||||
return (BackendPidGetProc(pid) != NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* GetAllBackendPids -- get an array of all current backends' PIDs
|
||||
*
|
||||
* The result is a palloc'd array with the number of active backends in
|
||||
* entry [0], their PIDs in entries [1] .. [n]. The caller must bear in
|
||||
* mind that the result may already be obsolete when returned.
|
||||
*/
|
||||
int *
|
||||
GetAllBackendPids(void)
|
||||
{
|
||||
int *result;
|
||||
int npids;
|
||||
ProcArrayStruct *arrayP = procArray;
|
||||
int index;
|
||||
|
||||
result = (int *) palloc((MaxBackends + 1) * sizeof(int));
|
||||
npids = 0;
|
||||
|
||||
LWLockAcquire(ProcArrayLock, LW_SHARED);
|
||||
|
||||
for (index = 0; index < arrayP->numProcs; index++)
|
||||
{
|
||||
PGPROC *proc = arrayP->procs[index];
|
||||
|
||||
if (proc->pid != 0) /* ignore dummy procs */
|
||||
result[++npids] = proc->pid;
|
||||
}
|
||||
|
||||
LWLockRelease(ProcArrayLock);
|
||||
|
||||
Assert(npids <= MaxBackends);
|
||||
|
||||
result[0] = npids;
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* CountActiveBackends --- count backends (other than myself) that are in
|
||||
* active transactions. This is used as a heuristic to decide if
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/pgstatfuncs.c,v 1.29 2006/05/19 19:08:26 alvherre Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/pgstatfuncs.c,v 1.30 2006/06/19 01:51:21 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -61,11 +61,9 @@ extern Datum pg_stat_get_db_blocks_hit(PG_FUNCTION_ARGS);
|
||||
Datum
|
||||
pg_stat_get_numscans(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -79,11 +77,9 @@ pg_stat_get_numscans(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_tuples_returned(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -97,11 +93,9 @@ pg_stat_get_tuples_returned(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_tuples_fetched(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -115,11 +109,9 @@ pg_stat_get_tuples_fetched(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_tuples_inserted(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -133,11 +125,9 @@ pg_stat_get_tuples_inserted(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_tuples_updated(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -151,11 +141,9 @@ pg_stat_get_tuples_updated(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_tuples_deleted(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -169,11 +157,9 @@ pg_stat_get_tuples_deleted(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -187,11 +173,9 @@ pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_blocks_hit(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -204,11 +188,9 @@ pg_stat_get_blocks_hit(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
TimestampTz result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -224,11 +206,9 @@ pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_last_autovacuum_time(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
TimestampTz result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -244,11 +224,9 @@ pg_stat_get_last_autovacuum_time(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_last_analyze_time(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
TimestampTz result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -264,11 +242,9 @@ pg_stat_get_last_analyze_time(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_last_autoanalyze_time(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
TimestampTz result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -342,75 +318,59 @@ pg_stat_reset(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_backend_pid(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatBeEntry *beentry;
|
||||
int32 beid;
|
||||
|
||||
beid = PG_GETARG_INT32(0);
|
||||
int32 beid = PG_GETARG_INT32(0);
|
||||
PgBackendStatus *beentry;
|
||||
|
||||
if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
|
||||
PG_RETURN_NULL();
|
||||
|
||||
PG_RETURN_INT32(beentry->procpid);
|
||||
PG_RETURN_INT32(beentry->st_procpid);
|
||||
}
|
||||
|
||||
|
||||
Datum
|
||||
pg_stat_get_backend_dbid(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatBeEntry *beentry;
|
||||
int32 beid;
|
||||
|
||||
beid = PG_GETARG_INT32(0);
|
||||
int32 beid = PG_GETARG_INT32(0);
|
||||
PgBackendStatus *beentry;
|
||||
|
||||
if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
|
||||
PG_RETURN_NULL();
|
||||
|
||||
/* Not initialized yet? */
|
||||
if (!OidIsValid(beentry->databaseid))
|
||||
PG_RETURN_NULL();
|
||||
|
||||
PG_RETURN_OID(beentry->databaseid);
|
||||
PG_RETURN_OID(beentry->st_databaseid);
|
||||
}
|
||||
|
||||
|
||||
Datum
|
||||
pg_stat_get_backend_userid(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatBeEntry *beentry;
|
||||
int32 beid;
|
||||
|
||||
beid = PG_GETARG_INT32(0);
|
||||
int32 beid = PG_GETARG_INT32(0);
|
||||
PgBackendStatus *beentry;
|
||||
|
||||
if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
|
||||
PG_RETURN_NULL();
|
||||
|
||||
/* Not initialized yet? */
|
||||
if (!OidIsValid(beentry->userid))
|
||||
PG_RETURN_NULL();
|
||||
|
||||
PG_RETURN_OID(beentry->userid);
|
||||
PG_RETURN_OID(beentry->st_userid);
|
||||
}
|
||||
|
||||
|
||||
Datum
|
||||
pg_stat_get_backend_activity(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatBeEntry *beentry;
|
||||
int32 beid;
|
||||
int len;
|
||||
char *activity;
|
||||
int32 beid = PG_GETARG_INT32(0);
|
||||
text *result;
|
||||
|
||||
beid = PG_GETARG_INT32(0);
|
||||
PgBackendStatus *beentry;
|
||||
int len;
|
||||
const char *activity;
|
||||
|
||||
if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
|
||||
activity = "<backend information not available>";
|
||||
else if (!superuser() && beentry->userid != GetUserId())
|
||||
else if (!superuser() && beentry->st_userid != GetUserId())
|
||||
activity = "<insufficient privilege>";
|
||||
else if (*(beentry->activity) == '\0')
|
||||
else if (*(beentry->st_activity) == '\0')
|
||||
activity = "<command string not enabled>";
|
||||
else
|
||||
activity = beentry->activity;
|
||||
activity = beentry->st_activity;
|
||||
|
||||
len = strlen(activity);
|
||||
result = palloc(VARHDRSZ + len);
|
||||
@ -426,15 +386,15 @@ pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS)
|
||||
{
|
||||
int32 beid = PG_GETARG_INT32(0);
|
||||
TimestampTz result;
|
||||
PgStat_StatBeEntry *beentry;
|
||||
PgBackendStatus *beentry;
|
||||
|
||||
if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
|
||||
PG_RETURN_NULL();
|
||||
|
||||
if (!superuser() && beentry->userid != GetUserId())
|
||||
if (!superuser() && beentry->st_userid != GetUserId())
|
||||
PG_RETURN_NULL();
|
||||
|
||||
result = beentry->activity_start_timestamp;
|
||||
result = beentry->st_activity_start_timestamp;
|
||||
|
||||
/*
|
||||
* No time recorded for start of current query -- this is the case if the
|
||||
@ -451,15 +411,15 @@ pg_stat_get_backend_start(PG_FUNCTION_ARGS)
|
||||
{
|
||||
int32 beid = PG_GETARG_INT32(0);
|
||||
TimestampTz result;
|
||||
PgStat_StatBeEntry *beentry;
|
||||
PgBackendStatus *beentry;
|
||||
|
||||
if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
|
||||
PG_RETURN_NULL();
|
||||
|
||||
if (!superuser() && beentry->userid != GetUserId())
|
||||
if (!superuser() && beentry->st_userid != GetUserId())
|
||||
PG_RETURN_NULL();
|
||||
|
||||
result = beentry->start_timestamp;
|
||||
result = beentry->st_proc_start_timestamp;
|
||||
|
||||
if (result == 0) /* probably can't happen? */
|
||||
PG_RETURN_NULL();
|
||||
@ -471,31 +431,25 @@ pg_stat_get_backend_start(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatBeEntry *beentry;
|
||||
int32 beid = PG_GETARG_INT32(0);
|
||||
PgBackendStatus *beentry;
|
||||
SockAddr zero_clientaddr;
|
||||
int32 beid;
|
||||
char remote_host[NI_MAXHOST];
|
||||
int ret;
|
||||
|
||||
beid = PG_GETARG_INT32(0);
|
||||
|
||||
if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
|
||||
PG_RETURN_NULL();
|
||||
|
||||
/* Not initialized yet? */
|
||||
if (!OidIsValid(beentry->userid))
|
||||
PG_RETURN_NULL();
|
||||
|
||||
if (!superuser() && beentry->userid != GetUserId())
|
||||
if (!superuser() && beentry->st_userid != GetUserId())
|
||||
PG_RETURN_NULL();
|
||||
|
||||
/* A zeroed client addr means we don't know */
|
||||
memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
|
||||
if (memcmp(&(beentry->clientaddr), &zero_clientaddr,
|
||||
if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
|
||||
sizeof(zero_clientaddr) == 0))
|
||||
PG_RETURN_NULL();
|
||||
|
||||
switch (beentry->clientaddr.addr.ss_family)
|
||||
switch (beentry->st_clientaddr.addr.ss_family)
|
||||
{
|
||||
case AF_INET:
|
||||
#ifdef HAVE_IPV6
|
||||
@ -507,7 +461,8 @@ pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS)
|
||||
}
|
||||
|
||||
remote_host[0] = '\0';
|
||||
ret = pg_getnameinfo_all(&beentry->clientaddr.addr, beentry->clientaddr.salen,
|
||||
ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
|
||||
beentry->st_clientaddr.salen,
|
||||
remote_host, sizeof(remote_host),
|
||||
NULL, 0,
|
||||
NI_NUMERICHOST | NI_NUMERICSERV);
|
||||
@ -521,31 +476,25 @@ pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_backend_client_port(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatBeEntry *beentry;
|
||||
int32 beid = PG_GETARG_INT32(0);
|
||||
PgBackendStatus *beentry;
|
||||
SockAddr zero_clientaddr;
|
||||
int32 beid;
|
||||
char remote_port[NI_MAXSERV];
|
||||
int ret;
|
||||
|
||||
beid = PG_GETARG_INT32(0);
|
||||
|
||||
if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
|
||||
PG_RETURN_NULL();
|
||||
|
||||
/* Not initialized yet? */
|
||||
if (!OidIsValid(beentry->userid))
|
||||
PG_RETURN_NULL();
|
||||
|
||||
if (!superuser() && beentry->userid != GetUserId())
|
||||
if (!superuser() && beentry->st_userid != GetUserId())
|
||||
PG_RETURN_NULL();
|
||||
|
||||
/* A zeroed client addr means we don't know */
|
||||
memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
|
||||
if (memcmp(&(beentry->clientaddr), &zero_clientaddr,
|
||||
if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
|
||||
sizeof(zero_clientaddr) == 0))
|
||||
PG_RETURN_NULL();
|
||||
|
||||
switch (beentry->clientaddr.addr.ss_family)
|
||||
switch (beentry->st_clientaddr.addr.ss_family)
|
||||
{
|
||||
case AF_INET:
|
||||
#ifdef HAVE_IPV6
|
||||
@ -559,31 +508,35 @@ pg_stat_get_backend_client_port(PG_FUNCTION_ARGS)
|
||||
}
|
||||
|
||||
remote_port[0] = '\0';
|
||||
ret = pg_getnameinfo_all(&beentry->clientaddr.addr,
|
||||
beentry->clientaddr.salen,
|
||||
ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
|
||||
beentry->st_clientaddr.salen,
|
||||
NULL, 0,
|
||||
remote_port, sizeof(remote_port),
|
||||
NI_NUMERICHOST | NI_NUMERICSERV);
|
||||
if (ret)
|
||||
PG_RETURN_NULL();
|
||||
|
||||
PG_RETURN_DATUM(DirectFunctionCall1(int4in, CStringGetDatum(remote_port)));
|
||||
PG_RETURN_DATUM(DirectFunctionCall1(int4in,
|
||||
CStringGetDatum(remote_port)));
|
||||
}
|
||||
|
||||
|
||||
Datum
|
||||
pg_stat_get_db_numbackends(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
Oid dbid;
|
||||
Oid dbid = PG_GETARG_OID(0);
|
||||
int32 result;
|
||||
int tot_backends = pgstat_fetch_stat_numbackends();
|
||||
int beid;
|
||||
|
||||
dbid = PG_GETARG_OID(0);
|
||||
result = 0;
|
||||
for (beid = 1; beid <= tot_backends; beid++)
|
||||
{
|
||||
PgBackendStatus *beentry = pgstat_fetch_stat_beentry(beid);
|
||||
|
||||
if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
|
||||
result = 0;
|
||||
else
|
||||
result = (int32) (dbentry->n_backends);
|
||||
if (beentry && beentry->st_databaseid == dbid)
|
||||
result++;
|
||||
}
|
||||
|
||||
PG_RETURN_INT32(result);
|
||||
}
|
||||
@ -592,11 +545,9 @@ pg_stat_get_db_numbackends(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_db_xact_commit(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
Oid dbid;
|
||||
Oid dbid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
dbid = PG_GETARG_OID(0);
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
|
||||
if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
|
||||
result = 0;
|
||||
@ -610,11 +561,9 @@ pg_stat_get_db_xact_commit(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_db_xact_rollback(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
Oid dbid;
|
||||
Oid dbid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
dbid = PG_GETARG_OID(0);
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
|
||||
if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
|
||||
result = 0;
|
||||
@ -628,11 +577,9 @@ pg_stat_get_db_xact_rollback(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_db_blocks_fetched(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
Oid dbid;
|
||||
Oid dbid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
dbid = PG_GETARG_OID(0);
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
|
||||
if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
|
||||
result = 0;
|
||||
@ -646,11 +593,9 @@ pg_stat_get_db_blocks_fetched(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_db_blocks_hit(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
Oid dbid;
|
||||
Oid dbid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
dbid = PG_GETARG_OID(0);
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
|
||||
if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
|
||||
result = 0;
|
||||
|
@ -10,7 +10,7 @@
|
||||
* Written by Peter Eisentraut <peter_e@gmx.net>.
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.321 2006/06/05 02:49:58 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.322 2006/06/19 01:51:21 tgl Exp $
|
||||
*
|
||||
*--------------------------------------------------------------------
|
||||
*/
|
||||
@ -700,16 +700,6 @@ static struct config_bool ConfigureNamesBool[] =
|
||||
&pgstat_collect_resetonpmstart,
|
||||
false, NULL, NULL
|
||||
},
|
||||
{
|
||||
{"stats_command_string", PGC_SUSET, STATS_COLLECTOR,
|
||||
gettext_noop("Collects statistics about executing commands."),
|
||||
gettext_noop("Enables the collection of statistics on the currently "
|
||||
"executing command of each session, along with the time "
|
||||
"at which that command began execution.")
|
||||
},
|
||||
&pgstat_collect_querystring,
|
||||
false, NULL, NULL
|
||||
},
|
||||
{
|
||||
{"stats_row_level", PGC_SUSET, STATS_COLLECTOR,
|
||||
gettext_noop("Collects row-level statistics on database activity."),
|
||||
@ -727,6 +717,17 @@ static struct config_bool ConfigureNamesBool[] =
|
||||
false, NULL, NULL
|
||||
},
|
||||
|
||||
{
|
||||
{"stats_command_string", PGC_SUSET, STATS_COLLECTOR,
|
||||
gettext_noop("Collects information about executing commands."),
|
||||
gettext_noop("Enables the collection of information on the currently "
|
||||
"executing command of each session, along with the time "
|
||||
"at which that command began execution.")
|
||||
},
|
||||
&pgstat_collect_querystring,
|
||||
false, NULL, NULL
|
||||
},
|
||||
|
||||
{
|
||||
{"autovacuum", PGC_SIGHUP, AUTOVACUUM,
|
||||
gettext_noop("Starts the autovacuum subprocess."),
|
||||
|
@ -320,6 +320,14 @@
|
||||
# RUNTIME STATISTICS
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# - Query/Index Statistics Collector -
|
||||
|
||||
#stats_command_string = off
|
||||
#stats_start_collector = on # needed for block or row stats
|
||||
#stats_block_level = off
|
||||
#stats_row_level = off
|
||||
#stats_reset_on_server_start = off
|
||||
|
||||
# - Statistics Monitoring -
|
||||
|
||||
#log_parser_stats = off
|
||||
@ -327,14 +335,6 @@
|
||||
#log_executor_stats = off
|
||||
#log_statement_stats = off
|
||||
|
||||
# - Query/Index Statistics Collector -
|
||||
|
||||
#stats_start_collector = on
|
||||
#stats_command_string = off
|
||||
#stats_block_level = off
|
||||
#stats_row_level = off
|
||||
#stats_reset_on_server_start = off
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# AUTOVACUUM PARAMETERS
|
||||
|
@ -5,7 +5,7 @@
|
||||
*
|
||||
* Copyright (c) 2001-2006, PostgreSQL Global Development Group
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/pgstat.h,v 1.46 2006/05/30 02:35:39 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/include/pgstat.h,v 1.47 2006/06/19 01:51:21 tgl Exp $
|
||||
* ----------
|
||||
*/
|
||||
#ifndef PGSTAT_H
|
||||
@ -16,16 +16,14 @@
|
||||
#include "utils/rel.h"
|
||||
#include "utils/timestamp.h"
|
||||
|
||||
|
||||
/* ----------
|
||||
* The types of backend/postmaster -> collector messages
|
||||
* The types of backend -> collector messages
|
||||
* ----------
|
||||
*/
|
||||
typedef enum StatMsgType
|
||||
{
|
||||
PGSTAT_MTYPE_DUMMY,
|
||||
PGSTAT_MTYPE_BESTART,
|
||||
PGSTAT_MTYPE_BETERM,
|
||||
PGSTAT_MTYPE_ACTIVITY,
|
||||
PGSTAT_MTYPE_TABSTAT,
|
||||
PGSTAT_MTYPE_TABPURGE,
|
||||
PGSTAT_MTYPE_DROPDB,
|
||||
@ -56,8 +54,6 @@ typedef struct PgStat_MsgHdr
|
||||
{
|
||||
StatMsgType m_type;
|
||||
int m_size;
|
||||
int m_backendid;
|
||||
int m_procpid;
|
||||
} PgStat_MsgHdr;
|
||||
|
||||
/* ----------
|
||||
@ -68,6 +64,17 @@ typedef struct PgStat_MsgHdr
|
||||
*/
|
||||
#define PGSTAT_MSG_PAYLOAD (1000 - sizeof(PgStat_MsgHdr))
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgDummy A dummy message, ignored by the collector
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgDummy
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
} PgStat_MsgDummy;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_TableEntry Per-table info in a MsgTabstat
|
||||
*
|
||||
@ -96,96 +103,6 @@ typedef struct PgStat_TableEntry
|
||||
PgStat_Counter t_blocks_hit;
|
||||
} PgStat_TableEntry;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgDummy A dummy message, ignored by the collector
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgDummy
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
char m_dummy[512];
|
||||
} PgStat_MsgDummy;
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgBestart Sent by the backend on startup
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgBestart
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
Oid m_databaseid;
|
||||
Oid m_userid;
|
||||
SockAddr m_clientaddr;
|
||||
} PgStat_MsgBestart;
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgBeterm Sent by the postmaster after backend exit
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgBeterm
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
} PgStat_MsgBeterm;
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgAutovacStart Sent by the autovacuum daemon to signal
|
||||
* that a database is going to be processed
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgAutovacStart
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
Oid m_databaseid;
|
||||
TimestampTz m_start_time;
|
||||
} PgStat_MsgAutovacStart;
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgVacuum Sent by the backend or autovacuum daemon
|
||||
* after VACUUM or VACUUM ANALYZE
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgVacuum
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
Oid m_databaseid;
|
||||
Oid m_tableoid;
|
||||
bool m_analyze;
|
||||
bool m_autovacuum;
|
||||
TimestampTz m_vacuumtime;
|
||||
PgStat_Counter m_tuples;
|
||||
} PgStat_MsgVacuum;
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgAnalyze Sent by the backend or autovacuum daemon
|
||||
* after ANALYZE
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgAnalyze
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
Oid m_databaseid;
|
||||
Oid m_tableoid;
|
||||
bool m_autovacuum;
|
||||
TimestampTz m_analyzetime;
|
||||
PgStat_Counter m_live_tuples;
|
||||
PgStat_Counter m_dead_tuples;
|
||||
} PgStat_MsgAnalyze;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgActivity Sent by the backends when they start
|
||||
* to parse a query.
|
||||
* ----------
|
||||
*/
|
||||
#define PGSTAT_ACTIVITY_SIZE PGSTAT_MSG_PAYLOAD
|
||||
|
||||
typedef struct PgStat_MsgActivity
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
char m_cmd_str[PGSTAT_ACTIVITY_SIZE];
|
||||
} PgStat_MsgActivity;
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgTabstat Sent by the backend to report table
|
||||
* and buffer access statistics.
|
||||
@ -205,6 +122,7 @@ typedef struct PgStat_MsgTabstat
|
||||
PgStat_TableEntry m_entry[PGSTAT_NUM_TABENTRIES];
|
||||
} PgStat_MsgTabstat;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgTabpurge Sent by the backend to tell the collector
|
||||
* about dead tables.
|
||||
@ -247,6 +165,53 @@ typedef struct PgStat_MsgResetcounter
|
||||
} PgStat_MsgResetcounter;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgAutovacStart Sent by the autovacuum daemon to signal
|
||||
* that a database is going to be processed
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgAutovacStart
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
Oid m_databaseid;
|
||||
TimestampTz m_start_time;
|
||||
} PgStat_MsgAutovacStart;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgVacuum Sent by the backend or autovacuum daemon
|
||||
* after VACUUM or VACUUM ANALYZE
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgVacuum
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
Oid m_databaseid;
|
||||
Oid m_tableoid;
|
||||
bool m_analyze;
|
||||
bool m_autovacuum;
|
||||
TimestampTz m_vacuumtime;
|
||||
PgStat_Counter m_tuples;
|
||||
} PgStat_MsgVacuum;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgAnalyze Sent by the backend or autovacuum daemon
|
||||
* after ANALYZE
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgAnalyze
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
Oid m_databaseid;
|
||||
Oid m_tableoid;
|
||||
bool m_autovacuum;
|
||||
TimestampTz m_analyzetime;
|
||||
PgStat_Counter m_live_tuples;
|
||||
PgStat_Counter m_dead_tuples;
|
||||
} PgStat_MsgAnalyze;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_Msg Union over all possible messages.
|
||||
* ----------
|
||||
@ -255,8 +220,6 @@ typedef union PgStat_Msg
|
||||
{
|
||||
PgStat_MsgHdr msg_hdr;
|
||||
PgStat_MsgDummy msg_dummy;
|
||||
PgStat_MsgBestart msg_bestart;
|
||||
PgStat_MsgActivity msg_activity;
|
||||
PgStat_MsgTabstat msg_tabstat;
|
||||
PgStat_MsgTabpurge msg_tabpurge;
|
||||
PgStat_MsgDropdb msg_dropdb;
|
||||
@ -275,19 +238,15 @@ typedef union PgStat_Msg
|
||||
* ------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define PGSTAT_FILE_FORMAT_ID 0x01A5BC95
|
||||
#define PGSTAT_FILE_FORMAT_ID 0x01A5BC96
|
||||
|
||||
/* ----------
|
||||
* PgStat_StatDBEntry The collector's data per database
|
||||
*
|
||||
* Note: n_backends is not maintained within the collector. It's computed
|
||||
* when a backend reads the stats file for use.
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_StatDBEntry
|
||||
{
|
||||
Oid databaseid;
|
||||
int n_backends;
|
||||
PgStat_Counter n_xact_commit;
|
||||
PgStat_Counter n_xact_rollback;
|
||||
PgStat_Counter n_blocks_fetched;
|
||||
@ -302,35 +261,6 @@ typedef struct PgStat_StatDBEntry
|
||||
} PgStat_StatDBEntry;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_StatBeEntry The collector's data per backend
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_StatBeEntry
|
||||
{
|
||||
/* An entry is non-empty iff procpid > 0 */
|
||||
int procpid;
|
||||
TimestampTz start_timestamp;
|
||||
TimestampTz activity_start_timestamp;
|
||||
|
||||
/*
|
||||
* These fields are initialized by the BESTART message. If we have
|
||||
* received messages from a backend before we have received its BESTART,
|
||||
* these fields will be uninitialized: userid and databaseid will be
|
||||
* InvalidOid, and clientaddr will be undefined.
|
||||
*/
|
||||
Oid userid;
|
||||
Oid databaseid;
|
||||
SockAddr clientaddr;
|
||||
|
||||
/*
|
||||
* activity[] must be last in the struct, because we only write as much
|
||||
* of it as needed to the stats file.
|
||||
*/
|
||||
char activity[PGSTAT_ACTIVITY_SIZE];
|
||||
} PgStat_StatBeEntry;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_StatTabEntry The collector's data per table (or index)
|
||||
* ----------
|
||||
@ -338,10 +268,6 @@ typedef struct PgStat_StatBeEntry
|
||||
typedef struct PgStat_StatTabEntry
|
||||
{
|
||||
Oid tableid;
|
||||
TimestampTz vacuum_timestamp; /* user initiated vacuum */
|
||||
TimestampTz autovac_vacuum_timestamp; /* autovacuum initiated */
|
||||
TimestampTz analyze_timestamp; /* user initiated */
|
||||
TimestampTz autovac_analyze_timestamp; /* autovacuum initiated */
|
||||
|
||||
PgStat_Counter numscans;
|
||||
|
||||
@ -358,27 +284,81 @@ typedef struct PgStat_StatTabEntry
|
||||
|
||||
PgStat_Counter blocks_fetched;
|
||||
PgStat_Counter blocks_hit;
|
||||
|
||||
TimestampTz vacuum_timestamp; /* user initiated vacuum */
|
||||
TimestampTz autovac_vacuum_timestamp; /* autovacuum initiated */
|
||||
TimestampTz analyze_timestamp; /* user initiated */
|
||||
TimestampTz autovac_analyze_timestamp; /* autovacuum initiated */
|
||||
} PgStat_StatTabEntry;
|
||||
|
||||
|
||||
/* ----------
|
||||
* Shared-memory data structures
|
||||
* ----------
|
||||
*/
|
||||
|
||||
/* Max length of st_activity string ... perhaps replace with a GUC var? */
|
||||
#define PGBE_ACTIVITY_SIZE 1024
|
||||
|
||||
/* ----------
|
||||
* PgBackendStatus
|
||||
*
|
||||
* Each live backend maintains a PgBackendStatus struct in shared memory
|
||||
* showing its current activity. (The structs are allocated according to
|
||||
* BackendId, but that is not critical.) Note that the collector process
|
||||
* has no involvement in, or even access to, these structs.
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgBackendStatus
|
||||
{
|
||||
/*
|
||||
* To avoid locking overhead, we use the following protocol: a backend
|
||||
* increments st_changecount before modifying its entry, and again after
|
||||
* finishing a modification. A would-be reader should note the value
|
||||
* of st_changecount, copy the entry into private memory, then check
|
||||
* st_changecount again. If the value hasn't changed, and if it's even,
|
||||
* the copy is valid; otherwise start over. This makes updates cheap
|
||||
* while reads are potentially expensive, but that's the tradeoff we want.
|
||||
*/
|
||||
int st_changecount;
|
||||
|
||||
/* The entry is valid iff st_procpid > 0, unused if st_procpid == 0 */
|
||||
int st_procpid;
|
||||
|
||||
/* Times of backend process start and current activity start */
|
||||
TimestampTz st_proc_start_timestamp;
|
||||
TimestampTz st_activity_start_timestamp;
|
||||
|
||||
/* Database OID, owning user's OID, connection client address */
|
||||
Oid st_databaseid;
|
||||
Oid st_userid;
|
||||
SockAddr st_clientaddr;
|
||||
|
||||
/* current command string; MUST be null-terminated */
|
||||
char st_activity[PGBE_ACTIVITY_SIZE];
|
||||
} PgBackendStatus;
|
||||
|
||||
|
||||
/* ----------
|
||||
* GUC parameters
|
||||
* ----------
|
||||
*/
|
||||
extern bool pgstat_collect_startcollector;
|
||||
extern bool pgstat_collect_resetonpmstart;
|
||||
extern bool pgstat_collect_querystring;
|
||||
extern bool pgstat_collect_tuplelevel;
|
||||
extern bool pgstat_collect_blocklevel;
|
||||
extern bool pgstat_collect_querystring;
|
||||
|
||||
|
||||
/* ----------
|
||||
* Functions called from postmaster
|
||||
* ----------
|
||||
*/
|
||||
extern Size BackendStatusShmemSize(void);
|
||||
extern void CreateSharedBackendStatus(void);
|
||||
|
||||
extern void pgstat_init(void);
|
||||
extern int pgstat_start(void);
|
||||
extern void pgstat_beterm(int pid);
|
||||
extern void pgstat_reset_all(void);
|
||||
|
||||
#ifdef EXEC_BACKEND
|
||||
@ -391,21 +371,23 @@ extern void PgstatCollectorMain(int argc, char *argv[]);
|
||||
* Functions called from backends
|
||||
* ----------
|
||||
*/
|
||||
extern void pgstat_bestart(void);
|
||||
|
||||
extern void pgstat_ping(void);
|
||||
extern void pgstat_report_activity(const char *what);
|
||||
|
||||
extern void pgstat_report_tabstat(void);
|
||||
extern void pgstat_vacuum_tabstat(void);
|
||||
extern void pgstat_drop_relation(Oid relid);
|
||||
|
||||
extern void pgstat_reset_counters(void);
|
||||
|
||||
extern void pgstat_report_autovac(Oid dboid);
|
||||
extern void pgstat_report_vacuum(Oid tableoid, bool shared,
|
||||
bool analyze, PgStat_Counter tuples);
|
||||
extern void pgstat_report_analyze(Oid tableoid, bool shared,
|
||||
PgStat_Counter livetuples,
|
||||
PgStat_Counter deadtuples);
|
||||
extern void pgstat_vacuum_tabstat(void);
|
||||
extern void pgstat_drop_relation(Oid relid);
|
||||
|
||||
extern void pgstat_reset_counters(void);
|
||||
extern void pgstat_bestart(void);
|
||||
extern void pgstat_report_activity(const char *what);
|
||||
|
||||
extern void pgstat_initstats(PgStat_Info *stats, Relation rel);
|
||||
|
||||
@ -492,7 +474,7 @@ extern void pgstat_count_xact_rollback(void);
|
||||
*/
|
||||
extern PgStat_StatDBEntry *pgstat_fetch_stat_dbentry(Oid dbid);
|
||||
extern PgStat_StatTabEntry *pgstat_fetch_stat_tabentry(Oid relid);
|
||||
extern PgStat_StatBeEntry *pgstat_fetch_stat_beentry(int beid);
|
||||
extern PgBackendStatus *pgstat_fetch_stat_beentry(int beid);
|
||||
extern int pgstat_fetch_stat_numbackends(void);
|
||||
|
||||
#endif /* PGSTAT_H */
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/storage/procarray.h,v 1.8 2006/03/05 15:59:00 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/include/storage/procarray.h,v 1.9 2006/06/19 01:51:22 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -29,7 +29,6 @@ extern TransactionId GetOldestXmin(bool allDbs);
|
||||
extern PGPROC *BackendPidGetProc(int pid);
|
||||
extern int BackendXidGetPid(TransactionId xid);
|
||||
extern bool IsBackendPid(int pid);
|
||||
extern int *GetAllBackendPids(void);
|
||||
extern bool DatabaseHasActiveBackends(Oid databaseId, bool ignoreMyself);
|
||||
|
||||
extern int CountActiveBackends(void);
|
||||
|
Loading…
Reference in New Issue
Block a user