⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 monitoring.sgml

📁 PostgreSQL 8.1.4的源码 适用于Linux下的开源数据库系统
💻 SGML
📖 第 1 页 / 共 2 页
字号:
<!--$PostgreSQL: pgsql/doc/src/sgml/monitoring.sgml,v 1.29 2005/10/06 02:29:06 tgl Exp $--><chapter id="monitoring"> <title>Monitoring Database Activity</title> <indexterm zone="monitoring">  <primary>monitoring</primary>  <secondary>database activity</secondary> </indexterm> <indexterm zone="monitoring">  <primary>database activity</primary>  <secondary>monitoring</secondary> </indexterm> <para>  A database administrator frequently wonders, <quote>What is the system  doing right now?</quote>  This chapter discusses how to find that out. </para>  <para>   Several tools are available for monitoring database activity and   analyzing performance.  Most of this chapter is devoted to describing   <productname>PostgreSQL</productname>'s statistics collector,   but one should not neglect regular Unix monitoring programs such as   <command>ps</>, <command>top</>, <command>iostat</>, and <command>vmstat</>.   Also, once one has identified a   poorly-performing query, further investigation may be needed using   <productname>PostgreSQL</productname>'s <xref linkend="sql-explain"   endterm="sql-explain-title"> command.   <xref linkend="using-explain"> discusses <command>EXPLAIN</>   and other methods for understanding the behavior of an individual   query.  </para> <sect1 id="monitoring-ps">  <title>Standard Unix Tools</Title>  <indexterm zone="monitoring-ps">   <primary>ps</primary>   <secondary>to monitor activity</secondary>  </indexterm>  <para>   On most platforms, <productname>PostgreSQL</productname> modifies its   command title as reported by <command>ps</>, so that individual server   processes can readily be identified.  A sample display is<screen>$ ps auxww | grep ^postgrespostgres   960  0.0  1.1  6104 1480 pts/1    SN   13:17   0:00 postmaster -ipostgres   963  0.0  1.1  7084 1472 pts/1    SN   13:17   0:00 postgres: stats buffer process   postgres   965  0.0  1.1  6152 1512 pts/1    SN   13:17   0:00 postgres: stats collector process   postgres   998  0.0  2.3  6532 2992 pts/1    SN   13:18   0:00 postgres: tgl runbug 127.0.0.1 idlepostgres  1003  0.0  2.4  6532 3128 pts/1    SN   13:19   0:00 postgres: tgl regression [local] SELECT waitingpostgres  1016  0.1  2.4  6532 3080 pts/1    SN   13:19   0:00 postgres: tgl regression [local] idle in transaction</screen>   (The appropriate invocation of <command>ps</> varies across different   platforms, as do the details of what is shown.  This example is from a   recent Linux system.)  The first process listed here is the   <application>postmaster</>, the master server process.  The command arguments   shown for it are the same ones given when it was launched.  The next two   processes implement the statistics collector, which will be described in   detail in the next section.  (These will not be present if you have set   the system not to start the statistics collector.)  Each of the remaining   processes is a server process handling one client connection.  Each such   process sets its command line display in the form<screen>postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <replaceable>activity</></screen>  The user, database, and connection source host items remain the same for  the life of the client connection, but the activity indicator changes.  The activity may be <literal>idle</> (i.e., waiting for a client command),  <literal>idle in transaction</> (waiting for client inside a <command>BEGIN</> block),  or a command type name such as <literal>SELECT</>.  Also,  <literal>waiting</> is attached if the server process is presently waiting  on a lock held by another server process.  In the above example we can infer  that process 1003 is waiting for process 1016 to complete its transaction and  thereby release some lock or other.  </para>  <tip>  <para>  <productname>Solaris</productname> requires special handling. You must  use <command>/usr/ucb/ps</command>, rather than  <command>/bin/ps</command>. You also must use two <option>w</option>  flags, not just one. In addition, your original invocation of the  <command>postmaster</command> command must have a shorter  <command>ps</command> status display than that provided by each  server process.  If you fail to do all three things, the <command>ps</>  output for each server process will be the original <command>postmaster</>  command line.  </para>  </tip> </sect1> <sect1 id="monitoring-stats">  <title>The Statistics Collector</Title>  <indexterm zone="monitoring-stats">   <primary>statistics</primary>  </indexterm>  <para>   <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.  </para> <sect2 id="monitoring-stats-setup">  <title>Statistics Collection Configuration</Title>  <para>   Since collection of statistics adds some overhead to query execution,   the system can be configured to collect or not collect information.   This is controlled by configuration parameters that are normally set in   <filename>postgresql.conf</>.  (See <xref linkend="runtime-config"> for   details about setting configuration parameters.)  </para>  <para>   The parameter <xref linkend="guc-stats-start-collector"> must be   set to <literal>true</> for the statistics collector to be launched   at all.  This is the default and recommended setting, but it may be   turned off if you have no interest in statistics and want to   squeeze out every last drop of overhead.  (The savings is likely to   be small, however.)  Note that this option cannot be changed while   the server is running.  </para>  <para>   The parameters <xref linkend="guc-stats-command-string">,   <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.   Normally these parameters are set in <filename>postgresql.conf</>   so that they apply to all server processes, but it is possible to   turn them on or off in individual sessions using the <xref   linkend="sql-set" endterm="sql-set-title"> command.  (To prevent   ordinary users from hiding their activity from the administrator,   only superusers are allowed to change these parameters with   <command>SET</>.)  </para>   <note>    <para>     Since the parameters <varname>stats_command_string</varname>,     <varname>stats_block_level</varname>, and     <varname>stats_row_level</varname> default to <literal>false</>,     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     additional run-time overhead.    </para>   </note> </sect2> <sect2 id="monitoring-stats-views">  <title>Viewing Collected Statistics</Title>  <para>   Several predefined views, listed in <xref   linkend="monitoring-stats-views-table">, are available to show the results   of statistics collection.  Alternatively, one can   build custom views using the underlying statistics functions.  </para>  <para>   When using the statistics to monitor current activity, it is important   to realize that the information does not update instantaneously.   Each individual server process transmits new block and row access counts to   the collector just before going idle; so a query or transaction still in   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.  </para>  <para>   Another important point is that when a server process is asked to display   any of these statistics, it first fetches the most recent report emitted by   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.   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   results with each query, be sure to do the queries outside any transaction   block.  </para>  <table id="monitoring-stats-views-table">   <title>Standard Statistics Views</title>   <tgroup cols="2">    <thead>     <row>      <entry>View Name</entry>      <entry>Description</entry>     </row>    </thead>    <tbody>     <row>      <entry><structname>pg_stat_activity</></entry>      <entry>One row per server process, showing database OID, database name,      process <acronym>ID</>, user OID, user name, current query, time at      which the current query began execution, time at which the process      was started, and client's address and port number.  The columns      that report data on the current query are only available if the      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>     </row>     <row>      <entry><structname>pg_stat_database</></entry>      <entry>One row per database, showing database OID, database name,      number of active server processes connected to that database,      number of transactions committed and rolled back in that database,      total disk blocks read, and total buffer hits (i.e., block      read requests avoided by finding the block already in buffer cache).     </entry>     </row>     <row>      <entry><structname>pg_stat_all_tables</></entry>      <entry>For each table in the current database (including TOAST tables),      the table OID, schema and table name, number of sequential      scans initiated, number of live rows fetched by sequential      scans, number of index scans initiated (over all indexes      belonging to the table), number of live rows fetched by index      scans,      and numbers of row insertions, updates, and deletions.</entry>     </row>     <row>      <entry><structname>pg_stat_sys_tables</></entry>      <entry>Same as <structname>pg_stat_all_tables</>, except that only      system tables are shown.</entry>     </row>     <row>      <entry><structname>pg_stat_user_tables</></entry>      <entry>Same as <structname>pg_stat_all_tables</>, except that only user      tables are shown.</entry>     </row>     <row>      <entry><structname>pg_stat_all_indexes</></entry>      <entry>For each index in the current database,      the table and index OID, schema, table and index name,      number of index scans initiated on that index, number of      index entries returned by index scans, and number of live table rows      fetched by simple index scans using that index.      </entry>     </row>     <row>      <entry><structname>pg_stat_sys_indexes</></entry>      <entry>Same as <structname>pg_stat_all_indexes</>, except that only      indexes on system tables are shown.</entry>     </row>     <row>      <entry><structname>pg_stat_user_indexes</></entry>      <entry>Same as <structname>pg_stat_all_indexes</>, except that only      indexes on user tables are shown.</entry>     </row>     <row>      <entry><structname>pg_statio_all_tables</></entry>      <entry>For each table in the current database (including TOAST tables),      the table OID, schema and table name, number of disk      blocks read from that table, number of buffer hits, numbers of      disk blocks read and buffer hits in all indexes of that table,      numbers of disk blocks read and buffer hits from that table's      auxiliary TOAST table (if any), and numbers of disk blocks read      and buffer hits for the TOAST table's index.      </entry>     </row>     <row>      <entry><structname>pg_statio_sys_tables</></entry>      <entry>Same as <structname>pg_statio_all_tables</>, except that only      system tables are shown.</entry>     </row>     <row>      <entry><structname>pg_statio_user_tables</></entry>      <entry>Same as <structname>pg_statio_all_tables</>, except that only      user tables are shown.</entry>     </row>     <row>      <entry><structname>pg_statio_all_indexes</></entry>      <entry>For each index in the current database,      the table and index OID, schema, table and index name,      numbers of disk blocks read and buffer hits in that index.      </entry>     </row>     <row>      <entry><structname>pg_statio_sys_indexes</></entry>      <entry>Same as <structname>pg_statio_all_indexes</>, except that only      indexes on system tables are shown.</entry>     </row>     <row>      <entry><structname>pg_statio_user_indexes</></entry>      <entry>Same as <structname>pg_statio_all_indexes</>, except that only      indexes on user tables are shown.</entry>     </row>     <row>      <entry><structname>pg_statio_all_sequences</></entry>      <entry>For each sequence object in the current database,      the sequence OID, schema and sequence name,      numbers of disk blocks read and buffer hits in that sequence.      </entry>     </row>     <row>      <entry><structname>pg_statio_sys_sequences</></entry>      <entry>Same as <structname>pg_statio_all_sequences</>, except that only      system sequences are shown.  (Presently, no system sequences are defined,      so this view is always empty.)</entry>     </row>     <row>      <entry><structname>pg_statio_user_sequences</></entry>      <entry>Same as <structname>pg_statio_all_sequences</>, except that only      user sequences are shown.</entry>     </row>    </tbody>   </tgroup>  </table>  <para>   The per-index statistics are particularly useful to determine which   indexes are being used and how effective they are.  </para>  <para>   Beginning in <productname>PostgreSQL</productname> 8.1, indexes can be   used either directly or via <quote>bitmap scans</>.  In a bitmap scan   the output of several indexes can be combined via AND or OR rules;   so it is difficult to associate individual heap row fetches    with specific indexes when a bitmap scan is used.  Therefore, a bitmap   scan increments the

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -