快轉到主要內容

PostgreSQL 效能分析利器:pg_profile 佈署 SOP (v4.11)

·1065 字·3 分鐘·
PolloChang
作者
PolloChang
我是一隻雞

PostgreSQL 效能分析利器:pg_profile 佈署 SOP (v4.11)
#

一、 系統環境與檔案佈署
#

  1. 下載與解壓縮: 將 pg_profile 延伸模組檔案解壓縮至 PostgreSQL 的指定目錄。
1
2
wget https://github.com/zubkov-andrei/pg_profile/releases/download/4.11/pg_profile--4.11.tar.gz
sudo tar xzf pg_profile-4.11.tar.gz --directory $(pg_config --sharedir)/extension
  1. 修改 PostgreSQL 配置 (postgresql.conf)

pg_profile 依賴於核心統計模組,需在啟動時預先載入。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 必須重啟資料庫生效
shared_preload_libraries = 'pg_stat_statements, pg_stat_kcache, pg_wait_sampling'


#------------------------------------------------------------------------------
# pg_profile
#------------------------------------------------------------------------------
track_activities = on
track_counts = on
track_io_timing = on
track_functions = all
  1. 更新驗證規則 (pg_hba.conf)

確保監控帳號可以透過密碼從本地連線。

1
host    all    profile_collector    127.0.0.1/32    scram-sha-256

二、 資料庫環境初始化
#

建議將監控物件安裝在獨立的 profile schema 中以利管理。

  1. 建立基礎擴充與 Schema
1
2
3
4
5
6
7
\c postgres postgres
CREATE SCHEMA pgss;
CREATE SCHEMA pgsk;
CREATE SCHEMA pgws;
CREATE EXTENSION pg_stat_statements SCHEMA pgss;
CREATE EXTENSION pg_stat_kcache SCHEMA pgsk;
CREATE EXTENSION pg_wait_sampling SCHEMA pgws;
1
2
3
4
5
6
7
-- 以超級使用者執行
CREATE EXTENSION dblink;
CREATE EXTENSION pg_stat_statements SCHEMA pgss;
CREATE EXTENSION pg_stat_kcache SCHEMA pgsk;
CREATE EXTENSION pg_wait_sampling SCHEMA pgws;
CREATE SCHEMA profile;
CREATE EXTENSION pg_profile SCHEMA profile;
  1. check
1
2
3
\df *.pg_stat_kcache_reset
\df *.pg_stat_statements_reset
\df *.pg_wait_sampling_reset_profile

結果如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
\c postgres postgres
postgres=# \df *.pg_stat_kcache_reset
                               List of functions
 Schema |         Name         | Result data type | Argument data types | Type 
--------+----------------------+------------------+---------------------+------
 pgsk   | pg_stat_kcache_reset | void             |                     | func
(1 row)

postgres=# \df *.pg_stat_statements_reset
                                                        List of functions
 Schema |           Name           | Result data type |                        Argument data types                         | Type 
--------+--------------------------+------------------+--------------------------------------------------------------------+------
 pgss   | pg_stat_statements_reset | void             | userid oid DEFAULT 0, dbid oid DEFAULT 0, queryid bigint DEFAULT 0 | func
(1 row)

postgres=# \df *.pg_wait_sampling_reset_profile
                                    List of functions
 Schema |              Name              | Result data type | Argument data types | Type 
--------+--------------------------------+------------------+---------------------+------
 pgws   | pg_wait_sampling_reset_profile | void             |                     | func
(1 row)
  1. 建立專用監控帳號 (Collector)

此帳號用於定期連線收集數據,需具備讀取統計資訊的權限。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
CREATE USER profile_collector WITH PASSWORD '你的密碼';
GRANT pg_read_all_stats TO profile_collector;

-- 授權重置統計資訊的權限 (以確保數據準確)
GRANT USAGE ON SCHEMA pgss TO profile_collector;
GRANT USAGE ON SCHEMA pgsk TO profile_collector;
GRANT USAGE ON SCHEMA pgws TO profile_collector;
GRANT EXECUTE ON FUNCTION pgsk.pg_stat_kcache_reset TO profile_collector;
GRANT EXECUTE ON FUNCTION pgss.pg_stat_statements_reset TO profile_collector;
GRANT EXECUTE ON FUNCTION pgws.pg_wait_sampling_reset_profile TO profile_collector;

三、 伺服器配置與連線設定
#

pg_profile 預設會建立一個名為 local 的伺服器項目。

  1. 更新連線字串: 指定使用剛剛建立的 profile_collector 進行連線。
1
2
3
4
SELECT profile.set_server_connstr(
      'local'::name, 
      'host=127.0.0.1 dbname=postgres user=profile_collector password=你的密碼'::text
);

四、 自動化排程設定 (Systemd Timer)
#

使用 Systemd Timer 取代傳統 Cron,提供更佳的監控與日誌紀錄能力。

  1. 建立 Service 檔案sudo vi /etc/systemd/system/pg_profile_sample.service
1
2
3
4
5
6
7
8
[Unit]
Description=Take PostgreSQL pg_profile sample
After=postgresql-16.service

[Service]
Type=oneshot
User=postgres
ExecStart=/usr/bin/psql -d postgres -c "SELECT profile.take_sample()"
  1. 建立 Timer 檔案 (每 30 分鐘執行一次)sudo vi /etc/systemd/system/pg_profile_sample.timer
1
2
3
4
5
6
7
8
9
[Unit]
Description=Run pg_profile sample every 30 minutes

[Timer]
OnBootSec=5min
OnUnitActiveSec=30min

[Install]
WantedBy=timers.target
  1. 啟用排程
1
2
sudo systemctl daemon-reload
sudo systemctl enable --now pg_profile_sample.timer

五、 驗證與報告產出
#

  1. 手動取樣驗證
1
2
SELECT * FROM profile.take_sample();
-- 確認 Result 欄位顯示 OK
  1. 查看樣本列表
1
SELECT * FROM profile.show_samples();
  1. 生成 HTML 效能報告: 報告需要兩個樣本 ID 作為區間(例如樣本 1 與樣本 2)。
1
2
# 在 Linux Shell 執行
psql -d postgres -Aqtc "SELECT profile.get_report(1, 2)" -o pg_report_$(date +%F).html

六、 日常維護建議
#

  • 數據保留政策pg_profile 預設保留 7 天樣本。若需調整,可使用 profile.set_server_max_sample_age('local', 14) 改為 14 天。
  • 基準線 (Baseline):對於重要的測試時段,建議建立 Baseline 以防止數據被自動清理刪除。
    1
    2
    
    -- 建立名為 'Release_v1' 的基準線
    SELECT profile.create_baseline('local', 'Release_v1', 10, 20);

注意:當 pg_stat_statements.max 設定過小時,報告會發出警告,提醒您可能遺失了部分 SQL 數據。

Referance
#