空闲的 postgres 进程占用大量内存

Posted

技术标签:

【中文标题】空闲的 postgres 进程占用大量内存【英文标题】:Idle postgres processes taking up lots of memory 【发布时间】:2013-12-29 03:45:10 【问题描述】:

我试图弄清楚为什么〜30个空闲的postgres进程在正常使用后会占用如此多的进程特定内存。我正在使用 Postgres 9.3.1 和 CentOS 版本 6.3(最终版)。 使用top,我可以看到许多 postgres 连接正在使用高达 300mb(平均 ~200mb)的非共享 (RES - SHR) 内存:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3534 postgres  20   0 2330m 1.4g 1.1g S  0.0 20.4   1:06.99 postgres: deploy mtalcott 10.222.154.172(53495) idle
 9143 postgres  20   0 2221m 1.1g 983m S  0.0 16.9   0:14.75 postgres: deploy mtalcott 10.222.154.167(35811) idle
 6026 postgres  20   0 2341m 1.1g 864m S  0.0 16.4   0:46.56 postgres: deploy mtalcott 10.222.154.167(37110) idle
18538 postgres  20   0 2327m 1.1g 865m S  0.0 16.1   2:06.59 postgres: deploy mtalcott 10.222.154.172(47796) idle
 1575 postgres  20   0 2358m 1.1g 858m S  0.0 15.9   1:41.76 postgres: deploy mtalcott 10.222.154.172(52560) idle

总共大约有 29 个空闲连接。这些空闲连接在内存中不断增长,直到机器开始使用交换,然后性能停止。 正如预期的那样,重置连接会清除特定于进程的内存。当我定期重新连接时,同一台机器上相同数量的连接仅使用 20% 的内存(交换为 0)。这些过程保存了什么样的信息?我希望长时间运行的空闲 postgres 进程与全新的空闲进程具有相似的内存使用情况。

值得注意的是:我大量使用模式。在对我的应用程序的每个请求中,我都会设置和重置 search_path。

【问题讨论】:

【参考方案1】:

这些流程保留了哪些信息?我希望长时间运行的空闲 postgres 进程与全新的空闲进程具有相似的内存使用情况。

实际上有很多东西一旦加载,Postgres 就会缓存在本地内存中:

relcache(关系描述符) catcache(系统目录条目) plpgsql 函数的编译树

对于大多数用例,所有这些加起来可以忽略不计。这里的关键是模式的大量使用以及对 relcache 的影响。该数据库包含约 500 个模式,每个模式具有相同的约 90 个表。对于 Postgres 来说,即使模式都相同,这也适用于 45,000 个表 (500*90)。

每个请求都会在内存中缓存一些表的关系描述符(通常在与之前的请求不同的架构中),逐渐填满 relcache。不幸的是,Postgres does not offer a way to limit the size of these caches,因为对于大多数用例来说,开销可能会适得其反。

可能的解决方案:

经过一定数量的请求后重新连接 添加更多内存 使用pgpool-II 或PgBouncer 设置postgres 连接数上限的连接池

感谢 Tom Lane 和 Merlin Moncure 通过Postgres mailing lists 提供的帮助。

【讨论】:

很遗憾,“Postgres 不提供限制这些缓存大小的方法”后面的链接不再有效。 @TilmanSchmidt 感谢您指出这一点。我找到了一面镜子并更新了答案。

以上是关于空闲的 postgres 进程占用大量内存的主要内容,如果未能解决你的问题,请参考以下文章

进程过多,占用大量内存,如何分析

Lsass.exe进程占用大量内存

linux 怎样查看内存被哪个进程占用

WordPress网站MySQL占用CPU过高,大量相同sql语句查询进程

已解决Linux中buff/cache(磁盘写/读缓存)占用大量内存导致用户进程内存不足

trustedinstaller.exe进程占用内存高