PostgreSQL 失控:CPU 负载高,内存消耗高

PostgreSQL 失控:CPU 负载高,内存消耗高

我正在使用 PostgreSQL 9.2.32,安装在带有 Plesk 的 CentOS 7 上,带有非常少量的表(表也很小)和 Vapor 3 作为后端。

几个小时后,我的服务器内存不足,因为 PostgreSQL 像吃豆人一样吞噬它,我不知道为什么以及如何分析这种行为。

此外,PostgreSQL 的 CPU 负载非常高。

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                      
 4192 postgres  20   0  434784   9956   1176 S 400.0  0.2 262:06.80 pgsrv                                                                                                                        
 2641 postgres  20   0  226292   9080   7976 S   0.0  0.1   0:00.12 postgres                                                                                                                     
 2642 postgres  20   0  192604   1524    440 S   0.0  0.0   0:00.00 postgres                                                                                                                     
 2644 postgres  20   0  226392   2952   1824 S   0.0  0.0   0:00.00 postgres                                                                                                                     
 2645 postgres  20   0  226292   1968    856 S   0.0  0.0   0:00.03 postgres                                                                                                                     
 2646 postgres  20   0  226292   1896    784 S   0.0  0.0   0:00.03 postgres                                                                                                                     
 2647 postgres  20   0  227120   2996   1216 S   0.0  0.0   0:00.06 postgres                                                                                                                     
 2648 postgres  20   0  194856   1796    588 S   0.0  0.0   0:00.10 postgres                                                                                                                     
 3881 postgres  20   0  227612   5896   3624 S   0.0  0.1   0:00.00 postgres                                                                                                                     
 3897 postgres  20   0  228260   7980   5428 S   0.0  0.1   0:00.05 postgres  

这是服务器停止工作前几分钟的一行:

postgres  20   0 8488060   2,9g   2588 S   0,3 47,9   1:42.40 ps3351955702

如果有人能解决这个问题就太好了。

编辑:pg_stat_activity 的输出

1   16458   test_lmmaps 3881    16460   lmmaps      139.xx.xx.xx    null    49526   2018-07-10T10:37:10.999Z    null    2018-07-10T10:37:11.246Z    2018-07-10T10:37:11.246Z    false   idle    SELECT * FROM "fluent" WHERE ("fluent"."name" = $1) LIMIT 1 OFFSET 0
2   16458   test_lmmaps 3897    16460   lmmaps      139.xx.xx.xx    null    49542   2018-07-10T10:38:51.000Z    null    2018-07-10T12:08:51.078Z    2018-07-10T12:08:51.080Z    false   idle    INSERT INTO "locations" ("longitude", "id", "createdAt", "latitude", "tourID", "loadno", …
3   12924   postgres    6900    16460   lmmaps      46.xx.xx.xx     null    56518   2018-07-10T12:14:21.512Z    null    2018-07-10T12:14:23.465Z    2018-07-10T12:14:23.466Z    false   idle    EXPLAIN SELECT * FROM pg_stat_activity ;
4   12924   postgres    6901    16460   lmmaps      46.xx.xx.xx     null    56519   2018-07-10T12:14:24.745Z    2018-07-10T12:14:24.796Z    2018-07-10T12:14:24.796Z    2018-07-10T12:14:24.796Z    false   active  SELECT * FROM pg_stat_activity

答案1

丹尼尔的评论可能是正确的:看起来有人在滥用你的系统。

对于通过 Google 找到这里的人们,这里有一些有关 Postgres 性能/稳定性的一般提示:

  1. 在 postgresql.conf 中,您可以为各种功能设置内存预留量。研究该文件,看看是否需要修改某些值。恐怕我无法确切告诉您要更改什么;这取决于您的系统和应用程序。
  2. Postgresql 9.2 非常老了。有一个版本 11。较新的版本通常具有更好的性能和稳定性。
  3. 记录慢查询。查看 pg_log 中有哪些慢查询,并检查是否有需要额外索引的表。

相关内容