关于db_work_mem的问题

大家好,

我有关于这个选项的几个问题。虽然 app.yml 中默认已注释掉该选项,且说明其“可以提升排序性能,但会增加每个连接的内存占用”,但这具体是什么意思呢?这是否取决于连接数量?db_work_mem 是什么?它是否像 db_shared_buffersUNICORN_WORKERS 一样,在安装 Discourse 时自动设置?启用它是一个安全选项还是高级配置?

目前该选项看起来是这样的:#db_work_mem: "40MB"

服务器配置为:
Vultr 高频计算型 2 vCore, 4096 MB

感谢大家的回复!:slight_smile:

这是一个复杂的问题。你可以搜索 PostgreSQL 文档以获取详细信息。这里有一些讨论性能调优的主题。

默认配置通常表现良好。

如果你遇到问题,可以描述具体问题、流量规模以及数据库的大小。

谢谢 Jay!:slight_smile: 其实我只是对此感兴趣。我正在寻找提升论坛性能的方法,但如果这可能导致问题,那最好还是保持注释状态。

所以,如果我启用它,在调优不当或流量增加的情况下,是否很有可能耗尽内存?如果我理解正确的话。

work_meminteger

设置查询操作(例如排序或哈希表)在写入临时磁盘文件之前可使用的最大基础内存量。如果该值未指定单位,则视为千字节。默认值为 4 兆字节(4MB)。请注意,对于复杂查询,可能有多个排序或哈希操作并行运行;每个操作通常被允许使用最多等于该值指定的内存量,然后才开始将数据写入临时文件。此外,多个运行中的会话可能同时执行此类操作。因此,使用的总内存量可能是 work_mem 值的许多倍;在选择该值时务必牢记这一点。排序操作用于 ORDER BYDISTINCT 和合并连接。哈希表则用于哈希连接、基于哈希的聚合以及 IN 子查询的基于哈希的处理。

基于哈希的操作通常比等效的基于排序的操作对内存可用性更敏感。可用于哈希表的内存量通过将 work_mem 乘以 hash_mem_multiplier 计算得出。这使得基于哈希的操作能够使用超过常规 work_mem 基础值的内存量。

有时将工作内存提升至注释掉的默认值的两倍会有所帮助。我认为这在索引较大的大型网站上会有所裨益,但我也不能完全确定。我曾因将其设置过高而导致网站崩溃。

如果您想尝试调优,可以查看 Prometheus 插件,并使用 Grafana 生成漂亮的图表。

我找到了这里的公式来计算 db_work_mem

默认情况下,它设置为支持 100 个连接。

总内存 * 0.25 / max_connections

我的计算是 4096MB * 0.25 / 100 = 约 10MB

postgres.template.yml 模板中,db_work_mem: "10MB" 是默认值,我认为它是按照这个公式计算的。我认为目前这个 10MB 就是最大值。谢谢 Jay :slight_smile: