postgresql – 空闲的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个空闲连接.这些空闲连接在内存中不断增长,直到机器开始使用交换,然后性能会停止. 值得注意的是:我正在大量使用模式.在我的应用程序的每个请求,我正在设置和重置search_path.
Postgres将在本地内存中加载缓存之后,实际上有很多东西可以缓存: > relcache(关系描述符) 对于大多数用例,所有这些都是可以忽略的.这里的关键是大量使用模式和对relcache的影响.该数据库包含?500个模式,每个模式相同?90个表.对于Postgres,即使模式是一样的,这样做可以达到45,000个表(500 * 90). 每个请求缓存了内存中的一些表的关系描述符(通常在与之前的请求不同的模式中),逐渐填满了relcache.不幸的是,Postgres does not offer a way to limit the size of these caches,因为开销大概可能适用于大多数用例. 可能的解决方案: >在一定数量的请求后重新连接 感谢Tom Lane和Merlin Moncure在Postgres mailing lists上的帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |