在Ubuntu系统下分析PostgreSQL资源占用,主要围绕**CPU、内存、磁盘I/O、数据库对象(表/索引)**四大核心维度展开。通过系统命令与PostgreSQL内置工具结合,可精准定位资源瓶颈并制定优化策略。
top命令实时查看系统中CPU使用率高的进程,通过PID定位到PostgreSQL进程(通常为postgres)。pg_stat_activity视图关联进程ID,获取具体SQL语句。例如:SELECT pid, query, usename, datname, state
FROM pg_stat_activity
WHERE pid = '<top命令中的PID>' AND state != 'idle';
此查询可显示该进程正在执行的SQL及状态(如active表示正在执行)。JOIN、GROUP BY、子查询等操作,导致CPU持续高负载。work_mem(排序/哈希操作内存)设置过小,导致频繁使用磁盘临时文件,增加CPU开销。PostgreSQL内存配置直接影响性能,需重点关注以下参数(位于postgresql.conf中):
VACUUM、CREATE INDEX)的内存(默认16MB),建议设置为物理内存的5%~10%(如4GB内存可设为256MB),加速维护任务。pg_stat_statements扩展(需提前启用)查看SQL内存使用情况:SELECT query, total_memory_usage/1024/1024 AS memory_mb
FROM pg_stat_statements
ORDER BY memory_usage DESC
LIMIT 10;
此查询可显示内存使用最多的前10条SQL。ps命令查看PostgreSQL进程的内存占用:ps aux | grep postgres | sort -k4 -nr | head -5
按内存使用率排序,显示前5个占用最高的PostgreSQL进程。-- 查看所有数据库大小
SELECT datname, pg_size_pretty(pg_database_size(datname)) AS size
FROM pg_database
ORDER BY size DESC;
-- 查看当前数据库各表大小(含索引)
SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
FROM pg_tables
ORDER BY size DESC;
-- 查看索引大小
SELECT indexname, pg_size_pretty(pg_total_relation_size(indexrelid)) AS size
FROM pg_index
JOIN pg_class ON pg_class.oid = pg_index.indexrelid
ORDER BY size DESC;
du命令查看PostgreSQL数据目录的磁盘占用:du -sh /var/lib/postgresql/<version>/main/*
显示数据目录下各子目录(如base存放表数据、pg_wal存放预写日志)的大小。INSERT/UPDATE操作导致WAL(预写日志)频繁写入。UPDATE需更新所有相关索引)。checkpoint_segments(WAL段文件数量)过小,导致检查点频繁触发,增加I/O压力。pgstattuple扩展查看表的死元组(dead tuples)比例:CREATE EXTENSION IF NOT EXISTS pgstattuple;
SELECT * FROM pgstattuple('public.large_table');
若dead_tuple_percent超过10%,需执行VACUUM FULL或REINDEX整理表。pg_stat_user_indexes查看索引使用频率,删除未使用的索引:SELECT * FROM pg_stat_user_indexes
WHERE idx_scan = 0; -- 从未使用的索引
EXPLAIN ANALYZE查看SQL执行计划,识别全表扫描、排序等耗时操作:EXPLAIN ANALYZE SELECT * FROM large_table WHERE column = 'value';
重点关注Seq Scan(全表扫描)、Sort(排序)等节点,优化查询条件或添加索引。top命令)。安装:sudo apt-get install pg-top;使用:pg_top -U postgres。postgresql.conf中启用:shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.track = all
重启PostgreSQL后生效。通过以上分析维度与工具,可全面掌握Ubuntu系统下PostgreSQL的资源占用情况,快速定位瓶颈并实施针对性优化,保障数据库稳定运行。