Don
2021 年5 月 8 日 09:56
1
大家好,
我有关于这个选项的几个问题。虽然 app.yml 中默认已注释掉该选项,且说明其“可以提升排序性能,但会增加每个连接的内存占用”,但这具体是什么意思呢?这是否取决于连接数量?db_work_mem 是什么?它是否像 db_shared_buffers 和 UNICORN_WORKERS 一样,在安装 Discourse 时自动设置?启用它是一个安全选项还是高级配置?
目前该选项看起来是这样的:#db_work_mem: "40MB"
服务器配置为:
Vultr 高频计算型 2 vCore, 4096 MB
感谢大家的回复!
pfaffman
(Jay Pfaffman)
2021 年5 月 8 日 10:09
2
这是一个复杂的问题。你可以搜索 PostgreSQL 文档以获取详细信息。这里有一些讨论性能调优的主题。
默认配置通常表现良好。
如果你遇到问题,可以描述具体问题、流量规模以及数据库的大小。
Don
2021 年5 月 8 日 10:47
3
谢谢 Jay! 其实我只是对此感兴趣。我正在寻找提升论坛性能的方法,但如果这可能导致问题,那最好还是保持注释状态。
所以,如果我启用它,在调优不当或流量增加的情况下,是否很有可能耗尽内存?如果我理解正确的话。
work_mem(integer)
设置查询操作(例如排序或哈希表)在写入临时磁盘文件之前可使用的最大基础内存量。如果该值未指定单位,则视为千字节。默认值为 4 兆字节(4MB)。请注意,对于复杂查询,可能有多个排序或哈希操作并行运行;每个操作通常被允许使用最多等于该值指定的内存量,然后才开始将数据写入临时文件。此外,多个运行中的会话可能同时执行此类操作。因此,使用的总内存量可能是 work_mem 值的许多倍;在选择该值时务必牢记这一点。排序操作用于 ORDER BY、DISTINCT 和合并连接。哈希表则用于哈希连接、基于哈希的聚合以及 IN 子查询的基于哈希的处理。
基于哈希的操作通常比等效的基于排序的操作对内存可用性更敏感。可用于哈希表的内存量通过将 work_mem 乘以 hash_mem_multiplier 计算得出。这使得基于哈希的操作能够使用超过常规 work_mem 基础值的内存量。
pfaffman
(Jay Pfaffman)
2021 年5 月 8 日 12:44
4
有时将工作内存提升至注释掉的默认值的两倍会有所帮助。我认为这在索引较大的大型网站上会有所裨益,但我也不能完全确定。我曾因将其设置过高而导致网站崩溃。
如果您想尝试调优,可以查看 Prometheus 插件,并使用 Grafana 生成漂亮的图表。
Don
2021 年5 月 8 日 20:43
5
我找到了这里 的公式来计算 db_work_mem。
默认情况下,它设置为支持 100 个连接。
总内存 * 0.25 / max_connections
我的计算是 4096MB * 0.25 / 100 = 约 10MB 。
在 postgres.template.yml 模板中,db_work_mem: "10MB" 是默认值,我认为它是按照这个公式计算的。我认为目前这个 10MB 就是最大值。谢谢 Jay