CodeGym /課程 /SQL SELF /PostgreSQL 系統指標

PostgreSQL 系統指標

SQL SELF
等級 46, 課堂 0
開放

想像一下,你的 PostgreSQL 伺服器就像一間餐廳,而我們就是那種會來檢查的稽核員。為了讓餐廳穩定營運,我們得知道用了多少「食材」(CPU、記憶體、磁碟),這些東西多久會用完,是誰在用。如果我們沒注意,這間「餐廳」可能會接太多單,結果爆掉,或是直接在營業時間當機。所以,懂系統指標真的很重要啦。

監控 PostgreSQL 時要注意的關鍵指標:

  1. CPU:告訴你有多少處理器時間被拿去跑查詢。
  2. 記憶體 (RAM):看 PostgreSQL 怎麼用 RAM,包括查詢快取。
  3. 磁碟空間:這個最直觀啦,你不能存比磁碟還多的資料。

我們的目標——學會怎麼檢查和解讀 PostgreSQL 的系統指標,這樣才不會遇到效能問題或資源不夠用的窘境。

CPU 使用率監控

CPU 就是你伺服器的心臟。PostgreSQL 會用 CPU 來跑複雜查詢,也會用來做一些背景工作,像是自動分析和自動清理資料庫(autovacuum)。如果你的資料庫像個大胃王,狂「吃」CPU,那就該出手了。

  1. 用系統工具來看。
    先搞清楚 PostgreSQL 在系統層級吃了多少 CPU。在 Linux 上可以用 top 或 htop。

找一下 PostgreSQL 的 process(通常會有你資料庫的名字)。像這樣:postgres: postgres [your_query]。

注意 %CPU 這一欄。如果它一直爆表,就是警訊啦。

  1. 從 PostgreSQL 裡面看 CPU 負載。

PostgreSQL 內建一些 view 可以監控負載,最實用的就是 pg_stat_activity,會顯示目前在跑的查詢。

查詢範例:

SELECT pid, usename, query, state, now() - query_start AS duration
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY duration DESC;

重點是什麼?

  • state = 'active' 只會顯示現在正在跑的查詢。
  • duration 會告訴你查詢已經吃 CPU 吃多久了。

實用小技巧:

如果你看到有查詢跑很久,其實不該這麼久,記得檢查一下有沒有用到 index。也可以用 pg_terminate_backend 直接砍掉問題 process。

砍 process 範例:

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'active' AND duration > interval '10 minutes';

記憶體使用監控

記憶體是 PostgreSQL 第二重要的資源,尤其是資料快取的時候。PostgreSQL 很會用 RAM(靠 work_mem 跟 shared_buffers 這些參數)來加速操作。

  1. PostgreSQL 主要的記憶體參數:
  • shared_buffers:這是 PostgreSQL 主要用的記憶體區塊,通常會佔伺服器 RAM 的 25-40%。
  • work_mem:每個查詢做排序或 hash 時用的記憶體。設大一點,臨時操作就能在記憶體裡完成(不用寫到磁碟)。
  1. 檢查目前記憶體設定。

想看 PostgreSQL 現在的記憶體設定,可以這樣查:

SHOW shared_buffers;
SHOW work_mem;

查詢結果範例:

1GB
4MB

這代表伺服器有 1GB 給 shared_buffers,每個排序/哈希操作有 4MB。

  1. 用 pg_stat_activity 監控記憶體

你可以查一下目前連線用了多少記憶體。這個查詢很方便:

SELECT pid, usename, state, backend_start, pg_size_pretty(pg_backend_memory_contexts_size(pid)) AS memory_used
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY memory_used DESC;

這會顯示每個活躍連線用了多少 RAM。

小建議:如果有連線吃太多記憶體,檢查一下查詢裡有沒有排序或聚合操作可以優化。

磁碟空間監控

磁碟就是 PostgreSQL 最後的資源池。就算你 RAM 跟 CPU 都夠,PostgreSQL 還是需要磁碟來存資料、交易日誌(WAL)、臨時檔案。

  1. 查資料庫大小。

先來個基本的:查一下資料庫多大。

SELECT pg_size_pretty(pg_database_size(current_database())) AS db_size;

這個查詢做什麼?

它會用好懂的格式(MB、GB)顯示目前資料庫的總大小。

  1. 查表格和 index 的大小。

想知道資料庫裡哪些「大胃王」,可以用這個:

SELECT relname AS table_name, pg_size_pretty(pg_total_relation_size(relid)) AS total_size
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC;

查詢結果範例:

table_name total_size
orders 1 GB
customers 500 MB
transactions 300 MB
  1. 監控 WAL(交易日誌)。

如果你的資料庫很活躍,交易日誌會長很快。可以這樣查大小:

SELECT pg_size_pretty(pg_xlog_location_diff(pg_current_wal_lsn(), '0/0')) AS wal_size;

總結

現在你已經有工具跟知識,可以監控 PostgreSQL 的系統指標:

  1. 用 htop 或 pg_stat_activity 來看 CPU 負載。
  2. 調整 shared_buffers 跟 work_mem 參數,讓記憶體用得更順。
  3. 定期檢查資料庫、表格和 index 的大小,避免磁碟空間不夠。

這些技能會讓你避免突發狀況,讓 PostgreSQL 伺服器一直保持在最佳狀態。記得,資源分配得好,你的產品就會變成用戶(客戶)最愛的那一個!

2
任務
SQL SELF, 等級 46, 課堂 0
上鎖
找出資料庫中最大的資料表
找出資料庫中最大的資料表
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION