# 20.4.资源消耗

20.4.1. 记忆力

20.4.2. 磁盘

20.4.3. 内核资源使用

20.4.4. 基于成本的真空延迟

20.4.5. 背景作家

20.4.6. 异步行为

# 20.4.1.记忆

共享缓冲区(整数)

设置数据库服务器用于共享内存缓冲区的内存量。默认值通常为128兆字节(128MB),但如果内核设置不支持它,则可能会更少(在initdb期间确定)。此设置必须至少为128 KB。但是,要获得良好的性能,通常需要显著高于最低值的设置。如果指定该值时没有单位,则将其视为块,即BLCKSZ字节,通常为8kB。(非默认值为BLCKSZ更改最小值。)此参数只能在服务器启动时设置。

如果您有一个具有1GB或更多RAM的专用数据库服务器,那么共享缓冲区是系统内存的25%。有些工作负载甚至需要更大的设置共享缓冲区是有效的,但由于PostgreSQL还依赖于操作系统缓存,因此不太可能将超过40%的RAM分配给共享缓冲区比少量的效果更好。更大的设置共享缓冲区通常需要相应增加最大尺寸,以便在更长的时间内扩展写入大量新数据或更改数据的过程。

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

巨大的页面 (枚举)

控制是否为主共享内存区域请求巨大的页面。有效值为尝试(违约),在…上具有巨大的页面开始尝试,服务器将尝试请求巨大的页面,但如果失败,将返回默认页面。具有在…上,无法请求巨大的页面将阻止服务器启动。具有,将不会要求提供大量页面。

目前,此设置仅在Linux和Windows上受支持。当设置为时,其他系统上的设置将被忽略尝试.在Linux上,仅当共享内存类型即将mmap(默认设置)。

使用巨大的页面会导致更小的页面表,减少用于内存管理的CPU时间,从而提高性能。有关在Linux上使用大型页面的更多详细信息,请参阅第19.4.5节.

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

请注意,此设置仅影响主共享内存区域。Linux、FreeBSD和Illumos等操作系统也可以自动使用大型页面(也称为“超级”页面或“大型”页面)进行正常内存分配,而无需PostgreSQL的明确请求。在Linux上,这被称为“透明的巨大页面”(THP)。众所周知,对于某些Linux版本的某些用户来说,该功能会导致PostgreSQL的性能下降,因此目前不鼓励使用它(与显式使用巨大的页面).

巨大的页面大小 (整数)

控制启用时巨大页面的大小巨大的_页.默认值为零(0).当设置为0,将使用系统上的默认大页面大小。此参数只能在服务器启动时设置。

现代64位服务器体系结构上常见的页面大小包括:2MB1GB(英特尔和AMD),16MB16GB(IBM POWER),以及64kB, 2MB, 32MB1GB(手臂)。有关用法和支持的更多信息,请参阅第19.4.5节.

非默认设置目前仅在Linux上受支持。

临时缓冲区 (整数)

设置每个数据库会话中用于临时缓冲区的最大内存量。这些是仅用于访问临时表的会话本地缓冲区。如果指定该值时没有单位,则将其视为块,即BLCKSZ字节,通常为8kB。默认值为8兆字节(8MB)(如果BLCKSZ不是8kB,默认值与之成比例。)此设置可以在单个会话中更改,但只能在会话中首次使用临时表之前更改;随后更改该值的尝试将不会对该会话产生影响。

会话将根据需要分配临时缓冲区,直到临时缓冲区。在实际上不需要很多临时缓冲区的会话中设置一个大值的成本只是一个缓冲区描述符,即每增加一个会话,大约64字节临时缓冲区。但是,如果实际使用了缓冲区,则会为其消耗额外的8192字节(或通常,BLCKSZ字节)。

max_准备的_事务 (整数)

设置可同时处于“准备”状态的最大事务数(请参阅准备交易)。将此参数设置为零(默认设置)将禁用准备好的事务功能。此参数只能在服务器启动时设置。

如果不打算使用准备好的事务,则应将此参数设置为零,以防止意外创建准备好的事务。如果您正在使用准备好的事务,您可能需要max_准备的_事务至少有最大值_连接,这样每个会话都可以有一个准备好的待处理事务。

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

工作记忆 (整数)

设置在写入临时磁盘文件之前,查询操作(如排序或哈希表)要使用的基本最大内存量。如果指定此值时没有单位,则将其视为千字节。默认值为4兆字节(4MB)。请注意,对于复杂查询,可能会并行运行多个排序或哈希操作;在开始将数据写入临时文件之前,通常允许每个操作使用该值指定的内存量。此外,几个正在运行的会话可以同时执行此类操作。因此,使用的总内存可能是工作记忆; 在选择价值时,有必要记住这一事实。排序操作用于订购人, 不同的,并合并联接。哈希表用于哈希联接、基于哈希的聚合、结果缓存节点和基于哈希的数据处理在里面子查询。

