空闲postgres进程为什么占用大量内存?

我试图找出为什么〜30个空闲的postgres进程在正常使用后占用这么多的进程特定的内存.我使用Postgres 9.3.1和CentOS版本6.3(Final).
使用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.

What kind of information are these processes holding on to? I would expect long-running, idle postgres processes to have similar memory usage to brand new, idle ones.

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连接数上限

https://stackoverflow.com/questions/20514569/idle-postgres-processes-taking-up-lots-of-memory
http://www.voidcn.com/article/p-qirwazwp-btq.html
https://cloud.tencent.com/developer/ask/91623

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值