Postgres 消耗大量 RAM(缓存)
-
29-09-2020 - |
题
我在 Centos 6 x64 上有一个小型数据库 PostgreSQL (v9.3)( RAM:8 GB)。
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需要大量RAM?
如何减少 PG 的缓存缓冲区?
解决方案
postgreSQL不使用大量的RAM,内核使用它用于磁盘缓存。
这正是你想要发生的事情。这里没有什么可以解决的。
“免费”RAM是浪费的RAM。数据库服务器的最佳方法是尽可能多的RAM用作磁盘缓存。
其他提示
事实上,与 shared_buffers = 3000MB
, Postgres 做 占用“大量”RAM(相对于 8 GB 的系统而言) - 即使不是全部 RAM,就像您可能一直在想的那样。“为什么”很明显:因为你用你的设置指示它 shared_buffers
. 。该设置很高(默认为 128MB),但对于专用数据库服务器来说,该设置似乎仍然合理。(超过总 RAM 的 40% 通常是过度杀伤力。)
Postgres 的用途 两个都 系统缓存 和 它自己的共享缓冲区。共享缓冲区是 投入的 到 Postgres 并且内存不与其他进程共享。它们用于短期缓冲数据,对于快速处理至关重要。系统缓存通常更智能、更快速,可以长期处理要保留在缓存中的内容以及在资源紧张时推出的内容。 @克雷格的回答 和 您找到的网站 解释一下为什么系统缓存 似乎 吃掉你所有的内存。所有这些都是针对 Unix/Linux 的。Windows在某些方面的工作方式有所不同,我不熟悉细节。
- 该手册针对各种场景提供了详细的信息和说明: 管理内核资源
- 这 Postgres 维基 关于如何设置有更多建议
shared_buffers
.
到 “减少PG的缓存缓冲区” (你可能真的想这样做一段时间 “小型数据库”)降低设置 shared_buffers
和 重新启动 Postgres:
该参数只能在服务器启动时设置。