我知道使用postgresql.conf
我可以限制PostgreSQL特定部分的内存使用,比如共享内存或工作内存,但有没有办法限制PostgreSQL服务器的总内存使用量?我找不到那样做的配置属性......
BTW,我将需要在Windows Server 2008计算机上运行它。
答案 0 :(得分:6)
你是什么意思"总计"记忆?它是您分配给各个池的总和。
因此,简而言之......不要将各种池/缓冲区设置得太大,这是你的总内存限制。
答案 1 :(得分:1)
PostgreSQL没有可以设置的任何全局限制。而是配置shared_buffers
(通常要为PostgreSQL分配大约25%的内存),max_connections
(需要多少个并行客户端连接,尝试将其保持在尽可能低的水平,也许使用PgPool或pgbouncer)和work_mem
;实际的内存使用量大致为shared_buffers
+ max_connections
* work_mem
* N
,其中N
取决于您的平均查询复杂度。如果执行简单选择,则N
将为1。如果您进行了排序的子查询和复杂的多表联接,则应假设N
在4到10之间。work_mem
的默认值为4。 MB,除非您知道甚至不能拥有那么多,否则不应该减少它。根据我的经验,如果您需要将work_mem
设置为高于16-32 MB,则可能应该改进查询。
如果您有很多并行的 serialized 事务,则可能需要将max_connections
推入人为的大数字,以允许使用足够的行锁来获得高性能。 (PostgreSQL根据max_connections
缩放锁的数量,如果您的事务需要大量锁,则默认缩放可能不够,并且PostgreSQL将开始将行锁转换为表级锁,这将导致更多序列化的事务回滚。但是,不要盲目地将max_connections
扩展得太高,因为PostgreSQL会不断为其配置所支持的最大锁数保留内存。如果您需要超过4M的并行锁,则可能会遇到性能问题。
请注意,如果需要节省内存,请将shared_buffers
和work_mem
设置为较低的值将使PostgreSQL在所需的限制内工作,但性能会受到影响。我认为最小值为shared_buffers = 128 KB
和work_mem = 64 KB
。但是,由于PostgreSQL将每个后端子级作为独立的OS级别进程运行,因此无论如何,通常每个后端至少要花费2-4 MB。实际上,我不建议将shared_buffers
设置为小于12 MB或将work_mem
设置为小于1 MB。如果您真的负担不起,则可能需要创建一个完全不使用SQL数据库的完全自定义设计。或尝试使用SQLite。