PostgreSQL 原生的資料庫監控功能,大多散布在各式系統資料表裡面;此外,有些內建系統表還沒有設置,有時也需要額外安裝,像是 pg_stat_statements;更甚者,可能還需要確認發行版有沒有支援(Dynamic Tracing)。截至 9.5 版,還沒有原生於 PostgreSQL 簡單易用的整合的效能監控工具。
對於資深的 Oracle 使用者,常常會提到 Oracle 有很多效能監控工具,像是常會提到 Oracle Statspack / Oracle AWR,並尋找在 PostgreSQL 裡面相似的工具。
EnterpriseDB 在其企業版資料庫中提供一個叫 Dynamic Runtime Instrumentation Tools Architecture(EDB DRITA)的功能,可以用來衡量資料庫運行效能的紀錄。DRITA 其實是將現有的 PostgreSQL 資料庫效能監控工具(例如 pg_stat_statements,或是 pg_buffercache),並以一個 Oracle 資料庫的用戶所習慣的統合性報表格式呈現。
DRITA 功能不用像 Oracle Statspack/AWR 一樣,先設置專屬空間存放,而是直接存放在同一個 Postgres Instance 裡。
DRITA 的使用方法有兩種:
(1) 在一個 Session 當中,執行兩次系統資訊收集(起、迄 DRITA 快照),然後用這兩次快照,產生快照間資料庫活動的報告(使用上,與 Oracle Statspack 相仿)
(2) 在一段期間中,產生些許系統資訊快照,然後依照需要,選取數個相連續的快照,彙整出資料庫活動的報告
在此以 EDB Postgres Advanced Server 9.5 進行演練:
首先,要啟用 DRITA 功能,有兩種方式。
- 啟用 postgresql.conf 裡面的參數 timed_statistics(on),並重新載入;
- 這個參數也可以只在一個 Session 當中啟用,如下列指令:
edb=# SET timed_statistics TO true; SET
用法:
(1) 在一個 Session 中執行:
- 手動執行一次進行 DRITA 快照(第一次)
edb=# SELECT * FROM edbsnap(); edbsnap ---------------------- Statement processed. (1 row)
- 一些資料庫活動:如,執行一個指令(計算階乘)
edb=# select 10000!;
- 等到所需要觀察、了解的資料庫活動告一段落,再執行一次 DRITA 快照
edb=# SELECT edbsnap(); edbsnap ---------------------- Statement processed. (1 row)
- 先來觀察一下,目前累積的快照列表
edb=# SELECT get_snaps(); get_snaps ----------------------------- 1 20-JUL-16 07:58:24.869467 2 20-JUL-16 08:10:30.570358 (2 rows)
上面便已經有足夠快照,來列出 Wait Event 報告了。
這個部份,有三種報告模式:
- sys_rpt(起始快照ID, 末快照ID, 列舉筆數) 用來列舉 wait events
- sessid_rpt(起始快照ID, 末快照ID, pid) 用來列舉某個 Process ID 活動時造成的 wait events
- sesshist_rpt(快照ID,pid) 用來列舉指定快照中,紀錄到的某 Process ID 活動
以下列出執行範例,指定當前 Session 的活動:
edb=# SELECT sys_rpt(1,2,5); sys_rpt ----------------------------------------------------------------------------- WAIT NAME COUNT WAIT TIME % WAIT --------------------------------------------------------------------------- db file read 70 0.078344 61.42 query plan 14 0.048646 38.14 db file extend 52 0.000559 0.44 (5 rows) edb=# SELECT sessid_rpt(1,2,pid) FROM pg_stat_activity WHERE pid = pg_backend_pid(); sessid_rpt ----------------------------------------------------------------------------------------------------- ID USER WAIT NAME COUNT TIME(ms) % WAIT SES % WAIT ALL --------------------------------------------------------------------------------------------------- 1919 enterprise db file read 50 0.034929 70.32 70.32 1919 enterprise query plan 14 0.014214 28.62 28.62 1919 enterprise db file extend 50 0.000528 1.06 1.06 (5 rows) edb=# SELECT sesshist_rpt(1,pid) FROM pg_stat_activity WHERE pid = pg_backend_pid(); sesshist_rpt ----------------------------------------------------------------------------------------------------------------- ID USER SEQ WAIT NAME ELAPSED(ms) File Name # of Blk Sum of Blks --------------------------------------------------------------------------------------------------- 1919 enterprise 1 query plan 9 0 N/A 0 0 1919 enterprise 1 query plan 9 0 edb_password_history 0 0 1919 enterprise 1 query plan 9 0 edb_password_history 0 0 1919 enterprise 1 query plan 9 0 edb_password_history 0 0 1919 enterprise 1 query plan 9 0 edb_profile 0 0 (... 以下略)
註:
除了上述函數觀看 Wait event 之外,EnterpriseDB 裡有提供對應 Oracle 資料庫中 V$SYSTEM_EVENT、V$SESSION_WAIT 以及 V$SESSION_WAIT_HISTORY 的 View,分別稱作 edb$system_waits、edb$session_waits 及 edb$session_wait_history,用來觀察當前 Wait event 狀況。相關資訊參考 8.12 Catalog Views 以及 8.11 Event Descriptions
|
(2) 看總結報告
以下函數,可以指定中長期累積 DRITA 快照報告
edb=# SELECT edbreport(1, 4);\g /path/to/output/file
在 psql 界面下,上面會把報告內容輸出到 /path/to/output/file 所指定檔案位置。
以下列舉出 edbreport(起始快照ID, 末快照ID) 報告內容類型:
Size of the current database
Tablespace: list, size and owner
Schema: list, size and owner
Top 10 Relations by pages
Top 10 Indexes by pages
Top 10 Relations by DML
DATA from pg_stat_database
DATA from pg_buffercache not included because pg_buffercache is not installed
DATA from pg_stat_all_tables ordered by seq scan
DATA from pg_stat_all_tables ordered by rel tup read
DATA from pg_statio_all_tables
DATA from pg_stat_all_indexes
DATA from pg_statio_all_indexes
System Wait Information
Database Parameters from postgresql.conf
|
報表內容描述
Size of the current database
Tablespace: list, size and owner
Schema: list, size and owner
|
當前連線資料庫的 database、tablespace、schema 的大小
|
Top 10 Relations by pages
|
大小為前十大的資料表格
|
Top 10 Indexes by pages
|
大小為前十大的 Index 表
|
Top 10 Relations by DML
|
資料更動活動最頻繁的十個資料表格
|
DATA from pg_stat_database
|
目前資料庫資訊:當前連線數、交易活動的 Commit/Rollback 次數、硬碟 Blocks 存取次數資訊、Buffer Cache 的 Hit Ratio
|
DATA from pg_buffercache
|
列出佔前十多 Buffer Cache 大小的表格
|
DATA from pg_stat_all_tables ordered by seq scan
|
依照 Sequential Scan 次數排列的表格列表
|
DATA from pg_stat_all_tables ordered by rel tup read
| |
DATA from pg_statio_all_tables
|
表格在硬碟上的 Blocks 被讀取的數量的資訊
|
DATA from pg_stat_all_indexes
|
Index 被使用的次數資訊
|
DATA from pg_statio_all_indexes
|
Index 表在硬碟上的 Blocks 被讀取的數量的資訊
|
System Wait Information
|
Wait Events 的類型發生的次數
|
Database Parameters from postgresql.conf
|
當前 postgresql.conf 設定檔參數列表
|
在這裡列出可以注意的幾點:
- DRITA 報告是針對一個 PostgreSQL Database 收集的,並不是收集整個 PostgreSQL Instance 的資訊。
- 這份報表,主要收集的是表格與 Index 的資訊
- 列舉 postgresql.conf 當前參數,可以由以下兩種方式達成
edb=# SELECT name,unit,boot_val,setting,current_setting(name) FROM pg_settings;
edb=# SHOW all;
- 上面標明紅色的部份「DATA from pg_buffercache not included because pg_buffercache is not installed」,說明 pg_buffercache 這個套件沒有被啟用;需要的話,在收集 DRITA 快照前,先用以下指令,便能夠啟用它:
edb=# CREATE EXTENSION pg_buffercache;
- 除了 edbreport 函數之外,EDB 再特別對 DRITA 報告內五類資訊,提供能夠單獨取得報告的函數,並且能用分別五個函數去存取:
子報表函數
|
對應 edbreport 報表部份
|
stat_db_rpt
|
DATA from pg_stat_database
|
stat_tables_rpt
|
DATA from pg_stat_all_tables ordered by seq scan
|
DATA from pg_stat_all_tables ordered by rel tup read
| |
statio_tables_rpt
|
DATA from pg_statio_all_tables
|
stat_indexes_rpt
|
DATA from pg_stat_all_indexes
|
statio_indexes_rpt
|
DATA from pg_statio_all_indexes
|
以上大致演練過 DRITA 工具的功能了。最後是清理掉 DRITA 快照資料的方式:
- 指定清掉某個範圍的 DRITA 快照:
edb=# SELECT purgesnap(1, 2); purgesnap ------------------------------------ Snapshots in range 1 to 2 deleted. (1 row)
- 清除所有 DRITA 快照(重設 DRITA 資料)
edb=# SELECT truncsnap(); truncsnap ---------------------- Snapshots truncated. (1 row)
與 Oracle Statspack / Oracle AWR 的功能相比較,就我目前所知,目前還沒有像 Oracle AWR 一樣,自動產生快照以及設定快照保存策略等功能。有需要的話,就得自己去設置定時收集與清理 DRITA 快照了。
報表內容,目前(9.5 版)與 Oracle 的工具相比,還差一點東西:例如 top sql(吃資源的 SQL 指令)、資料庫參數的使用狀況(例如,Oracle 上能顯示 SGA 及 PGA 的記憶體使用狀況,但在 EDB 裡面沒有這種對等資訊)等;此外, DRITA 功能也沒有紀錄 OS 功能資訊,這需要額外工具才行(例如 Postgres Enterprise Manager 或 Open PostgreSQL Monitoring 等)。
參考:
使用手冊
其他使用筆記
其他資訊:
在 PostgreSQL 9.6 原生版,將要有內建的 wait event 監控功能,在下面便是一篇相關功能介紹
什麼是Oracle Statspack/Oracle AWR
沒有留言:
張貼留言