↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1
历史版本PostgreSQL 8.1 已于 2010 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

17.4. 资源消耗 #

17.4.1. 内存 #

shared_buffers (integer) #

设置数据库服务器使用的共享内存缓冲区数目。默认值通常是 1000,但如果你的内核设置不支持(在initdb期间确定),也可能更小。除非在构建服务器时选择了不同的BLCKSZ值,每个缓冲区为 8192 字节。这个设置必须至少为 16,并且至少是max_connections值的两倍;不过,要获得良好的性能,通常需要明显高于最小值的设置。生产安装推荐使用几千的数值。这个选项只能在服务器启动时设置。

增大这个参数可能导致PostgreSQL请求比操作系统默认配置允许的更多System V共享内存。必要时如何调整这些参数的信息参见第 16.4.1 节。

temp_buffers (integer) #

设置每个数据库会话使用的临时缓冲区的最大数量。这些是会话本地的缓冲区,仅用于访问临时表。默认值为 8 兆字节(8MB)。可以在单个会话内更改此设置,但必须在该会话首次使用临时表之前更改;此后尝试更改该值,对该会话不会产生影响。

会话会按需分配临时缓冲区,上限为 temp_buffers。对于实际不需要很多临时缓冲区的会话,将此参数设得较大时,开销仅为 temp_buffers 每增加一就多分配一个缓冲区描述符,约为 64 字节。不过,如果实际使用了某个缓冲区,还会为它额外消耗 8192 字节(一般而言为 BLCKSZ 字节)。

max_prepared_transactions (integer) #

设置可同时处于“预备”状态的事务的最大数量(见 PREPARE TRANSACTION)。将此参数设为零(默认值)会禁用预备事务功能。此参数只能在服务器启动时设置。

如果不打算使用预备事务,应将此参数设为零,以防意外创建预备事务。如果使用预备事务,通常应将 max_prepared_transactions 设为不小于 max_connections 的值,以便每个会话都能有一个待处理的预备事务。

增加这个参数可能会导致PostgreSQL请求比你的操作系统默认配置所允许的更多的System V共享内存。如果有必要,关于如何调整那些参数的信息见第 16.4.1 节。

work_mem (integer) #

指定内部排序操作和哈希表在写入临时磁盘文件之前可使用的内存量。默认值为 1 兆字节(1MB)。请注意,复杂查询可能并行执行多个排序或哈希操作,每个操作在开始向临时文件写入数据之前,都可以使用此值指定的内存量。此外,多个正在运行的会话也可能并发执行此类操作。因此,使用的总内存量可能是 work_mem 值的数倍;选择此值时必须考虑这一点。排序操作用于 ORDER BY、DISTINCT 和归并连接。哈希表用于哈希连接、基于哈希的聚合、以及基于哈希的 IN 子查询处理。

maintenance_work_mem (integer) #

指定维护操作(如 VACUUM、CREATE INDEX 和 ALTER TABLE ADD FOREIGN KEY)可使用的最大内存量。默认值为 16 兆字节(16MB)。由于一个数据库会话一次只能执行一个此类操作,而一个数据库系统通常也不会并发运行很多此类操作,因此可以安全地将该值设得远大于 work_mem。更大的设置可能改善清理和恢复数据库转储的性能。

max_stack_depth (integer) #

指定服务器执行栈的最大安全深度。此参数的理想设置是内核强制的实际栈大小限制(由ulimit -s或本地等效设置确定),减去大约一兆字节的安全余量。需要安全余量是因为服务器中并非每个例程都检查栈深度,而只在可能递归的关键例程(如表达式求值)中检查。把这个参数设置得高于实际的内核限制,将意味着失控的递归函数可能使单个后端进程崩溃。默认设置是 2048 KB(两兆字节),这个值较小,比较保守,不太可能导致崩溃。不过,对于执行复杂函数来说,它可能太小。

17.4.2. 空闲空间映射 #