与等效的基于排序的操作相比,基于哈希的操作通常对内存可用性更敏感。哈希表可用的内存是通过乘以工作记忆通过hash_mem_乘法器。这使得基于哈希的操作可以使用超出正常内存量的内存工作记忆基本金额。

hash_mem_乘法器 (浮点数)

用于计算基于哈希的操作可以使用的最大内存量。最后的极限是通过乘以工作记忆通过hash_mem_乘法器。默认值为1.0,这使得基于哈希的操作受到相同的限制工作记忆最大值为基于排序的操作。

考虑增加hash_mem_乘法器在经常发生查询操作溢出的环境中,尤其是在简单地增加工作记忆导致记忆压力(记忆压力通常表现为间歇性的记忆不足错误)。1.5或2.0的设置可能对混合工作负载有效。2.0-8.0或更高范围内的更高设置可能在以下环境中有效:工作记忆已经增加到40MB或更多。

维护工作记忆 (整数)

指定维护操作要使用的最大内存量,例如真空, 创建索引ALTER TABLE ADD外键.如果指定此值时没有单位,则将其视为千字节。默认为64兆字节(64MB)。由于数据库会话一次只能执行其中一个操作,而且一个安装通常不会有多个操作同时运行,因此可以安全地将此值设置为大大大于工作记忆。较大的设置可能会提高清空和还原数据库转储的性能。

请注意,当自动真空运行时,最多自动真空_最大值_工人此内存可能被分配的次数,因此小心不要将默认值设置得太高。通过单独设置自动真空_工作_记忆.

注意,对于死元组标识符的集合,真空最多只能使用1GB关于记忆。

自动吸尘器工作记忆 (整数)

指定每个自动真空辅助进程要使用的最大内存量。如果指定此值时没有单位,则将其视为千字节。它默认为-1,表示维修_工作_记忆应该改用。该设置对用户的行为没有影响真空当在其他环境中运行时。此参数只能在postgresql。形态文件或在服务器命令行上。

对于死元组标识符的收集,autovacuum最多只能使用1GB关于记忆,所以设置自动吸尘器工作记忆设置为高于该值的值对autovacuum在扫描表时可以收集的死元组数没有影响。

逻辑解码工作记忆 (整数)

指定在将某些已解码的更改写入本地磁盘之前,逻辑解码要使用的最大内存量。这限制了逻辑流复制连接使用的内存量。默认为64兆字节(64MB)。因为每个复制连接只使用此大小的单个缓冲区,而一个安装通常不会同时有多个这样的连接(受max_wal_senders),可以安全地将该值设置为明显高于工作记忆,减少写入磁盘的解码更改量。

最大堆叠深度 (整数)

