我正在尝试弄清楚为什么在正常使用后,约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%的内存(没有交换)。这些进程保存了什么样的信息?我希望长时间运行的空闲Postgres进程的内存使用与全新的空闲进程相似。
值得注意的是:我正在大量使用模式。在每次对我的应用程序的请求中,我都会设置和重置search_path。