19.4. 资源消耗

19.4.1. Memory

如果您具有 1GB 或更大 RAM 的专用数据库服务器,则shared_buffers的合理起始值应为系统内存的 25%。在某些工作负载中,更大的shared_buffers设置是有效的,但是由于 PostgreSQL 也依赖于 os 缓存,因此为shared_buffers分配 40%以上的 RAM 不可能比较小的工作更好。 shared_buffers的较大设置通常需要max_wal_size相应增加,以便在更长的时间内分散写入大量新数据或更改数据的过程。

在具有少于 1GB RAM 的系统上,较小百分比的 RAM 是合适的,以便为 os 留出足够的空间。

目前,仅 Linux 和 Windows 支持此设置。当设置为try时,该设置在其他系统上将被忽略。

使用大页面可导致页面表更小,并减少用于内存 Management 的 CPU 时间,从而提高性能。有关在 Linux 上使用大页面的更多详细信息,请参见Section 18.4.5

大页面在 Windows 上被称为大页面。要使用它们,您需要将“内存中的锁定页面”用户权限分配给运行 PostgreSQL 的 Windows 用户帐户。您可以使用 Windows 组策略工具(gpedit.msc)来分配用户权限“内存中的锁定页”。要在命令提示符下将数据库服务器作为独立进程而不是 Windows 服务启动,则必须以 Management 员身份运行命令提示符,或者必须禁用用户访问控制(UAC)。启用 UAC 后,正常的命令提示符将在启动时撤消用户权限“锁定内存中的页面”。

请注意,此设置仅影响主共享存储区。诸如 Linux,FreeBSD 和 Illumos 之类的 os 也可以自动使用大页面(也称为“超级”页面或“大”页面)进行常规内存分配,而无需 PostgreSQL 的明确要求。在 Linux 上,这称为“透明大页面” (THP)。已知该功能会导致某些 Linux 版本上的某些用户使用 PostgreSQL 降低性能,因此目前不鼓励使用该功能(与huge_pages的显式使用不同)。

会话将根据需要分配临时缓冲区,直到temp_buffers给出的限制。在实际上不需要很多临时缓冲区的会话中设置较大的值的成本只是temp_buffers中每个增量的缓冲区 Descriptors,或大约 64 个字节。但是,如果实际上使用了缓冲区,则会为此消耗额外的 8192 字节(或通常为BLCKSZ字节)。

如果您不打算使用准备好的 Transaction,则应将此参数设置为零,以防止意外创建准备好的 Transaction。如果您使用的是预备事务,则可能希望max_prepared_transactions至少与max_connections一样大,以便每个会话都可以有一个待处理的预备事务。

运行备用服务器时,必须将此参数设置为与主服务器上相同或更高的值。否则,备用服务器将不允许查询。

请注意,在运行自动真空时,最多可以分配此内存的autovacuum_max_workers倍,因此请注意不要将默认值设置得太高。通过单独设置autovacuum_work_mem进行控制可能很有用。

max_stack_depth设置为高于实际内核限制将意味着失控的递归函数可能会使单个后端进程崩溃。在 PostgreSQL 可以确定内核限制的平台上,服务器将不允许将此变量设置为不安全的值。但是,并非所有平台都提供该信息,因此建议您谨慎选择一个值。

19.4.2. Disk

此设置限制了给定 PostgreSQL 进程使用的所有临时文件在任何 Moment 使用的总空间。应该注意的是,用于显式临时表的磁盘空间(与在查询执行中用于幕后的临时文件相对)计入此限制。

19 .4.3. 内核资源使用

19 .4.4. 基于成本的真空延迟

在执行VACUUMANALYZE命令期间,系统维护一个内部计数器,该计数器跟踪所执行的各种 I/O 操作的估计成本。当累计成本达到限制(由vacuum_cost_limit指定)时,执行该操作的进程将睡眠较短的一段时间(由vacuum_cost_delay指定)。然后它将重置计数器并 continue 执行。

此功能的目的是允许 Management 员减少这些命令对并发数据库活动的 I/O 影响。在许多情况下,快速完成诸如VACUUMANALYZE之类的维护命令并不重要;但是,通常非常重要的是这些命令不要显着干扰系统执行其他数据库操作的能力。基于成本的真空延迟为 Management 员提供了一种方法。

手动发出的VACUUM命令默认情况下禁用此功能。要启用它,请将vacuum_cost_delay变量设置为非零值。

当使用基于成本的吸尘时,vacuum_cost_delay的适当值通常很小,可能为 10 或 20 毫秒。调整真空的资源消耗最好通过更改其他真空成本参数来完成。

Note