指定服务器执行堆栈的最大安全深度。此参数的理想设置是内核强制执行的实际堆栈大小限制(由ulimit-s(或本地等效),小于1兆字节左右的安全裕度。之所以需要安全裕度,是因为不会在服务器中的每个例程中检查堆栈深度,而只在可能递归的关键例程中检查堆栈深度。如果指定此值时没有单位,则将其视为千字节。默认设置为2兆字节(2MB),这是保守的小规模,不太可能发生撞车风险。但是,它可能太小,无法执行复杂的函数。只有超级用户才能更改此设置。

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

共享内存类型 (枚举)

指定服务器应用于存储PostgreSQL共享缓冲区和其他共享数据的主共享内存区域的共享内存实现。可能的值是mmap(对于使用mmap), sysv(对于通过以下方式分配的System V共享内存:共享存储区)及窗户(适用于Windows共享内存)。并非所有平台都支持所有值;支持的第一个选项是该平台的默认选项。使用sysv该选项在任何平台上都不是默认选项,但通常不建议使用,因为它通常需要非默认内核设置来允许较大的分配(请参阅第19.4.1节).

动态共享内存类型 (枚举)

指定服务器应使用的动态共享内存实现。可能的值是posix(对于POSIX共享内存,使用开门), sysv(对于通过以下方式分配的System V共享内存:共享存储区), 窗户(适用于Windows共享内存),以及mmap(使用存储在数据目录中的内存映射文件模拟共享内存)。并非所有平台都支持所有值;支持的第一个选项是该平台的默认选项。使用mmap选项在任何平台上都不是默认选项,通常不建议使用该选项,因为操作系统可能会重复将修改过的页面写回磁盘,从而增加系统I/O负载;但是,当pg_dynshmem目录存储在RAM磁盘上,或者当其他共享内存设施不可用时。

最小动态共享内存 (整数)

指定在服务器启动时应分配给并行查询使用的内存量。当这个内存区域不足或并发查询耗尽时,新的并行查询会尝试使用配置为的方法从操作系统临时分配额外的共享内存动态共享内存类型,这可能会因为内存管理开销而变慢。在启动时使用最小动态共享内存受到巨大的页面在支持这种设置的操作系统上进行设置,并且可能更容易从自动管理的操作系统上的较大页面中受益。默认值为0(没有)。此参数只能在服务器启动时设置。

# 20.4.2.磁盘

临时文件限制 (整数)

指定进程可用于临时文件的最大磁盘空间量,例如排序和散列临时文件,或用于保留光标的存储文件。试图超过此限制的交易将被取消。如果指定此值时没有单位,则将其视为千字节。-1(默认)意味着没有限制。只有超级用户才能更改此设置。

此设置限制给定PostgreSQL进程使用的所有临时文件在任何时刻使用的总空间。应该注意的是,用于显式临时表的磁盘空间,与在查询执行过程中后台使用的临时文件不同,不需要按这个限额计算。

# 20.4.3.内核资源使用

每个进程的最大文件数 (整数)

设置允许每个服务器子进程同时打开的最大文件数。默认值为1000个文件。如果内核强制执行每个进程的安全限制,则不必担心此设置。但在某些平台(尤其是大多数BSD系统)上,如果许多进程都试图打开那么多文件,内核将允许单个进程打开比系统实际支持的文件多得多的文件。如果发现“打开的文件太多”失败,请尝试减少此设置。此参数只能在服务器启动时设置。

# 20.4.4.基于成本的真空延迟

在执行真空分析命令时,系统维护一个内部计数器,用于跟踪所执行的各种I/O操作的估计成本。当累计成本达到限额(由真空成本限制),执行该操作的进程将按照真空成本延迟。然后它将重置计数器并继续执行。

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

手动下发默认禁用此功能真空命令。要启用它,请设置真空成本延迟变量为非零值。

真空成本延迟(浮点)

超过成本限制时进程将休眠的时间量。如果指定此值没有单位,则以毫秒为单位。默认值为零,这将禁用基于成本的真空延迟功能。正值启用基于成本的吸尘。

当使用基于成本的真空吸尘器时,适当的值真空成本延迟通常非常小,可能不到 1 毫秒。尽管真空成本延迟可以设置为小数毫秒值,这样的延迟可能无法在旧平台上准确测量。在这样的平台上,增加真空的节流资源消耗高于您在 1ms 获得的资源消耗将需要更改其他真空成本参数。尽管如此,你应该保持真空成本延迟与您的平台一致测量的一样小;大的延迟是没有帮助的。

vacuum_cost_page_hit(整数)

清理共享缓冲区缓存中的缓冲区的估计成本。它代表锁定缓冲池、查找共享哈希表和扫描页面内容的成本。默认值为一。

vacuum_cost_page_miss(整数)

清空必须从磁盘读取的缓冲区的估计成本。这代表了锁定缓冲池、查找共享哈希表、从磁盘读入所需块并扫描其内容的工作。默认值为2.

吸尘器成本页面脏(整数)

当真空处理之前清洁过的砌块时,所收取的估计费用。它表示将脏块再次刷新到磁盘所需的额外I/O。默认值为20.

真空成本限制(整数)

导致吸尘过程休眠的累积成本。默认值为200.

# 笔记

某些操作会持有关键锁,因此应尽快完成。在此类操作期间,不会发生基于成本的真空延迟。因此,成本累积可能远远高于规定的限额。为了避免在这种情况下出现无用的长时间延迟,实际延迟计算如下:真空成本延迟 * 累计余额/真空成本限制最多真空成本延迟 *4.

# 20.4.5.背景作家

有一个单独的服务器进程称为背景作家,其功能是对“脏”(新的或修改过的)共享缓冲区进行写入。当干净共享缓冲区的数量似乎不足时,后台写入程序会将一些脏缓冲区写入文件系统,并将其标记为干净。这降低了处理用户查询的服务器进程无法找到干净的缓冲区并且必须自己写入脏缓冲区的可能性。然而,后台编写器确实会导致I/O负载的总体净增加,因为尽管重复脏页可能在每个检查点间隔内只写入一次,但后台编写器可能会在同一间隔内多次写入脏页。本小节中讨论的参数可用于根据本地需求调整行为。

BGU延迟(整数)

指定后台编写器的活动轮之间的延迟。在每一轮中,编写器都会为一定数量的脏缓冲区(可通过以下参数控制)发出写操作。然后它会睡上一段时间BGU延迟,然后重复。然而,当缓冲池中没有脏的缓冲区时,它会进入更长的睡眠时间,不管是什么情况BGU延迟.如果指定的值没有单位,则以毫秒为单位。默认值为200毫秒(200毫秒).请注意,在许多系统上,睡眠延迟的有效分辨率为10毫秒;背景BGU延迟将其设置为非10的倍数可能会产生与将其设置为下一个更高倍数10相同的结果。此参数只能在postgresql。形态文件或在服务器命令行上。

bgwriter_lru_maxpages (整数)

在每一轮中,背景编写器最多只能编写这么多缓冲区。将其设置为零将禁用背景写入。(请注意,由单独的专用辅助进程管理的检查点不受影响。)默认值为100个缓冲区。此参数只能在postgresql。形态文件或在服务器命令行上。

bgwriter_lru_乘法器 (浮点数)

每轮写入的脏缓冲区的数量基于服务器进程在最近几轮中所需的新缓冲区的数量。最近的平均需求乘以bgwriter_lru_乘法器得出下一轮所需缓冲区数量的估计值。脏缓冲区被写入,直到有那么多干净的、可重用的缓冲区可用。(然而,不超过bgwriter_lru_maxpages缓冲区将按每轮写入。)因此,设置为1.0表示“及时”策略,即准确写入预计需要的缓冲区数量。较大的值为需求激增提供了一些缓冲,而较小的值则有意将写操作留给服务器进程完成。默认值为2.0.此参数只能在postgresql。形态文件或在服务器命令行上。

bg作者_flush_之后 (整数)

每当后台写入程序写入的数据超过这个数量时,请尝试强制操作系统向底层存储发出这些写入操作。这样做将限制内核页面缓存中脏数据的数量,从而降低在出现错误时暂停的可能性同步在检查点结束时,或当操作系统在后台以更大的批量写回数据时发出。这通常会大大减少事务延迟,但也有一些情况,尤其是当工作负载大于共享_缓冲区,但比操作系统的页面缓存小,后者的性能可能会降低。此设置可能对某些平台没有影响。如果指定该值时没有单位,则将其视为块,即BLCKSZ字节,通常为8kB。有效范围介于0,这将禁用强制写回,以及2MB.默认值为512kB在Linux上,0在别处(如果BLCKSZ不是8kB,默认值和最大值与之成比例。)此参数只能在postgresql。形态文件或在服务器命令行上。

较小的bgwriter_lru_maxpagesbgwriter_lru_乘法器减少后台写入程序造成的额外I/O负载,但使服务器进程更有可能自己进行写操作,从而延迟交互式查询。

# 20.4.6.异步行为

后端\u冲洗\u后 (整数)

每当单个后端写入的数据超过这个数量时,请尝试强制操作系统向底层存储发出这些写入操作。这样做将限制内核页面缓存中脏数据的数量,从而降低在出现错误时暂停的可能性同步在检查点结束时,或当操作系统在后台以更大的批量写回数据时发出。这通常会大大减少事务延迟,但也有一些情况,尤其是当工作负载大于共享_缓冲区,但比操作系统的页面缓存小,后者的性能可能会降低。此设置可能对某些平台没有影响。如果指定该值时没有单位,则将其视为块,即BLCKSZ字节,通常为8kB。有效范围介于0,这将禁用强制写回,以及2MB.默认值为0,即没有强制写回。(如果BLCKSZ不是8kB,最大值与之成比例缩放。)

有效的io并发 (整数)

设置PostgreSQL预期可以同时执行的并发磁盘I/O操作数。提高该值将增加任何单个PostgreSQL会话试图并行启动的I/O操作数。允许的范围为1到1000,或为零以禁用异步I/O请求的发出。目前,此设置仅影响位图堆扫描。

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

异步I/O依赖于有效的posix_fadvise功能,这是一些操作系统所缺乏的。如果函数不存在,则将此参数设置为除零以外的任何值都将导致错误。在某些操作系统(例如Solaris)上,该函数存在,但实际上不起任何作用。

在支持的系统上,默认值为1,否则为0.对于特定表空间中的表,可以通过设置相同名称的表空间参数来覆盖该值(请参见改变表空间).

维护io并发 (整数)

类似有效的io并发,但用于代表许多客户端会话执行的维护工作。

在支持的系统上,默认值为10,否则为0.对于特定表空间中的表,可以通过设置相同名称的表空间参数来覆盖该值(请参见改变表空间).

max_worker_进程 (整数)

设置系统可以支持的最大后台进程数。此参数只能在服务器启动时设置。默认值为8.

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

当改变这个值时,还要考虑调整最大值_平行的_工人, 最大值_平行的_维修_工人最大值_平行的_工人_每_聚集.

每个聚集的最大平行工人数 (整数)

设置单个计算机可以启动的最大工作进程数聚集聚集合并节点。并行工作人员来自由最大值_工人_过程,受限于最大值_平行的_工人。请注意,请求的工作人员数量在运行时可能实际上不可用。如果出现这种情况,该计划将使用比预期更少的工人,这可能是低效的。默认值为2.将此值设置为0将禁用并行查询执行。

请注意,并行查询可能比非并行查询消耗更多的资源,因为每个辅助进程是一个完全独立的进程,对系统的影响与附加用户会话大致相同。在为此设置选择值时,以及在配置控制资源利用率的其他设置时,如工作_记忆.资源限制,例如工作记忆分别应用于每个工人,这意味着所有流程的总利用率可能比任何单个流程的正常利用率高得多。例如,一个使用4个工作线程的并行查询可能会使用多达5倍的CPU时间、内存、I/O带宽等,而一个查询根本不使用工作线程。

有关并行查询的更多信息,请参阅第15章.

最多平行维护工人 (整数)

设置单个实用程序命令可以启动的并行工作程序的最大数量。目前,支持使用并行工作程序的并行实用程序命令是创建索引只有在构建B树索引时,以及真空没有满的选项并行工作人员来自由最大值_工人_过程,受限于最大值_平行的_工人。请注意,请求的工作人员数量在运行时可能实际上不可用。如果发生这种情况,公用事业操作将使用比预期更少的工人运行。默认值为2.将此值设置为0将禁用通过实用程序命令使用并行辅助程序。

请注意,并行实用程序命令不应比等效的非并行操作消耗更多的内存。这种策略不同于并行查询,在并行查询中,资源限制通常适用于每个工作进程。并行实用程序命令处理资源限制维护工作记忆作为应用于整个实用程序命令的限制,无论并行工作进程的数量如何。然而,并行实用程序命令可能仍然会消耗更多的CPU资源和I/O带宽。

最大平行工人数 (整数)

设置系统可支持并行操作的最大工作进程数。默认值为8.当增加或减少此值时,还要考虑调整。最大值_平行的_维修_工人最大值_平行的_工人_每_聚集.此外,请注意,此值的设置高于最大值_工人_过程不会产生任何效果,因为并行工作进程是从该设置建立的工作进程池中获取的。

平行领导参与 (布尔值)

允许leader进程在下执行查询计划聚集聚集合并节点,而不是等待工作进程。默认值是在…上.将此值设置为减少工作进程被阻塞的可能性,因为领导者读取元组的速度不够快,但要求领导者进程等待工作进程启动,然后才能生成第一个元组。领导者能够帮助或阻碍绩效的程度取决于计划类型、员工数量和查询持续时间。

旧快照阈值 (整数)

设置可以使用查询快照的最短时间,而不会在使用快照时出现“快照太旧”错误的风险。允许清空已死亡时间超过此阈值的数据。这有助于防止快照长期使用时出现膨胀。为了防止由于清理数据而产生错误的结果,否则快照将可见,当快照早于此阈值,并且快照用于读取自创建快照以来已修改的页面时,会生成错误。

如果指定该值时没有单位,则以分钟为单位。价值-1(默认设置)禁用此功能,有效地将快照期限限制设置为无限。此参数只能在服务器启动时设置。

生产工作的有用值可能从几个小时到几天不等。较小的值(例如01分钟)只允许使用,因为它们有时可能对测试有用。而设置高达60天是允许的,请注意,在许多工作负载中,在更短的时间内可能会出现极端膨胀或事务ID环绕。

启用此功能后,关系末尾释放的空间无法释放到操作系统,因为这可能会删除检测“快照太旧”情况所需的信息。分配给关系的所有空间都与该关系保持关联,以便仅在该关系中重用,除非显式释放(例如,使用真空满).

此设置不会试图保证在任何特定情况下都会生成错误。事实上,如果可以从(例如)已具体化结果集的游标生成正确的结果,则即使引用表中的基础行已被清空,也不会生成错误。某些表无法安全地提前清空,因此不会受到此设置的影响,例如系统目录。对于此类表格,此设置既不会减少膨胀,也不会在扫描时产生“快照太旧”错误的可能性。