资源消耗(RESOURCE CONSUMPTION)类别参数
本文档介绍了系统配置参数中 资源消耗类别的相关参数。
注意!
为确保系统稳定与安全,请务必谨慎手动修改相关参数。
资源消耗参数分类如下:
- 内存(Memory)
- 磁盘(Disk)
- 内核资源使用(Kernel Resource Usage)
- 基于代价的清理延迟(Cost-based Vacuum Delay)
- 异步行为(Asynchronous Behavior)
内存(Memory)
autovacuum_work_mem
指定每个自动清理工作者进程能使用的最大内存量(KB)。
- 当运行在其他上下文环境中时, 这个设置对
VACUUM
的行为没有影响。 - 默认值为
-1
,即使用maintenance_work_mem
的值
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | -1 | -1 ~ (INT_MAX/1024) | segments;system;reload |
dynamic_shared_memory_type
指定服务器应该使用的动态共享内存实现。
- 支持的选项有
posix
(用于使用 shm_open 分配的 POSIX 共享内存)、sysv
(用于通过 shmget 分配的 System V 共享内存)、windows
(用于 Windows 共享内存)、和mmap
(使用存储在数据目录中的内存映射文件模拟共享内存)。并非所有平台上都支持所有值,平台上第一个支持的选项就是其默认值。 - 在任何平台上 mmap 选项都不是默认值,通常不鼓励使用它,因为操作系统会反复地把修改过的页面写回到磁盘上,从而增加了系统的 I/O 负载。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
enum | posix | posix,sysv,windows,mmap | segments;system;restart |
gp_resource_group_memory_limit
标识要分配给每个 YMatrix 数据库 Segment 节点上的资源组的系统内存资源的最大百分比。
- 注意:仅当资源管理设置为资源组时,此配置参数才会生效。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 0.7 | 0.1 ~ 1.0 | segments;system;restart |
gp_vmem_protect_limit
设置活动 Segment 节点实例的所有 postgres 进程可以使用的内存量(MB)。
-
注意:仅当资源管理设置为资源队列时,
gp_vmem_protect_limit
服务器配置参数才会生效。 -
如果查询导致超出此参数限制,则不会分配内存,查询将失败。
-
设置此参数时,仅指定数值。例如,要指定 4096MB,请使用值 4096,不要将单位 MB 添加到该值。
-
为了防止内存过度分配,这些计算可以估计安全的
gp_vmem_protect_limit
值。首先计算值 gp_vmem。 这是主机上可用的 YMatrix 数据库内存。gp_vmem = ((SWAP + RAM) – (7.5GB + 0.05 * RAM)) / 1.7
其中 SWAP 是主机交换空间,RAM 是主机上的 RAM,以 GB 为单位。
接下来,计算max_acting_primary_segments
。这是因集群故障而激活 Mirror 时主机上可以运行的 Primary 的最大数量。例如,如果 Mirror 布置在 4 个主机块中,每个主机有 8 个 Primary,则单个 Segment 主机故障将激活故障主机块中每个剩余主机上的两个或三个 Mirror。
此配置的max_acting_primary_segments
值为11
(8 个 Primary 加上 3 个失败时激活的 Mirror)。 这是gp_vmem_protect_limit
的计算。该值应转换为 MB。gp_vmem_protect_limit = gp_vmem / acting_primary_segments
对于生成大量工作文件的情况,这是计算工作文件的
gp_vmem
的计算。gp_vmem = ((SWAP + RAM) – (7.5GB + 0.05 * RAM - (300KB * total_#_workfiles))) / 1.7
根据
gp_vmem
值,您可以计算vm.overcommit_ratio
操作系统内核参数的值。 配置每个 YMatrix 数据库主机时,将设置此参数。vm.overcommit_ratio = (RAM - (0.026 * gp_vmem)) / RAM
-
注意:Red Hat Enterprise Linux 中内核参数
vm.overcommit_ratio
的默认值为50
。 -
如果你使用了图形化界面来部署,则此参数会根据服务器的硬件资源来计算适配;如果你使用命令行部署,则默认为
8192
。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 8192 | 0 ~ (INT_MAX/2) | segments;system;restart |
gp_vmem_protect_segworker_cache_limit
如果查询执行程序进程消耗的数量超过此参数值(MB),则在进程完成后,将不会高速缓存该进程以用于后续查询。
- 具有大量连接或空闲进程的系统可能希望减少此数量以释放 Segment 上的更多内存。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 500 | 1 ~ (INT_MAX/2) | segments;system;restart |
gp_workfile_limit_files_per_query
设置每个 Segment 的每个查询允许的临时溢出文件(也称为工作文件)的最大数量。
- 溢出文件会在执行需要更多内存的查询时被创建。超出限制时终止当前查询。
- 将值设置为
0
以允许无限数量的溢出文件。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 100000 | 0 ~ INT_MAX | master;session;reload |
gp_workfile_limit_per_query
设置允许单个查询用于在每个 Segment 创建临时溢出文件的最大磁盘大小(KB)。
- 默认值为
0
,表示不强制执行限制。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 0 | 0 ~ INT_MAX | master;session;reload |
gp_workfile_limit_per_segment
设置允许所有正在运行的查询用于在每个 Segment 创建临时溢出文件的最大总磁盘大小(KB)。
- 默认值为
0
,表示不强制执行限制。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 0 | 0 ~ INT_MAX | segments;system;restart |
huge_pages
控制是否为主共享内存区域请求巨型页。
- 有效值是
try
(默认)、on
以及off
。如果huge_pages
被设置为try
,则服务器将尝试请求巨型页,如果失败则会退回到默认的方式。如果为on
,请求巨型页失败将使得服务器无法启动。如果为off
,则不会请求巨型页。 - 当前只有 Linux 和 Windows 上支持这个设置。在其他系统上这个参数被设置为
try
时,它会被忽略。 - 巨型页面的使用会导致更小的页面表以及花费在内存管理上的 CPU 时间更少,从而提高性能。
- 巨型页在 Windows 上被称为大页面。要使用大页面,需要为运行 YMatrix 的 Windows 用户账号分配 Lock Pages in Memory 的用户权限。可以使用 Windows 的组策略工具(gpedit.msc)来分配用户权限 Lock Pages in Memory。为了在命令窗口以单进程(而不是 Windows 服务)的方式启动数据库服务器,命令窗口必须以管理员身份运行或者禁用用户访问控制(UAC)。当 UAC 被启用时,普通的命令窗口会在启动时收回用户权限 Lock Pages in Memory。
- 注意这种设置仅影响主共享内存区域。Linux、FreeBSD 以及 Illumos 之类的操作系统也能为普通内存分配自动使用巨型页(也被称为“超级”页或者“大”页面),而不需要来自 YMatrix 的显式请求。在 Linux 上,这被称为 “transparent huge pages”(THP,透明巨型页)。已知这种特性对某些 Linux 版本上的某些用户会导致 YMatrix 的性能退化,因此当前并不鼓励使用它(与 huge_pages 的显式使用不同)。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
enum | try | on / off / true / false / yes / no / 1 / 0 / try | segments;system;restart |
maintenance_work_mem
指定在维护性操作(例如VACUUM、CREATE INDEX和ALTER TABLE ADD FOREIGN KEY)中使用的 最大的内存量(KB)。
- 在一个数据库会话中,一个时刻只有一个这样的操作可以被执行,并且一个数据库安装通常不会有太多这样的操作并发执行,把这个数值设置得比
work_mem
大很多是安全的。 - 更大的设置可以改进清理和恢复数据库转储的性能。
- 默认值为
65536KB
,即 64MB。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 65536 | 1024 ~ (INT_MAX/1024) | master;session;reload |
max_prepared_transactions
设置可以同时处于准备状态的事务的最大数目(见 PREPARE TRANSACTION)。
- YMatrix 在内部使用准备好的事务来确保各个 Segment 的数据完整性。
- 如果你正在使用预备事务,需把
max_prepared_transactions
至少设置为max_connections
一样大,使得每一个会话可以有一个待处理的预备事务。如果你没有使用预备事务的打算,则需设置为0
。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 50 | 1 ~ 262143 | segments;system;restart |
max_stack_depth
指定服务器的执行堆栈的最大安全深度(KB)。
- 此参数的理想设置是由内核强制的实际栈尺寸限制(
ulimit -s
所设置的或者本地等价物),减去大约一兆字节的安全边缘。需要这个安全边缘是因为在服务器中并非所有例程都检查栈深度,只是在关键的可能递规的例程中才进行检查。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 100 | 100 ~ (INT_MAX/1024) | segments;session;reload;superuser |
mx_dump_mctx_threshold
指定内存阈值。如果分配的内存超过阈值(MB),则将其转储。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 1024 | 1 ~ (INT_MAX/2) | master;session;reload |
mx_dump_print_filter
仅打印比此参数大的内存尺寸(MB)。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 1 | 0 ~ (INT_MAX/2) | master;session;reload |
shared_buffers
设置 YMatrix 数据库服务器将使用的共享内存缓冲区量(BLOCKS)。
PG:
- 此设置必须至少为
128KB
且至少为max_connections * 16KB
。为了更好的性能,通常会使用明显高于最小值的设置。 - 如果有一个专用的 1GB 或更多内存的数据库服务器,一个合理的
shared_buffers
开始值是系统内存的 25%。即使更大的shared_buffers
有效,也会造成一些工作负载。为了能把对写大量新的或改变的数据的处理分布在一个较长的时间段内,shared_buffers
更大的设置通常要求对max_wal_size
也做相应增加。 - 此参数只能在服务器启动时设置。更改需重启生效。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 4096 | 16 ~ (INT_MAX/2) | segments;system;restart |
shared_memory_type
指定服务器应用于主共享内存区域的共享内存实现,包括 YMatrix 的共享缓冲区和其他共享数据。
- 支持的选项有
mmap
(对使用 mmap 分配的匿名共享内存),sysv
(通过 shmget 分配的系统 V 共享内存),和windows
(Windows 共享内存)。并非在所有平台上都支持全部值;第一个被支持的选项是该平台的默认选项。 sysv 选项不是任何平台的默认选项,通常不建议使用,因为它通常需要非默认的内核设置来允许大量的地址分配。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
enum | mmap | mmap,sysv,windows | segments;system;restart |
temp_buffers
为每个数据库会话设置用于临时缓冲区的最大内存(BLOCKS)。
- 此参数指仅用于访问临时表的会话本地缓冲。
- 这个设置可以在独立的会话内部被改变,但是只有在会话第一次使用临时表之前才能改变;之后在会话中对该值的修改均不会生效。
- 一个会话将按照
temp_buffers
给出的限制根据需要分配临时缓冲区。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 1024 | 100 ~ (INT_MAX/2) | master;session;reload |
work_mem
设置在写入临时磁盘文件之前查询操作(例如排序或哈希表)可使用的最大内存容量(KB)。
- 注意对于一个复杂查询,可能会并行运行好几个排序或者哈希操作。
ORDER BY
、DISTINCT
和归并连接都要用到排序操作,而哈希连接、基于哈希的聚集以及基于哈希的IN
子查询处理中都要用到哈希表。运行中的每个操作都会被允许使用此参数指定的内存量,然后才会开始写数据到临时文件。 - 同样,几个正在运行的会话可能并发进行这样的操作,因此被使用的总内存可能是
work_mem
值的好几倍。这是决定此值大小的重要依据。 - 此参数只能在服务器启动时设置。更改需重启生效。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 32768 | 64 ~ (INT_MAX/1024) | master;session;reload |
磁盘(Disk)
temp_file_limit
指定一个进程能用于临时文件(如排序和哈希临时文件,或者用于保持游标的存储文件)的最大磁盘空间量(KB)。
- 一个试图超过这个限制的事务将被取消。
- 这个设置约束着一个给定 YMatrix 进程在任何瞬间所使用的所有临时文件的总空间。应该注意的是,与在查询执行中在幕后使用的临时文件相反,显式临时表所用的磁盘空间不被这个设置所限制。
- 默认值为
-1
,即无限制。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | -1 | -1 或 0 ~ INT_MAX | segments;session;reload;superuser |
内核资源使用(Kernel Resource Usage)
max_files_per_process
设置每个服务器子进程允许同时打开的最大文件数目。
- 如果内核强制一个安全的针对每个进程的限制,那么你无需考虑此设置。但是在一些平台上(特别是大多数 BSD 系统),内核会允许独立进程打开比系统可支持的更多的文件数。因此,如果你看到了
Too many open files
这样的失败,请减小此设置。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 1000 | 25 ~ INT_MAX | segments;system;restart |
基于代价的清理延迟(Cost-based Vacuum Delay)
在 VACUUM
和 ANALYZE
命令的执行过程中,系统维持着一个内部计数器来跟踪各种被执行的 I/O 操作的估算开销。当累计的代价达到一个限制(由 vacuum_cost_limit
指定),执行这些操作的进程将按照 vacuum_cost_delay
所指定的休眠一小段时间。然后它将重置计数器并继续执行。
这个特性的出发点是允许管理员降低这些命令对并发的数据库活动产生的 I/O 影响。在很多情况下,VACUUM
和 ANALYZE
等维护命令能否快速完成并不重要,重要的是这些命令不会对系统执行其他数据库操作的能力产生显著的影响。基于代价的清理延迟提供了一种方式让管理员能够保证这一点。
对于手动发出的 VACUUM
命令,该特性默认被禁用。要启用它,需要把 vacuum_cost_delay
变量设为一个非零值。
vacuum_cost_delay
当超出开销限制时进程将要休眠的时间量(毫秒)。
- 其默认值为
0
,这将禁用基于代价的清理延迟特性。正值将启用基于代价的清理。 - 在使用基于代价的清理时,
vacuum_cost_delay
的合适值通常很小。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 0 | 0 ~ 100 | segments;session;reload |
vacuum_cost_limit
将导致清理进程休眠的累计代价。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 200 | 1 ~ 10000 | segments;session;reload |
vacuum_cost_page_dirty
当清理修改一个之前干净的块时需要花费的估计代价。它表示再次把脏块刷出到磁盘所需要的额外 I/O。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 20 | 0 ~ 10000 | segments;session;reload |
vacuum_cost_page_hit
清理一个在共享缓存中找到的缓冲区的估计代价。它表示锁住缓冲池、查找共享哈希表和扫描页内容的代价。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 1 | 0 ~ 10000 | segments;session;reload |
vacuum_cost_page_miss
清理一个必须从磁盘上读取的缓冲区的代价。它表示锁住缓冲池、查找共享哈希表、从磁盘读取需要的块以及扫描其内容的代价。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 10 | 0 ~ 10000 | segments;session;reload |
异步行为(Asynchronous Behavior)
backend_flush_after
只要一个后端写入的数据量超过此参数值(BLOCKS)时,就会尝试强制 OS 把这些写入发送到底层存储。
- 这样做将会限制内核页高速缓存中的脏数据数量,降低在检查点末尾发出 fsync 时或者 OS 在后台大批写回数据时卡住的可能性。这常常会导致极大降低的事务延迟,但是也有一些情况中(特别是负载超过 shared_buffers 但低于 OS 的页面高速缓存时),性能可能会下降。
- 这个设置可能在某些平台上没有效果。
- 默认值为
0
,即禁用强制写回。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 0 | 0 ~ 256 | segments;session;reload |
effective_io_concurrency
设置 YMatrix 可以同时被执行的并发磁盘 I/O 操作的数量。
- 调高这个值,可以增加任何单个 YMatrix 会话试图并行发起的 I/O 操作的数目。允许的范围是
1
到1000
,或0
表示禁用异步 I/O 请求。 - 当前这个设置仅影响位图堆扫描。
- 对于磁盘驱动器,这个设置的一个很好的出发点是组成一个被用于该数据库的 RAID 0 条带或 RAID 1 镜像的独立驱动器数量(对 RAID 5 而言,校验驱动器不计入)。但是,如果数据库经常忙于在并发会话中发出的多个查询,那么较低的值可能就足以使磁盘阵列繁忙。比保持磁盘繁忙所需的值更高的值只会造成额外的 CPU 开销。SSD 以及其他基于内存的存储常常能处理很多并发请求,因此它们的最佳值可能是数百。
- 异步 I/O 依赖于一个有效的
posix_fadvise
函数(一些操作系统可能没有)。如果不存在这个函数,将这个参数设置为除0
之外的任何东西将导致错误。在一些操作系统上(如 Solaris)虽然提供了这个函数,但它不会做任何事情。 - 在支持的系统上默认值为
1
,否则为0
。 - 对于一个特定表空间中的表,可以通过设定该表空间的同名参数(见 ALTER TABLESPACE)可以覆盖这个值。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 1 | 0 ~ 1000 | segments;session;reload |
max_parallel_maintenance_workers
设置单一工具性命令能够启动的并行工作者的最大数目。
- 当前,唯一一种支持使用并行工作者的工具性命令是 CREATE INDEX,并且只有在构建 B-树索引 时才能并行。
- 并行工作者从由
max_worker_processes
创建的进程池中取出,数量由max_parallel_workers
控制。注意:实际在运行时所请求数量的工作者可能不可用。如果发生这种情况,工具性操作将使用比预期数量少的工作者运行。 - 默认值为 2。将这个值设置为 0 可以禁用工具性命令对并行工作者的使用。
- 注意:并行工具性命令不应该消耗比同等数量非并行操作更多的内存。这种策略与并行查询不同,并行查询的资源限制通常是应用在每个工作者进程上。并行工具性命令把资源限制
maintenance_work_mem
当作对整个工具性命令的限制,而不管其中用到了多少个并行工作者进程。不过,并行工具性命令实际上可能仍会消耗更多的 CPU 资源和 I/O 带宽。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 2 | 0 ~ 1024 | segments;session;reload |
max_parallel_workers
设置系统为并行操作所支持的工作者的最大数量。
- 在增加或者减小这个值时,也要考虑对
max_parallel_maintenance_workers
以及max_parallel_workers_per_gather
进行调整。 - 此外,要注意将这个值设置得大于
max_worker_processes
将不会产生效果,因为并行工作者进程都是从max_worker_processes
所建立的工作者进程池中取出来的。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 64 | 0 ~ 1024 | segments;session;reload |
max_parallel_workers_per_gather
设置单个 Gather 或者 Gather Merge 节点能够开始的工作者的最大数量。
- 并行工作者会从
max_worker_processes
建立的进程池中取得,数量由max_parallel_workers
限制。 - 注意:所要求的工作者数量在运行时可能实际无法被满足。如果这种事情发生,该计划将会以比预期更少的工作者运行,这可能会不太高效。
- 默认值是
2
。把这个值设置为0
将会禁用并行查询执行。 - 注意:并行查询可能消耗比非并行查询更多的资源,因为每一个工作者进程时一个完全独立的进程,它对系统产生的影响大致和一个额外的用户会话相同。在为这个设置选择值时,以及配置其他控制资源利用的设置(例如
work_mem
)时,应该把这个因素考虑在内。work_mem
之类的资源限制会被独立地应用于每一个工作者,这意味着所有进程的总资源利用可能会比单个进程时高得多。例如,一个使用 4 个工作者的并行查询使用的 CPU 时间、内存、I/O 带宽可能是不使用工作者时的 5 倍之多。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 2 | 0 ~ 1024 | master;session;reload |
max_worker_processes
设置系统能够支持的后台进程的最大数量。
- 在运行一个后备服务器时,你必须把这个参数设置为等于或者高于主控服务器上的值。否则,后备服务器上可能不会允许查询。
- 在更改这个值时,考虑也对
max_parallel_workers
、max_parallel_maintenance_workers
以及max_parallel_workers_per_gather
进行调整。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 69 | 1 ~ 262143 | segments;system;restart |
old_snapshot_threshold
设置在使用快照时,一个快照可以被使用而没有发生 snapshot too old
错误的风险的最小时间(分钟)。
- 超过此阈值时间的死数据将允许被清除。这可以有助于阻止长时间使用的快照造成的快照膨胀。为了阻止由于本来对该快照可见的数据被清理导致的不正确结果,当快照比这个阈值更旧并且该快照被用来读取一个该快照建立以来被修改过的页面时,将会产生一个错误。
- 值
-1
(默认值) 禁用此功能,实际上将快照的时限设置为无穷大。 - 对于生产工作有用的值的范围可能从几个小时到几天不等。只允许小的值(例如
0
或者1min
)是因为它们有时可能对测试有用。虽然允许高达86400分钟
(60天) 的设置,但是请注意很多负载情况下,很短的时间帧里就可能发生极大的膨胀或者事务 ID 回卷。 - 当这个特性被启用时,关系末尾的被清出的空间不能被释放给操作系统,因为那可能会移除用于检测
snapshot too old
情况所需的信息。所有分配给关系的空间还将与该关系关联在一起便于重用,除非它们被显式地释放(例如,用VACUUM FULL
)。 - 这个设置不会尝试保证在任何特殊情况下都会生成错误。事实上,如果(例如)可以从一个已经物化了一个结果集的游标中生成正确的结果,即便被引用表中的底层行已经被清理掉也不会生成错误。某些表不能被过早地安全清除,并且因此将不受这个设置的影响,例如系统目录。对于这些表,这个设置将不能降低膨胀,也不能降低在扫描时产生
snapshot too old
错误的可能性。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | -1 | -1 ~ 86400 | segments;system;restart |