有一些操作具有关键锁,因此应尽快完成。在此类操作期间不会发生基于成本的真空延迟。因此,成本累积可能远远高于指定的限制。为了避免这种情况下不必要的长时间延迟,实际延迟的计算方式为vacuum_cost_delay * accumulated_balance/vacuum_cost_limit,最大vacuum_cost_delay * 4.

19 .4.5. 背景 Writer

有一个称为* background writer *的独立服务器进程,其功能是发出“脏的”(新的或修改的)共享缓冲区的写操作。它写入共享缓冲区,因此服务器处理用户查询的进程很少或不需要 await 写入发生。但是,后台写入器的确会导致 I/O 负载的整体净增加,因为虽然重复写入的页面可能每个检查点间隔只能写入一次,但是后台写入器可能会多次写入它,因为在同一间隔中它被弄脏了。本小节中讨论的参数可用于调整行为以适应本地需求。

较小的bgwriter_lru_maxpagesbgwriter_lru_multiplier值可减少由后台编写器引起的额外 I/O 负载,但使服务器进程更有可能不得不自行发布写操作,从而延迟了交互式查询。

19 .4.6. 异步行为

对于磁性驱动器,此设置的一个很好的起点是包含用于数据库的 RAID 0 条带或 RAID 1 镜像的单独驱动器的数量。 (对于 RAID 5,不应计算奇偶校验驱动器.)但是,如果数据库经常在并发会话中发出多个查询,则较低的值可能足以使磁盘阵列保持繁忙。高于保持磁盘繁忙所需的值只会导致额外的 CPU 开销。 SSD 和其他基于内存的存储通常可以处理许多并发请求,因此最好的价值可能是数百。

异步 I/O 取决于有效的posix_fadvise功能,某些 os 缺少该功能。如果该功能不存在,则将此参数设置为除零以外的任何值都将导致错误。在某些 os(例如 Solaris)上,该功能存在,但实际上不执行任何操作。

在受支持的系统上,默认值为 1,否则为 0.可以通过设置相同名称的 tablespace 参数来为特定表空间中的表覆盖此值。

运行备用服务器时,必须将此参数设置为与主服务器上相同或更高的值。否则,备用服务器将不允许查询。

更改此值时,还要考虑调整max_parallel_workersmax_parallel_maintenance_workersmax_parallel_workers_per_gather

请注意,并行查询可能比非并行查询消耗更多的资源,因为每个工作进程都是完全独立的进程,与其他用户会话相比,对系统的影响大致相同。在为此设置选择一个值以及配置其他控制资源利用率的设置(例如work_mem)时,应考虑到这一点。资源限制(例如work_mem)分别应用于每个工作人员,这意味着所有进程的总利用率可能比任何单个进程的正常情况都要高得多。例如,使用 4 个工作程序的并行查询所使用的 CPU 时间,内存,I/O 带宽等最多可能是不使用任何工作程序的查询的 5 倍。

有关并行查询的更多信息,请参见Chapter 15

请注意,并行 Util 命令不应比等效的非并行操作消耗更多的内存。此策略不同于并行查询的策略,在并行查询中,资源限制通常适用于每个工作进程。并行 Util 命令将资源限制maintenance_work_mem视为要应用于整个 Util 命令的限制,而不管并行工作进程的数量如何。但是,并行 Util 命令可能仍会消耗大量 CPU 资源和 I/O 带宽。

超过阈值,旧数据可能会被清除。这有助于防止面对长时间使用的快照时出现膨胀。为了防止由于清理快照而导致的数据清理而导致错误结果,当快照早于此阈值并且快照用于读取自快照创建以来已被修改的页面时,将生成错误。

-1禁用此功能,这是默认值。生产工作的有用值可能从几个小时到几天不等。该设置将被强制为分钟的粒度,并且仅允许使用较小的数字(例如01min),因为它们有时可能对测试有用。虽然允许设置为最高60d,但是请注意,在许多工作负载中,可能会在更短的时间内发生极端的膨胀或事务 ID 环绕。

启用此功能后,关系末尾的释放空间无法释放给 os,因为这可能会删除检测snapshot too old条件所需的信息。分配给一个关系的所有空间都保持与该关系的关联,除非明确释放(例如,使用VACUUM FULL),否则仅在该关系内可以重用。

此设置并不试图保证在任何特定情况下都会产生错误。实际上,如果可以从(例如)实现了结果集的游标生成正确的结果,则即使引用表中的基础行已被清除,也不会产生错误。某些表无法安全地尽早清理,因此不受此设置的影响,例如系统目录。对于此类表,此设置既不会减少膨胀,也不会在扫描时产生snapshot too old错误。

上一章 首页 下一章