Postgres 恒定 30% 的 CPU 使用率

Posted

技术标签:

【中文标题】Postgres 恒定 30% 的 CPU 使用率【英文标题】:Postgres constant 30% CPU usage 【发布时间】:2016-01-25 14:04:30 【问题描述】:

我最近将我的 Postgres 数据库从 Windows 迁移到 CentOS 6.7。 在 Windows 上,数据库从不使用太多 CPU,但在 Linux 上,我看到它使用恒定的 ~30% CPU(使用 top)。 (机器上4核)

有人知道这是否正常,或者为什么会这样做? 该应用程序似乎运行良好,并且与 Windows 一样快或更快。

注意,它是一个大数据库,100gb+ 数据,1000+ 个数据库。

我尝试使用Pgadmin监控服务器状态,但是服务器状态挂起,无法运行,报错“log_filename参数必须相等”

【问题讨论】:

您是否检查了正在运行的查询? select * from pg_stat_activity where state 'idle' 。可能是一些 autovacuum 正在运行... top 中显示了哪些 PostgreSQL 进程?他们的命令行是什么?以top -c 运行即可查看。 top -c 给出 --> 28378 postgres 20 0 1735m 85m 6508 R 18.3 1.1 2233:11 postgres: autovacuum 启动器进程 所以我假设这意味着它是自动吸尘器,是否预计会占用 CPU 的恒定 30%(1 个核心的 30% --> 总共 8%) Maybe a better palce to ask 【参考方案1】:

增加服务器负载可能有多种原因。

    如果您正在查找服务器上的查询级别负载,则应使用 pg_stat_activity 系统表将特定 Postgres 后端 ID 与系统进程 ID 匹配。

SELECT pid, datname, usename, query FROM pg_stat_activity;

一旦您知道正在运行哪些查询,您就可以进一步调查(EXPLAIN/EXPLAIN ANALYZE;检查锁等)

    您可能遇到锁争用问题,可能是由于 ma​​x_connections 非常高。如果是这种情况,请考虑降低 max_connections 并使用连接池。但这会增加客户端连接的周转时间。

    可能是 Windows 系统阻止连接并且不允许使用系统。现在,Linus 允许其连接使用 CPU 并更快地执行。 :P

也值得一读:

    How to monitor PostgreSQL Monitoring CPU and memory usage from Postgres

【讨论】:

【参考方案2】:

对于 1000 个数据库,我希望清理工作人员和统计数据收集器会花费大量时间检查需要维护的内容。

我建议你做两件事

提高autovacuum_naptime 参数以减少检查频率 将stats_temp_directory 放在虚拟磁盘上

您可能还设置了较高的max_connections 限制以允许您的客户端使用这些大量数据库,这是另一个可能的 CPU 负载来源,因为每次后端都要检查大量“插槽”必须与其他人同步。

【讨论】:

知道为什么windows上的同一个数据库不使用任何cpu吗? 您在 Windows 上使用的 PostgreSQL 版本是什么?你现在用什么? PostgreSQL 的配置是否完全一样? Windows 在处理内存和磁盘的方式上与 Linux 非常不同,因此如果您在 CentOS 上使用的配置与您在 Windows 上使用的配置相同,则可能不合适。 @James 在 Windows 上使用默认设置,在我手中,系统在达到 1000 个数据库之前很久就基本上无法使用。您确定您没有在 Windows 服务器上关闭 autovac 或增加 autovacuum_naptime? 两台机器使用相同的设置,并且运行 autovac,都运行良好,1000 dbs,只是 linux 有额外的 cpu

以上是关于Postgres 恒定 30% 的 CPU 使用率的主要内容,如果未能解决你的问题,请参考以下文章

任务的恒定大小 - 在 1x 和 2x CPU 上的执行时间相同 - OpenCl

Postgres 进程显示 100% CPU 但实际使用率为 6%,导致查询响应缓慢

用户 postgres 启动占用所有 CPU 100% 使用率的进程

Flutter动画性能, 官方flutter基础动画在真机上能跑到20-30%CPU

连接postgres特别消耗cpu资源而引发的PostgreSQL性能优化考虑

多个 Postgres SELECT 进程(django GET 请求)卡住,导致 100% CPU 使用率