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