这些参数控制共享空闲空间映射(FSM)的大小,它跟踪数据库中未使用空间的位置。空闲空间映射过小会导致数据库随时间推移消耗越来越多的磁盘空间,因为不在映射中的空闲空间无法被重新使用;当需要存储新数据时,PostgreSQL会转而向操作系统申请更多磁盘空间。数据库范围的VACUUM VERBOSE命令输出的最后几行有助于判断当前设置是否足够。如果当前设置过低,此类操作期间还会打印一条NOTICE消息。

增大这些参数可能导致PostgreSQL申请的System V共享内存超过操作系统默认配置所允许的数量。必要时如何调整这些参数,参见第 16.4.1 节。

max_fsm_pages (integer) #

设置共享空闲空间映射中跟踪其空闲空间的磁盘页面的最大数量。每个页槽位消耗 6 字节共享内存。此设置必须至少为 16 * max_fsm_relations。默认值由 initdb 根据可用内存量选择,可在 20k 到 200k 页之间。此参数只能在服务器启动时设置。

max_fsm_relations (integer) #

设置共享空闲空间映射中跟踪其空闲空间的关系(表和索引)的最大数量。每个槽位大约消耗 70 字节共享内存。默认值为一千个关系。此参数只能在服务器启动时设置。

17.4.3. 内核资源使用 #

max_files_per_process (integer) #

设置每个服务器子进程允许同时打开的最大文件数量。默认值为一千个文件。如果内核强制实施了安全的每进程上限,就不必担心此设置。但在某些平台上(尤其是大多数 BSD 系统),内核允许单个进程打开的文件数量很大,如果很多进程都尝试打开这么多文件,就会远超系统实际能够支持的总量。如果遇到 “Too many open files”(打开的文件过多)错误,可尝试减小此设置。此参数只能在服务器启动时设置。

preload_libraries (string) #

这个变量指定在服务器启动时预装载的一个或多个共享库。可以选择为每个库调用一个无参数的初始化函数。要指定它,在库名后加上冒号和初始化函数的名称。例如'$libdir/mylib:mylib_init'将导致mylib被预装载并执行mylib_init。如果要装载多个库,用逗号分隔它们的名称。

如果找不到指定的库或初始化函数,服务器将启动失败。

PostgreSQL的过程语言库可以这样预装载,通常使用语法'$libdir/plXXX:plXXX_init',其中XXX是pgsql、perl、tcl或python。

通过预装载共享库(并在适用时初始化它),可以避免首次使用该库时的库启动时间。不过,每个新服务器进程的启动时间可能会略有增加,即使该进程从未使用过这个库。因此,这个选项只推荐用于大多数会话都会用到的库。

17.4.4. 基于代价的清理延迟 #

执行 VACUUM 和 ANALYZE 命令期间,系统维护一个内部计数器,记录已执行的各种 I/O 操作的估算代价。 当累计代价达到上限(由 vacuum_cost_limit 指定)时,执行该操作的进程会休眠一小段时间,时长由 vacuum_cost_delay 指定。 随后重置计数器并继续执行。

此功能让管理员能够降低这些命令对并发数据库活动的 I/O 影响。在许多情况下,VACUUM 和 ANALYZE 等维护命令是否快速完成并不重要, 但避免它们显著干扰系统执行其他数据库操作的能力通常很重要。基于代价的清理延迟为管理员提供了实现这一点的方法。

此功能默认禁用。要启用它,将 vacuum_cost_delay 变量设为非零值。

vacuum_cost_delay (integer) #

超过代价上限后,进程将休眠的时长,单位为毫秒。默认值为零,表示禁用基于代价的清理延迟功能。正值会启用基于代价的清理。注意,在许多系统上,休眠延迟的有效分辨率为 10 毫秒;将 vacuum_cost_delay 设为不是 10 的倍数的值,可能与将它设为下一个更大的 10 的倍数效果相同。

vacuum_cost_page_hit (integer) #

清理在共享缓冲区缓存中找到的缓冲区时所计入的估算代价。它表示锁定缓冲池、查找共享哈希表和扫描页内容的代价。默认值为 1。

vacuum_cost_page_miss (integer) #

清理必须从磁盘读取的缓冲区时所计入的估算代价。它表示锁定缓冲池、查找共享哈希表、从磁盘读取所需数据块并扫描其内容所需的工作量。默认值为 10。

