pg-AWR工具(pg_profile)
什么是pg_profile
- 在postgres中,當遇到問題時,可能需要回顧不止一件事情來分析數據庫或者整個集群,包括索引,I/O,CPU等
- pg_profile擴展是基於postgres的標准統計視圖。它類似於Oracle AWR架構,和Oracle一樣,它在指定時間生成快照,並切提供html格式來解釋快照之間的統計數據
配置postgresql.conf
- pg_profile配置
track_activities = on
track_counts = on
track_io_timing = on
track_functions = all/p1
這四個參數建議打開,不然使用會有一些影響。其中track_activities和track_counts默認是打開的。track_activities允許監控當前被任意服務器進程執行的命令。track_counts控制是否收集關於表和索引訪問的統計信息。track_io_timing啟用對塊讀寫次數的監控。參數track_functions啟用對用戶定義函數使用的跟蹤。
- pg_stat_statements配置
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.max = 10000
pg_stat_statements.track = 'top'
pg_stat_statements.save = off
pg_stat_statements.max是跟蹤語句的最大數目(即pg_stat_statements視圖中行的最大數量)。如果語句超過這個數量,最少被執行的語句的信息將會被丟棄。作者說此參數的設置太低可能會導致在抽取樣本之前會清除某些語句的統計信息。建議設置大一些。當前參數我們設置的10000,足夠使用。
pg_stat_statements.track指定top可以跟蹤頂層語句(直接由客戶端發出的語句),指定all還可以跟蹤嵌套的語句(例如在函數中調用的語句),指定none則禁用語句統計信息收集。默認值是top。如果你設置的是all,作者說可能會影響報告中%Totalfields字段的精確值。
上面參數修改稍為簡單,因為基本上都是默認打開的。只有少數沒開,打開也不需要重啟。
下載並安裝pg_profile
1、安裝比較簡單,可以直接將壓縮包解壓放入postgres的extension擴展目錄下面即可
tar xzf pg_profile--0.3.4.tar.gz --directory $(pg_config --sharedir)/extension
2、安裝擴展
這里有兩種方式安裝,一種是公共模式安裝,這種安裝方式最簡單。第二種是獨立Schema安裝,這種安裝將在自己創建的Schema中建自己的表,視圖,序列和函數,可以和其他用戶有效的進行隔離。
postgres=# CREATE EXTENSION dblink;
postgres=# CREATE EXTENSION pg_stat_statements;
postgres=# CREATE SCHEMA profile;
postgres=# CREATE EXTENSION pg_profile SCHEMA profile;
默認pg_profile需要使用dblink和pg_stat_statements擴展包,這兩個屬於系統自帶插件,可選插件是pg_stat_kcache
還可以安裝pg_stat_kcache數據,提供有關語句CPU使用率和文件系統負載的信息
創建快照生成報告
執行函數創建快照
postgres=# select * from take_sample();
server | result | elapsed
--------+--------+-------------
local | OK | 00:00:02.98
(1 row)
--也可以調用snapshot()來生成快照,pg_profile 0.1.2開始snapshot()函數重命名為take_sample()
執行完之后可以調用show_samples()函數,查看生成的快照
postgres=# select show_samples();
show_samples
---------------------------------
(1,"2021-11-09 11:47:01+08",,,)
(2,"2021-11-09 14:18:40+08",,,)
(3,"2021-11-10 13:56:55+08",,,)
(4,"2021-11-10 13:58:55+08",,,)
(5,"2021-11-10 14:15:58+08",,,)
(6,"2021-11-10 14:38:38+08",,,)
(7,"2021-11-10 15:50:53+08",,,)
(8,"2021-11-10 15:52:34+08",,,)
(9,"2021-11-10 16:37:18+08",,,)
(9 rows)
總共9個快照,執行get_report命令,任意兩個時間段就可以生成AWR報告,如果要生產對比報告,可以使用get_diffreport命令
psql -qtc "select profile.get_report(1,2)" --output awr_report_postgres_1_2.html
每半個小時生成快照的方法:
*/30 * * * * psql -c 'SELECT profile.snapshot()' > tmp/pg_awr.log 2>&1
瀏覽報告
- 報告總共有六個部分
- 第一部分是服務器統計,包含了整個數據庫再此快照期間的統計信息,例如事務數,內存名中率,元組的操作統計數據,以及數據庫調用次數數據庫聚簇的統計信息,表空間增長等等
- 第二部分是TopSQL,包括執行時長,次數,執行消耗的io,以及邏輯讀等topN的排序,還包括完整的sql,根據Query ID可以查看具體的SQL。這里根據rows和executions都是10208可能是同一個事務生成
- 第三部分是Schema的對象統計,包含了Top對象的信息,類似OracleAWR報告的segmentstatistics部分,從這里我們可以定位到DML最頻繁的表,增長最快的表等等
- 第四部分是函數的統計,可以看到調用的次數以及消耗的時間
- 第五部分是vacuum相關的統計
- 第六部分是報告快照期間的參數設置
總結
- 這個工具結合了pg_stat_statement可以分析具體的sql,最大的作用是用來抓取數據庫異常的這段時間的詳細數據,用於輔助分析數據庫問題