一、非公开参数
GP中有些参数不是公开的,代码中使用 GUC_NO_SHOW_ALL 参数进行控制。此类参数有以下特征:
- 官方手册中查不到。
- “SHOW ALL”命令中不显示该参数。
- 参数键入过程中tab键词语联想时,不会自动补全。
- 可以被“SHOW”、“SET”和“RESET”。
例如,planner_work_mem就是一个非公开参数,代码中定义如下:
- snippet.cpp
{ {"planner_work_mem", PGC_USERSET, RESOURCES_MEM, gettext_noop("Sets the maximum memory to be used for query workspaces, " "used in the planner only."), gettext_noop("The planner considers this much memory may be used by each internal " "sort operation and hash table before switching to " "temporary disk files."), GUC_UNIT_KB | GUC_NOT_IN_SAMPLE | GUC_NO_SHOW_ALL }, &planner_work_mem, 32768, 2 * BLCKSZ / 1024, MAX_KILOBYTES, NULL, NULL, NULL },
二、资源管理类
gp_resource_manager
指示GP当前资源管理方式。缺省为资源队列(resource queue)管理方式。详见Managing Resources。
值范围 | 缺省 | 分级设置 |
———— | —– | ———————- |
group, queue | queue | local, system, restart |
gp_vmem_protect_segworker_cache_limit
如果一个查询处理进程消耗了超出配置的内存量,那么进程处理完成后不会被cache,以用于后续查询。有很多个连接或者空闲进程的系统可能需要削减此值以释放更多的segment内存。注意,此参数是本地参数,需要为每个segment设置。
值范围 | 缺省 | 分级设置 |
——- | —– | ———————– |
Boolean | false | master, session, reload |
gp_vmem_idle_resource_timeout
如果数据库会话长时间空闲,会话的资源(如共享内存)会被释放,但是仍然保持连接。这样可以允许更多的并发连接。
值范围 | 缺省 | 分级设置 |
——————– | —- | ———————- |
然后有效的时间表达式 | 18s | master, system, reload |
gp_workfile_limit_files_per_query
设置每条查询在每个segment上可以溢出的临时文件个数。0表示不限制,有操作系统控制。
值范围 | 缺省 | 分级设置 |
—— | —— | ———————– |
整型数 | 100000 | master, session, reload |
gp_workfile_limit_per_query
每条查询在每个segment上可以溢出的文件大小最大值,0表示不限制。
值范围 | 缺省 | 分级设置 |
—— | —- | ———————– |
KB | 0 | master, session, reload |
gp_workfile_limit_per_segment
每个segment允许所有查询溢出磁盘总大小,0表示不限制。
值范围 | 缺省 | 分级设置 |
—— | —- | ———————- |
KB | 0 | local, system, restart |
三、资源组管理类
注:本章参数仅资源组资源管理方式有效。
gp_resgroup_memory_policy
用于资源组管理算子内存分配策略。
- auto:GP将资源组限制的内存在查询算子之间分配,非内存敏感算子分配固定大小内存,剩下的分配给内存敏感算子。
- eager_free:GP分配内存更优化,已经执行完释放出来的内存将被重新分配给后续算子使用。
值范围 | 缺省 | 分级设置 |
—————– | ———– | —————————————- |
auto, eager_free | eager_free | local, system, superuser, restart/reload |
gp_resource_group_bypass
允许/禁用GP资源组并发事务限制,缺省值是false,表示允许资源组事务限制。可以将该参数值设为true,以立即旁路一个查询不受资源组资源限制。例如,可以设置该参数值为true,以便将某个关于系统表的查询旁路不受资源组限制。
当设置该参数值为true并运行一个查询时,该查询运行环境如下:
- 查询运行在资源组内。该查询的资源组分派不变。
- 每个查询的内存配额约10MB。内存从资源组共享内存或者全局共享内存分配。如果请求的内存超出了共享内存,查询失败。
该参数设置可以是session级的。参数可以在一个事务或者一个函数中设置。
值范围 | 缺省 | 分级设置 |
——- | —– | ——– |
Boolean | false | session |
gp_resource_group_cpu_limit
指示资源组每个GP segment节点可以使用的CPU资源最大百分比。
值范围 | 缺省 | 分级设置 |
——— | —- | ———————- |
0.1 - 1.0 | 0.9 | local, system, restart |
gp_resource_group_memory_limit
指示资源组每个GP segment节点可以使用的内存资源最大百分比。
值范围 | 缺省 | 分级设置 |
——— | —- | ———————- |
0.1 - 1.0 | 0.7 | local, system, restart |
当使用资源组时,内存将均分给segment主机上的活动的主segment。GP给起主作用的主segment分配内存。即使是故障转移(failover),分配的初始内存不会改变。这就意味着,segment主机上实际使用内存可以会超出gp_resource_group_memory_limit设定的限制。
例如,假设GP集群使用缺省gp_resource_group_memory_limit配置0.7,有个名为seghost1的segment主机上有4ge主segment和4个镜像segment。GP会为seghost1上每个segment指派系统内存的(0.7 / 4 = 0.174%)。如果发生故障转移,seghost1有2个镜像segment故障转移成为主segment,4个原始的主segment仍然保留0.174%系统内存,2个新的主segment每个分配(0.7 / 6 = 0.116%)系统内存。seghost1所有内存分配: $$ 0.7 + (0.116 * 2) = 0.932\% $$
memory_spill_ratio
设置内存敏感算子内存使用比例上限。当事务使用内存超限时,将溢出到磁盘。缺省值是资源组指派给当前活动角色的memory_spill_ratio值。可以为每个session单独设置。
参数值可以是0到100。如果设置为0,GP将使用statement_mem参数值。
值范围 | 缺省 | 分级设置 |
——- | —- | ———————– |
0 - 100 | 20 | master, session, reload |
gp_resgroup_memory_policy_auto_fixed_mem
非公开参数(手册查不到)。
当使用eager_free内存分配策略时,该参数指定非内存敏感算子内存大小,默认100KB。
四、资源队列管理类
注:本章参数仅资源队列资源管理方式有效。
gp_vmem_protect_limit
设置单个活动的segment实例的所有进程可以使用的内存总量(单位:MB)。如果某个查询引发超限,将不会被分配内存,查询失败。注意,这是一个本地参数,每个segment必须单独设置(主和镜像segment)。设置此值时,只能使用数字。例如,4096表示设置4096MB。请勿添加MB单位。
为了避免内存超限,以下方法可以评估一个安全的gp_vmem_protect_limit值。
首先计算gp_vmem。这是一个GP主机可以使用的内存:
$$ gp\_vmem = \frac {(SWAP + RAM) - (7.5GB + 0.05 * RAM)} {1.7} $$ 这里,SWAP是主机swap大小,RAM是物理内存大小,单位为GB。
接下来,计算max_acting_primary_segments,这是发生故障时,主机上运行的最大主segment个数。例如,如果将镜像规划在每个主机8个主segment的4台主机中,那么当单个segment主机故障时,将在其余主机上激活2或3个镜像segment。则max_acting_primary_segments为11(8个segment加上3个镜像segment)。
这样就可以推算出gp_vmem_protect_limit(转换成MB): $$ gp\_vmem\_protect\_limit = \frac {gp\_vmem} {max\_acting\_primary\_segments} $$ 对于有大量workfile生成的情形,gp_vmem可以根据workfiles数计算: $$ gp\_vmem = \frac {(SWAP + RAM) - (7.5GB + 0.05 * RAM - (300KB * total\_\#\_workfiles))} {1.7} $$ 基于gp_vmem值可以计算出操作系统内核参数vm.overcommit_ratio。 $$ vm.overcommit\_ratio = \frac {RAM - (0.026 * gp\_vmem)} {RAM} $$ 注:Red Hat Enterprise Linux的vm.overcommit_ratio参数缺省值为50。
值范围 | 缺省 | 分级设置 |
—— | —- | ———————- |
整形数 | 8192 | local, system, restart |
gp_resqueue_memory_policy
- eager_free:发挥了GP4.2之后的计划优势,GP4.2之后不是所有算子同时执行的,计划被分割成多步,先执行完的算子释放内存后,内存被重新分配给后续步骤算子。
- none:内存管理同GP4.1及之前版本。
- auto:查询内存受statement_mem和资源队列内存限制。
值范围 | 缺省 | 分级设置 |
———————– | ———– | —————————– |
none, auto, eager_free | eager_free | local, system, restart/reload |
gp_resqueue_priority
允许/禁止查询优先级。当参数设置为禁止时,查询不会使用已有的优先级设置。
值范围 | 缺省 | 分级设置 |
——- | —- | ———————- |
Boolean | on | local, system, restart |
gp_resqueue_priority_cpucores_per_segment
指定分配给每个segment实例CPU单元数。例如,在一台有10个CPU核的GP集群主机上配置了4个segment,那么设置该值为2.5。对于master实例,该值应该为10。对于一个典型的仅有一个master运行的主机,此值可以为所有可以CPU核数。
不当的配置,可能会造成CPU利用率不足或者查询优先级不能达到设计的预期。
值范围 | 缺省 | 分级设置 |
———– | —- | ———————- |
0.1 - 512.0 | 4 | local, system, restart |
gp_resqueue_priority_sweeper_interval
指定清理进程评估CPU使用率的时间间隔。当激活一个新的语句时,其优先级和CPUshare每隔设定周期被重新评估。
值范围 | 缺省 | 分级设置 |
————- | —- | ———————- |
500 - 15000ms | 1000 | local, system, restart |
gp_resqueue_memory_policy_auto_fixed_mem
非公开参数(手册查不到)。
当使用eager_free内存分配策略时,该参数指定非内存敏感算子内存大小,默认100KB。
五、性能
gp_workfile_compression
指示是否压缩聚集和hash join算子溢出的临时文件。
如果GPDB安装在ATA(SATA)磁盘驱动器上,启用该标志可能会有助于减轻磁盘IO负载压力。
值范围 | 缺省 | 分级设置 |
——- | —- | ———————– |
Boolean | off | master, session, reload |