PostgreSQL系统指标
想象一下,你的PostgreSQL服务器就像一家餐厅,而我们就是那种爱挑毛病的审查员。为了让餐厅稳定运营,我们得知道用了多少“食材”(CPU、内存、磁盘),这些东西多久会用光,都是谁在消耗。如果我们忽略了这些,咱们的“餐厅”可能会接太多单撑不住,甚至直接在大白天崩掉。所以,搞懂系统指标真的很重要。
PostgreSQL监控的关键指标:
- CPU:表示执行查询时消耗了多少CPU时间。
- 内存 (RAM):展示PostgreSQL怎么用内存,包括查询缓存。
- 磁盘空间:这个最直观:你不能存比磁盘允许还多的数据。
我们的目标——学会检查和理解PostgreSQL的系统指标,避免性能瓶颈和资源不足的问题。
CPU使用率监控
CPU就是你服务器的心脏。PostgreSQL会用CPU来跑复杂查询,也会用来做后台任务,比如自动分析和自动清理(autovacuum)。如果你的数据库像个吃货一样疯狂“吃”CPU,是时候出手干预了。
- 用系统工具查看。
首先,看看PostgreSQL在系统层面到底吃了多少CPU。在Linux下你可以用top或者htop命令。
找到PostgreSQL进程(通常会带有你的数据库名)。比如,postgres: postgres [your_query]。
注意%CPU这一列。如果它一直很高,那就要警惕了。
- 用PostgreSQL内部视图分析CPU负载。
PostgreSQL自带一些视图可以监控负载,最有用的就是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多久了。
实用建议:
如果你发现有个查询跑了很久但其实不该这么慢,检查下用了哪些索引。也可以用pg_terminate_backend直接干掉有问题的进程。
终止示例:
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'active' AND duration > interval '10 minutes';
内存使用监控
内存是PostgreSQL第二重要的资源,尤其是缓存数据的时候。PostgreSQL会大量用内存(通过work_mem和shared_buffers参数)来加速操作。
- PostgreSQL内存相关的主要参数:
shared_buffers:这是PostgreSQL分配的主要内存块。一般占服务器总内存的25-40%。work_mem:单个查询里排序和哈希操作用的内存。值越大,能在内存里完成的临时操作越多(不用写磁盘)。
- 查看当前内存设置。
想看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;
这个查询会显示每个活跃连接用了多少内存。
建议:如果某个连接用内存特别多,看看是不是有排序或聚合操作可以优化。
磁盘空间监控
磁盘是PostgreSQL最后的资源池。就算你有足够的内存和CPU,PostgreSQL还是得用磁盘来存数据、事务日志(WAL)和临时文件。
- 查看数据库大小。
先来点基础的:查查数据库有多大。
SELECT pg_size_pretty(pg_database_size(current_database())) AS db_size;
这个查询干嘛的?
它会用友好的格式(MB、GB)显示当前数据库的总大小。
- 查看表和索引的大小。
想知道数据库里哪些表最“重”,可以用:
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参数,让内存用得更合理。 - 定期检查数据库、表和索引的大小,避免磁盘空间不够。
这些技能能帮你避免意外宕机,让PostgreSQL服务器一直保持最佳状态。记住:资源安排得好,你的产品就会成为用户心中的“网红餐厅”。
GO TO FULL VERSION