Postgres 消耗大量 RAM(缓存)

Lua*_*ynh 1 postgresql configuration enterprisedb

我在 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
Run Code Online (Sandbox Code Playgroud)

大约 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
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 为什么 PG 需要大量 RAM?

  2. 如何减少 PG 的缓存缓冲区?

Cra*_*ger 10

PostgreSQL 没有使用大量 RAM,内核将其用于磁盘缓存。

这正是你想要发生的。这里没有什么可以解决的。

“免费”RAM 是浪费的 RAM。对数据库服务器而言,最好的做法是将尽可能多的 RAM 用作磁盘缓存。


Erw*_*ter 5

实际上,shared_buffers = 3000MBPostgres确实占用了“大量”RAM(相对于 8 GB 的系统而言)——即使不是全部 RAM,就像您可能一直在想的那样。“为什么”很明显:因为您用 的设置来指示它shared_buffers。该设置很高(默认为 128MB),但对于专用数据库服务器来说,该设置似乎仍然合理。(超过总 RAM 的 40% 通常是过度杀伤力。)

Postgres 使用系统缓存自己的共享缓冲区。共享缓冲区专用于 Postgres,内存不与其他进程共享。它们用于短期缓冲数据,对于快速处理至关重要。系统缓存通常更智能、更快速,可以长期处理要保留在缓存中的内容以及在资源紧张时推出的内容。@Craig 的回答您找到的网站解释了为什么系统缓存似乎耗尽了您所有的 RAM。所有这些都是针对 Unix/Linux 的。Windows在某些方面的工作方式有所不同,我不熟悉细节。

  • 该手册包含各种场景的详细信息和说明:管理内核资源
  • Postgres Wiki有更多关于如何设置的建议shared_buffers

“减少 PG 的缓存缓冲区”(您确实可能希望对“小型数据库”执行此操作),请降低Postgres 的设置shared_buffers并重新启动:

该参数只能在服务器启动时设置。