我在 Centos 6 x64 ( RAM: 8 GB ) 上有一个小型数据库 PostgreSQL (v9.3)。
postgresql.conf
max_connections = 512
shared_buffers = 3000MB
temp_buffers = 8MB
work_mem = 2MB
maintenance_work_mem = 128MB
effective_cache_size = 3000MB
大约 150 个连接,PostgreSQL 占用超过 6 GB 的 RAM(当然,其他应用程序使用大约 200 MB 的 RAM),这里是我的信息:
Mem: 7062.945M total, 6892.410M used, 170.535M free, 6644.000k buffers
Swap: 0.000k total, 0.000k used, 0.000k free, 5378.922M cached
问题:
为什么 PG 占用大量内存?
如何减少 PG 的缓存缓冲区?
PostgreSQL 没有使用大量 RAM,内核将其用于磁盘缓存。
这正是你想要发生的。这里没有什么需要解决的。
“免费” RAM 是浪费的 RAM。对于数据库服务器来说,最好的办法是尽可能多的 RAM 用作磁盘缓存。
实际上,
shared_buffers = 3000MB
Postgres确实占用了“很多”内存(相对于 8 GB 的系统而言)——即使不是所有的内存,就像您可能一直在想的那样。而且“为什么”很明显:因为您使用shared_buffers
. 该设置很高(默认为 128MB),但对于专用数据库服务器,该设置似乎仍然合理。(超过 ~ 40% 的总 RAM 通常是多余的。)Postgres 使用系统缓存和它自己的共享缓冲区。共享缓冲区专用于 Postgres,内存不与其他进程共享。它们用于数据的短期缓冲,对快速处理至关重要。系统缓存通常更智能、更快速,可以长期处理缓存中的内容以及在资源紧张时要推出的内容。@Craig 的回答和您找到的网站解释了为什么系统缓存似乎会吃掉您所有的 RAM。所有这些都是针对 Unix / Linux 的。Windows在某些方面的工作方式不同,我不熟悉细节。
shared_buffers
.要“减少 PG 的缓存缓冲区”(您可能真的想为“小型数据库”这样做)降低设置
shared_buffers
并重新启动 Postgres: