Dio*_*jos 11 postgresql configuration memory-management
对于学术实验,我需要限制 pgSQL 服务器可用于计算给定查询集的内存总量。
我知道我可以通过postgresql.conf文件来做到这一点,我可以在其中调整一些与资源管理相关的参数。
问题是:我不清楚——考虑到配置文件上可用的几个参数——哪些是我应该更改的参数。
当我第一次打开配置文件时,我期待这样的内容:max_server_memmory. 相反,我发现了很多:shared_buffers、、、temp_buffers等等work_mem......
鉴于此,我查阅了pgSQL 文档。关于资源消耗,我提出了shared_buffers作为我正在寻找的最佳候选者:限制 pgSQL 服务器可以用来执行其计算的内存总量的参数。但我对此并不完全确定。
你们能给我一些关于我应该调整哪些参数来限制 pgSQL 服务器内存的见解吗?
Mik*_*nen 16
不幸的是,PostgreSQL 没有一个易于调整的参数。人们可能会认为,沿线会有一个可调参数max_memory_usage = 1500MB,并且所有内容都会自动扩展,以便为给定资源提供最佳性能。
然而,由于这不可用,下一个最好的事情似乎是:
\n实际最大内存 = shared_buffers+ ( temp_buffers+ work_mem) *max_connections
(此外,PostgreSQL 将使用RAM 的maintenance_work_mem*autovacuum_num_workers进行自动清理,但这通常不是问题,因为autovacuum_num_workers默认情况下只有三个。如果您在非常有限的资源(例如第一代 Raspberry Pi)上运行 PostgreSQL,那么这可能很重要为你。)
作为一个粗略的指导,shared_buffers应该设置为您愿意用于 PostgreSQL 的内存的 40%,max_connections以及您想要的最大并行连接数temp_buffers,work_mem这样您就不会超出 RAM 预算。如果您不使用临时表,则设置temp_buffers为相当低的值(默认为 8 MB)将允许设置得work_mem更高一些。主要用于对行进行排序,因此如果您处理将高行数作为中间或最终结果的查询work_mem,则需要很多。如果需要,PostgreSQL 将在非常低的设置下工作,但许多查询将需要在服务器上创建临时文件,而不是将内容保存在 RAM 中,这显然会导致性能低于标准。work_mem
请注意,如果您设置shared_buffers高于几 GB,则应为操作系统启用“大页面”功能。否则相当大一部分 RAM 将丢失给操作系统虚拟内存页表。使用默认的 4KB 页面时,您的整体性能也会稍微降低。不幸的是,在任何操作系统上配置大页面都是一项有点复杂的任务。(这不是 PostgreSQL 中的错误,而是 32 位和 64 位 x86 处理器上虚拟内存处理的缺点,大页面设置是解决该问题的最佳方法。同样,无需执行大页面舞蹈,一切都会正常工作,但性能不会受到影响。尽可能好。)
也就是说,如果您运行的是足够新的 Linux 内核,通常可以vm.nr_overcommit_hugepages=25000在/etc/sysctl.conf. 此示例允许将最多 50 GB 的 RAM 用于大页面,但这是处于过量使用模式,因此不会立即保留。然后 PostgreSQL 将自动尝试从该 RAM 区域保留shared_buffers。请注意,大页面无法换出,如果您用大页面耗尽 RAM,甚至在交换已满之前也可能会触发内核 OOM Killer。
最好将nr_overcommit_hugepages值设置为小于整个系统 RAM \xe2\x80\x93 请注意,单个大页的默认大小为 2 MB,因此一个好的值可以是 0.45 * 实际安装的 RAM(以 MB 为单位)。你可以使用类似的东西
echo "$(getconf _PHYS_PAGES) * 0.45 / 512" | bc > /proc/sys/vm/nr_overcommit_hugepages\n在/etc/rc.local或类似的脚本中自动设置此值,而不是在/etc/sysctl.conf.
此外,一些内部限制是根据max_connections(例如谓词锁)缩放的,因此在某些情况下,您需要设置max_connections比实际连接计数更高的值 - 特别是当您使用SERIALIZABLE或REPEATABLE READ隔离级别进行长事务时。对于较大的安装,您还希望在客户端和 PostgreSQL 之间使用pgbouncerorpgpool以避免出现过多的并行连接而导致性能受到影响。最好的方法是将实际最大连接数限制为 CPU 数量 x 1.5 左右,并使用事务池而不是连接池来获得最大性能。根据您的用例,如果客户端需要执行比几个查询更长的事务,或者您的客户端与事务池不兼容,因为它们使用特定于连接的设置或功能,则这可能是不可能的。请注意,如果您的客户端在事务处理时间内未 100% 处于活动状态,您可能需要增加最大连接限制,以使 CPU 使用率达到 100% 以获得最大性能。
work_mem请注意,如果您运行 PostgreSQL 12.x 或更低版本,如果查询规划器错误估计导致错误选择哈希聚合,则 PostgreSQL 可能会超出您设置的限制。有关详细信息,请参阅https://dba.stackexchange.com/a/285423/29183。版本 13.x 不会遇到这样的错误,并且错误估计只会导致所述查询的性能降低,而不是像预期的那样超过内存限制。
在 postgresql wiki 上你可以找到答案,但之前已经说过,最多可以做的是共享内存中的配置和同时连接的数量。请参阅此链接:https ://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server
| 归档时间: | 
 | 
| 查看次数: | 32122 次 | 
| 最近记录: |