限制PostgreSQL的总内存使用量

时间:2013-02-25 15:26:17

标签: postgresql

我知道使用postgresql.conf我可以限制PostgreSQL特定部分的内存使用,比如共享内存或工作内存,但有没有办法限制PostgreSQL服务器的总内存使用量?我找不到那样做的配置属性......

BTW,我将需要在Windows Server 2008计算机上运行它。

2 个答案:

答案 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_bufferswork_mem设置为较低的值将使PostgreSQL在所需的限制内工作,但性能会受到影响。我认为最小值为shared_buffers = 128 KBwork_mem = 64 KB。但是,由于PostgreSQL将每个后端子级作为独立的OS级别进程运行,因此无论如何,通常每个后端至少要花费2-4 MB。实际上,我不建议将shared_buffers设置为小于12 MB或将work_mem设置为小于1 MB。如果您真的负担不起,则可能需要创建一个完全不使用SQL数据库的完全自定义设计。或尝试使用SQLite。