# 关于db\_work\_mem的问题

**URL:** <https://meta.discourse.org/t/questions-about-db-work-mem/189757>\
**Category:** Self-hosting\
**Created:** [2021年五月8日 09:56 UTC](https://meta.discourse.org/t/questions-about-db-work-mem/189757 "2021-05-08T09:56:04Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Don](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/don/32/228726_2.png) [@Don](https://meta.discourse.org/u/Don)\
**Post date:** [2021年五月8日 09:56 UTC](https://meta.discourse.org/t/questions-about-db-work-mem/189757/1 "2021-05-08T09:56:04Z")

</div>

大家好，

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

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

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

感谢大家的回复！🙂

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2021年五月8日 10:09 UTC](https://meta.discourse.org/t/questions-about-db-work-mem/189757/2 "2021-05-08T10:09:06Z")

</div>

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

默认配置通常表现良好。

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

---

<div class="post-metadata">

**Author:** ![Don](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/don/32/228726_2.png) [@Don](https://meta.discourse.org/u/Don)\
**Post date:** [2021年五月8日 10:47 UTC](https://meta.discourse.org/t/questions-about-db-work-mem/189757/3 "2021-05-08T10:47:15Z")

</div>

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

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

> **[19.4. Resource Consumption](https://www.postgresql.org/docs/13/runtime-config-resource.html)**
>
> 19.4. Resource Consumption # 19.4.1. Memory 19.4.2. Disk 19.4.3. Kernel Resource Usage 19.4.4. Background Writer 19.4.5. I/O 19.4.6. Worker Processes 19.4.1. Memory …

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

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2021年五月8日 12:44 UTC](https://meta.discourse.org/t/questions-about-db-work-mem/189757/4 "2021-05-08T12:44:05Z")

</div>

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

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

---

<div class="post-metadata">

**Author:** ![Don](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/don/32/228726_2.png) [@Don](https://meta.discourse.org/u/Don)\
**Post date:** [2021年五月8日 20:43 UTC](https://meta.discourse.org/t/questions-about-db-work-mem/189757/5 "2021-05-08T20:43:47Z")

</div>

我找到了[这里](https://www.enterprisedb.com/postgres-tutorials/how-tune-postgresql-memory)的公式来计算 `db_work_mem`。

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

> 总内存 \* 0.25 / max\_connections

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

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

---

<div class="post-metadata">

**Author:** ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)\
**Post date:** [2022年十二月10日 16:55 UTC](https://meta.discourse.org/t/questions-about-db-work-mem/189757/6 "2022-12-10T16:55:39Z")

</div>

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.
