我知道postgresql.conf
我可以限制 PostgreSQL 特定部分的内存使用量,例如共享内存或工作内存,但是有没有办法限制 PostgreSQL 服务器的总内存使用量?我未能找到执行此操作的配置属性...
顺便说一句,我需要在 Windows Server 2008 机器上运行它。
我知道postgresql.conf
我可以限制 PostgreSQL 特定部分的内存使用量,例如共享内存或工作内存,但是有没有办法限制 PostgreSQL 服务器的总内存使用量?我未能找到执行此操作的配置属性...
顺便说一句,我需要在 Windows Server 2008 机器上运行它。
你是什么意思“总”内存?这是您分配给各个池的总和。
所以,简而言之......不要将各种池/缓冲区设置得太大,这就是你的总内存限制。
PostgreSQL 没有您可以设置的任何全局限制。相反,您配置shared_buffers
(通常大约是您打算为 PostgreSQL 授予的总 RAM 的 25% - 50%),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,您可能应该改进您的查询。
如果您有大量并行序列化事务,您可能需要max_connections
人为地推高数字以允许获取足够的行锁以获得高性能。(PostgreSQL 会根据锁的数量缩放max_connections
,如果您的事务需要大量锁,则默认缩放可能不够,PostgreSQL 将开始将行锁转换为表级锁,这将导致更多序列化事务回滚。但是,不要盲目规模max_connections
太高了,因为 PostgreSQL 不断为其配置支持的最大锁计数保留内存。如果您需要超过 400 万个并行锁,预计会出现性能问题——也就是说,重叠事务读取或写入总共超过 400 万行。请注意,对大表进行顺序表扫描必须读取大量行,因此您需要正确的索引!
请注意,如果您需要节省内存,设置shared_buffers
和设置work_mem
较低的值将允许 PostgreSQL 在您需要的限制内工作,但性能会受到影响。我认为最小可能是shared_buffers = 128 KB
and work_mem = 64 KB
。但是,由于 PostgreSQL 将每个后端子进程作为单独的操作系统级别进程运行,因此在任何情况下,您通常最终都会花费至少 1-4 MB 每个后端,因此如果您希望每个连接低于 4 MB,您确实希望限制并行客户端连接。例如,pgbouncer
将是一个不错的选择。实际上,我不建议设置shared_buffers
小于 12 MB 或work_mem
小于 1 MB。如果您真的负担不起,您可能需要创建一个完全不使用 SQL 数据库的完全定制设计。或者尝试使用例如 SQLite。