暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

重要的PostgreSQL参数:理解其重要性及推荐值

tinge 2025-02-20
256

您是否曾遇到过数据库速度随着数据量增加而变慢的情况?如果是这样,需要考虑的一个重要因素是调整 PostgreSQL 参数以匹配您的特定工作负载和要求

PostgreSQL 具有许多参数,因为它被设计为高度灵活且可定制,以满足各种用例和工作负载。每个参数都允许您微调数据库的不同方面,例如内存管理、查询优化、连接处理等。这种灵活性可帮助数据库管理员根据硬件资源、工作负载要求和特定业务需求优化性能。

在这篇博客中,我将介绍一些重要的 PostgreSQL 参数,解释它们的作用,并提供推荐值,以帮助您微调数据库,获得更好的性能和可扩展性。

免责声明:本博客中推荐的 PostgreSQL 参数值可作为调优的起点。最佳值取决于多种因素,包括工作负载类型、硬件规格和数据库大小。请始终分析系统性能并根据实际使用情况和监控调整这些设置。

与内存相关的参数

PostgreSQL 中的内存相关参数控制数据库如何分配和管理内存。调整这些设置对于提高查询性能和防止资源瓶颈非常重要。

work_mem

  • 描述:设置内部操作(如排序和哈希)在写入磁盘之前使用的最大内存量。增加它可以提高复杂查询的性能默认值:4MB
  • 推荐值:通常,建议将 work_mem 设置为系统总可用内存的 1-2%,即,如果系统总内存为 256 GB,则为 work_mem 分配 3 到 5 GB。
  • 注意:这可能会导致涉及排序的操作的内存使用率更高。

shared_buffers

  • 描述:确定为缓存数据库数据分配的内存量。
  • 默认值:128MB
  • 建议:通常,建议将 shared_buffers 设置为系统总内存的 25-40%,即,如果系统总内存为 256 GB,则为 shared_buffers 分配 64-102 GB。

maintenance_work_mem

  • 描述:指定用于维护操作(如 VACUUM、CREATE INDEX 和 ALTER TABLE)的内存量。增加它可以加快这些操作的速度。
  • 默认值:64MB
  • 建议:建议设置为系统总内存的 5-10%,即,如果系统总内存为 256 GB,则为 Maintenance_work_mem 分配 13 到 26 GB。

并行度相关参数

PostgreSQL 中与并行度相关的参数控制如何在多个 CPU 核心之间划分和处理任务。这些设置对于通过加快数据处理速度和减少执行时间提高查询性能非常重要。

max_parallel_maintenance_workers

  • 描述:设置可用于维护操作(如 VACUUM 和 CREATE INDEX)的最大并行工作器数量。增加它可以加快这些操作的速度。
  • 默认值:2
  • 建议:如果您有 48 个核心,则可以将其设置为可用核心的 12%,即为并行维护操作(如 VACUUM 或 CREATE INDEX)分配 6 个核心。

max_parallel_workers

  • 描述:定义可用于任何查询执行的最大并行工作器数量。例如并行扫描、连接和聚合
  • 默认值:8
  • 建议: 如果您有 48 个核心,则建议将 max_parallel_workers 设置为可用核心的 75%,即分配 36 个核心用于并行查询执行。

max_parallel_workers_per_gather

  • 描述:控制用于单个查询操作(如 JOIN 或 SCAN)的最大并行工作器数量。它确定可以为查询的单个部分分配多少个工作器,从而提高资源密集型查询的性能。
  • 默认值:2
  • 建议:如果您有 48 个核心,建议设置总可用 CPU 核心的 1/6,即每个并行查询操作分配 8 个核心。

max_worker_processes

  • 描述:定义 PostgreSQL 服务器可用于各种任务(例如并行查询执行、逻辑复制和其他维护任务)的最大后台工作进程数。
  • 默认值:8
  • 建议:如果您有 48 个核心,则可以将其设置为可用核心的 100%,即将所有 48 个核心分配给 max_worker_processes。

JIT 相关参数

PostgreSQL 中的 JIT 相关参数管理查询的即时编译以提高执行速度。这些设置对于通过将查询转换为机器代码来优化查询性能非常重要,从而使其运行速度更快。

