想像一下,你的 PostgreSQL 伺服器就像一間餐廳,而我們就是那種會來檢查的稽核員。為了讓餐廳穩定營運,我們得知道用了多少「食材」(CPU、記憶體、磁碟),這些東西多久會用完,是誰在用。如果我們沒注意,這間「餐廳」可能會接太多單,結果爆掉,或是直接在營業時間當機。所以,懂系統指標真的很重要啦。
監控 PostgreSQL 時要注意的關鍵指標:
- CPU:告訴你有多少處理器時間被拿去跑查詢。
- 記憶體 (RAM):看 PostgreSQL 怎麼用 RAM,包括查詢快取。
- 磁碟空間:這個最直觀啦,你不能存比磁碟還多的資料。
我們的目標——學會怎麼檢查和解讀 PostgreSQL 的系統指標,這樣才不會遇到效能問題或資源不夠用的窘境。
CPU 使用率監控
CPU 就是你伺服器的心臟。PostgreSQL 會用 CPU 來跑複雜查詢,也會用來做一些背景工作,像是自動分析和自動清理資料庫(autovacuum)。如果你的資料庫像個大胃王,狂「吃」CPU,那就該出手了。
- 用系統工具來看。
先搞清楚 PostgreSQL 在系統層級吃了多少 CPU。在 Linux 上可以用top或htop。
找一下 PostgreSQL 的 process(通常會有你資料庫的名字)。像這樣:postgres: postgres [your_query]。
注意 %CPU 這一欄。如果它一直爆表,就是警訊啦。
- 從 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 這些參數)來加速操作。
- PostgreSQL 主要的記憶體參數:
shared_buffers:這是 PostgreSQL 主要用的記憶體區塊,通常會佔伺服器 RAM 的 25-40%。work_mem:每個查詢做排序或 hash 時用的記憶體。設大一點,臨時操作就能在記憶體裡完成(不用寫到磁碟)。
- 檢查目前記憶體設定。
想看 PostgreSQL 現在的記憶體設定,可以這樣查:
SHOW shared_buffers;
SHOW work_mem;
查詢結果範例:
1GB
4MB
這代表伺服器有 1GB 給 shared_buffers,每個排序/哈希操作有 4MB。
- 用
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)、臨時檔案。
- 查資料庫大小。
先來個基本的:查一下資料庫多大。
SELECT pg_size_pretty(pg_database_size(current_database())) AS db_size;
這個查詢做什麼?
它會用好懂的格式(MB、GB)顯示目前資料庫的總大小。
- 查表格和 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 |
- 監控 WAL(交易日誌)。
如果你的資料庫很活躍,交易日誌會長很快。可以這樣查大小:
SELECT pg_size_pretty(pg_xlog_location_diff(pg_current_wal_lsn(), '0/0')) AS wal_size;
總結
現在你已經有工具跟知識,可以監控 PostgreSQL 的系統指標:
- 用
htop或pg_stat_activity來看 CPU 負載。 - 調整
shared_buffers跟work_mem參數,讓記憶體用得更順。 - 定期檢查資料庫、表格和 index 的大小,避免磁碟空間不夠。
這些技能會讓你避免突發狀況,讓 PostgreSQL 伺服器一直保持在最佳狀態。記得,資源分配得好,你的產品就會變成用戶(客戶)最愛的那一個!
GO TO FULL VERSION