7

我知道postgresql.conf我可以限制 PostgreSQL 特定部分的内存使用量,例如共享内存或工作内存,但是有没有办法限制 PostgreSQL 服务器的总内存使用量?我未能找到执行此操作的配置属性...

顺便说一句,我需要在 Windows Server 2008 机器上运行它。

4

2 回答 2

5

你是什​​么意思“总”内存?这是您分配给各个池的总和。

所以,简而言之......不要将各种池/缓冲区设置得太大,这就是你的总内存限制。

于 2013-02-25T15:28:58.837 回答
3

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_mem4 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 KBand work_mem = 64 KB。但是,由于 PostgreSQL 将每个后端子进程作为单独的操作系统级别进程运行,因此在任何情况下,您通常最终都会花费至少 1-4 MB 每个后端,因此如果您希望每个连接低于 4 MB,您确实希望限制并行客户端连接。例如,pgbouncer将是一个不错的选择。实际上,我不建议设置shared_buffers小于 12 MB 或work_mem小于 1 MB。如果您真的负担不起,您可能需要创建一个完全不使用 SQL 数据库的完全定制设计。或者尝试使用例如 SQLite。

于 2020-07-01T15:10:52.713 回答