vacuum_cost_page_dirty (integer) #

清理操作修改原本干净的数据块时所计入的估算代价。它表示再次将脏块刷盘所需的额外 I/O。默认值为 20。

vacuum_cost_limit (integer) #

会使清理进程休眠的累计代价。默认值为 200。

注意

某些操作持有关键的锁,因此应尽快完成。这些操作期间不会发生基于代价的清理延迟,所以累计代价可能远超指定上限。 为避免此时出现无益的长时间延迟,实际延迟按 vacuum_cost_delay * accumulated_balance / vacuum_cost_limit 计算, 但最大不超过 vacuum_cost_delay * 4。

17.4.5. 后台写入器 #

从PostgreSQL 8.0 开始,有一个独立的服务器进程,称为后台写入器,它唯一的职责就是发出对“脏”共享缓冲区的写操作。这样设计的意图是,处理用户查询的服务器进程应当很少或从不需要等待写操作的发生,因为后台写入器会完成它。这种安排也降低了与检查点相关的性能损失。后台写入器会把脏页持续不断地少量刷写到磁盘,因此在检查点时刻到来时只需要强制写出很少的页面,而不是像以前那样在每个检查点发生一次脏缓冲区写风暴。不过,总体 I/O 负载会有净增加,因为一个反复变脏的页面以前可能每个检查点间隔只写出一次,而后台写入器可能在同一间隔内把它写出多次。在大多数情况下,持续的低压负载优于周期性的尖峰,但本小节讨论的参数可用于根据本地需求调整这一行为。

bgwriter_delay (integer) #

指定后台写入器各轮活动之间的延迟。每一轮中,写入器会对一定数量的脏缓冲区发出写操作(由下面的参数控制),然后休眠bgwriter_delay毫秒,再重复此过程。默认值为 200。注意,在许多系统上,休眠延迟的有效分辨率为 10 毫秒;将bgwriter_delay设为不是 10 的倍数的值,可能与将它设为下一个更大的 10 的倍数效果相同。这个选项只能在服务器启动时或在postgresql.conf文件中设置。

bgwriter_lru_percent (floating point) #

为了降低服务器进程需要自己发出写操作的概率,后台写入器会尝试写出很快就会被回收的缓冲区。每一轮中,它最多检查bgwriter_lru_percent比例的最接近被回收的缓冲区,并写出其中的脏缓冲区。默认值为 1.0(这是共享缓冲区总数的一个百分比)。这个选项只能在服务器启动时或在postgresql.conf文件中设置。

bgwriter_lru_maxpages (integer) #

每一轮中,作为扫描即将被回收的缓冲区的结果,写出的缓冲区不会超过这个数目。默认值为 5。这个选项只能在服务器启动时或在postgresql.conf文件中设置。

bgwriter_all_percent (floating point) #

为了减少检查点时所需的工作量,后台写入器还会对整个缓冲池做循环扫描,写出发现的脏缓冲区。每一轮中,它为此最多检查bgwriter_all_percent比例的缓冲区。默认值为 0.333(这是共享缓冲区总数的一个百分比)。在默认的bgwriter_delay设置下,这允许整个共享缓冲池大约每分钟被扫描一次。这个选项只能在服务器启动时或在postgresql.conf文件中设置。

bgwriter_all_maxpages (integer) #

每一轮中,作为扫描整个缓冲池的结果,写出的缓冲区不会超过这个数目。(如果达到这个上限,扫描会停止,并在下一轮从下一个缓冲区继续。)默认值为 5。这个选项只能在服务器启动时或在postgresql.conf文件中设置。

较小的bgwriter_all_percent和bgwriter_all_maxpages值会降低后台写入器造成的额外 I/O 负载,但会把更多工作留到检查点时刻完成。要减少检查点时的负载尖峰,可以增大这两个值。类似地,较小的bgwriter_lru_percent和bgwriter_lru_maxpages值会降低后台写入器造成的额外 I/O 负载,但会使服务器进程更有可能必须自己发出写操作,从而延迟交互式查询。要完全禁用后台写操作,可以把两个maxpages值和/或两个percent值都设置为零。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。