jit

  • 描述:启用或禁用查询的即时 (JIT) 编译,通过在运行时将查询的各个部分编译为机器代码来提高复杂查询的性能。
  • 默认值:开启
  • 建议:如果查询受 CPU 限制,则启用 (on)。

JIT 操作注意事项:将 JIT 参数设置得太激进或太低都会带来缺点。较低的值可以启用更多的 JIT 编译,而较高的值可以保持选择性。因此,如果设置得太低,查询中不必要的部分可能会被编译,这可能会增加执行时间而不是提高性能。

jit_above_cost

  • 描述:设置将考虑 JIT 编译的最小查询成本阈值。高于此成本的查询将被 JIT 编译。
  • 默认值:100000
  • 建议:通常 100,000 是一个不错的起始数字,如果查询变得更加 CPU 密集且包含复杂操作,则增加此数字。

jit_inline_above_cost

  • 描述:设置启用 JIT 时查询中的函数调用将被内联的最低成本阈值,从而减少函数调用开销。内联意味着函数直接合并到查询中。

  • 默认值:500000

  • 建议:500,000 是一个很好的起点;增加它以更有选择性地使用 JIT 或减少它以将 JIT 应用于更通用的函数。

  • jit_optimize_above_cost
    描述:设置成本阈值,超过该阈值,JIT 编译函数将进行额外的优化。默认值:500000建议:500,000 是一个很好的起点;增加它以获得更有选择性的 JIT 使用,或减少它以将 JIT 应用于更通用的函数。

连接相关参数

PostgreSQL 中的连接相关参数管理客户端应用程序如何连接到数据库。调整这些设置对于高效处理大量连接并确保在不同负载下保持稳定的性能至关重要。

max_connections

  • 描述:指定允许连接到 PostgreSQL 数据库的最大并发连接数。
  • 默认值:100
  • 建议:如果您的系统有 48 个核心,则 max_connections 的建议设置为 (核心数 * 3) * 2,即 (48 * 3) * 2 = 288 个连接。
  • 注意:如果您的要求明显超出建议值,最好配置连接池以有效满足您的业务需求。

idle_in_transaction_session_timeout

  • 描述:指定会话在事务中保持空闲状态的时间(以毫秒为单位),超过此时间会话将自动终止。
  • 默认值:0(禁用)
  • 建议:根据工作负载要求设置合理的超时时间,以避免空闲事务导致的阻塞问题。对于大多数应用程序来说,30000(30 秒)到 60000(1 分钟)之间的值是一个不错的起点。

idle_session_timeout

  • 描述:指定会话在自动终止之前可以保持空闲状态(不执行查询)的持续时间(以毫秒为单位)。这有助于释放系统资源并防止不活动的连接无限期地停留。
  • 默认值:0(禁用)
  • 建议:根据预期的用户活动设置超时,以防止不必要的资源消耗。300000(5 分钟)和 1800000(30 分钟)之间的值通常适用于大多数环境。

Autovacum 参数

当时我们正在生产环境中工作,我们注意到客户已关闭自动清理进程。因此,我们自然而然地问道:“你们为什么要禁用它?”他们回答说:“嗯,我们发现自动清理占用了太多资源,一直运行,导致系统运行缓慢,所以我们决定将其关闭。”

现在,这种方法并不是真正的解决方案。自动清理并不是这里的罪魁祸首。如果它占用了太多资源,它实际上是在试图清理混乱局面。在我们的案例中,我们发现系统正在执行大量写入工作负载并生成大量死元组。默认的自动清理设置无法跟上负载。您不需要禁用它,只需调整这些自动清理设置以满足系统需求并让它发挥魔力!

我们之前发布过一篇有关自动真空参数最佳实践的文章,您可以在此阅读

在考虑升级系统资源之前,首先值得关注的是调整数据库。微调数据库设置可以显著提高性能,通常可以提供更具成本效益的解决方案,而无需额外的硬件。

原文地址:https://stormatics.tech/semabs-planet-postgresql/important-postgresql-parameters
原文作者:Semab Tariq

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论