CodeGym /课程 /SQL SELF /PostgreSQL系统指标

PostgreSQL系统指标

SQL SELF
第 46 级 , 课程 0
可用

PostgreSQL系统指标

想象一下,你的PostgreSQL服务器就像一家餐厅,而我们就是那种爱挑毛病的审查员。为了让餐厅稳定运营,我们得知道用了多少“食材”(CPU、内存、磁盘),这些东西多久会用光,都是谁在消耗。如果我们忽略了这些,咱们的“餐厅”可能会接太多单撑不住,甚至直接在大白天崩掉。所以,搞懂系统指标真的很重要。

PostgreSQL监控的关键指标:

  1. CPU:表示执行查询时消耗了多少CPU时间。
  2. 内存 (RAM):展示PostgreSQL怎么用内存,包括查询缓存。
  3. 磁盘空间:这个最直观:你不能存比磁盘允许还多的数据。

我们的目标——学会检查和理解PostgreSQL的系统指标,避免性能瓶颈和资源不足的问题。

CPU使用率监控

CPU就是你服务器的心脏。PostgreSQL会用CPU来跑复杂查询,也会用来做后台任务,比如自动分析和自动清理(autovacuum)。如果你的数据库像个吃货一样疯狂“吃”CPU,是时候出手干预了。

  1. 用系统工具查看。
    首先,看看PostgreSQL在系统层面到底吃了多少CPU。在Linux下你可以用top或者htop命令。

找到PostgreSQL进程(通常会带有你的数据库名)。比如,postgres: postgres [your_query]

注意%CPU这一列。如果它一直很高,那就要警惕了。

  1. 用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_memshared_buffers参数)来加速操作。

  1. PostgreSQL内存相关的主要参数:
  • shared_buffers:这是PostgreSQL分配的主要内存块。一般占服务器总内存的25-40%。
  • work_mem:单个查询里排序和哈希操作用的内存。值越大,能在内存里完成的临时操作越多(不用写磁盘)。
  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;

这个查询会显示每个活跃连接用了多少内存。

建议:如果某个连接用内存特别多,看看是不是有排序或聚合操作可以优化。

磁盘空间监控

磁盘是PostgreSQL最后的资源池。就算你有足够的内存和CPU,PostgreSQL还是得用磁盘来存数据、事务日志(WAL)和临时文件。

  1. 查看数据库大小。

先来点基础的:查查数据库有多大。

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

这个查询干嘛的?

它会用友好的格式(MBGB)显示当前数据库的总大小。

  1. 查看表和索引的大小。

想知道数据库里哪些表最“重”,可以用:

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. htoppg_stat_activity监控CPU负载。
  2. 调整shared_bufferswork_mem参数,让内存用得更合理。
  3. 定期检查数据库、表和索引的大小,避免磁盘空间不够。

这些技能能帮你避免意外宕机,让PostgreSQL服务器一直保持最佳状态。记住:资源安排得好,你的产品就会成为用户心中的“网红餐厅”。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION