# 一、非公开参数 GP中有些参数不是公开的,代码中使用 GUC\_NO\_SHOW\_ALL 参数进行控制。此类参数有以下特征: - 官方手册中查不到。 - “SHOW ALL”命令中不显示该参数。 - 参数键入过程中tab键词语联想时,不会自动补全。 - 可以被“SHOW”、“SET”和“RESET”。 例如,planner\_work\_mem就是一个非公开参数,代码中定义如下: ```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](https://gpdb.docs.pivotal.io/6-9/admin_guide/wlmgmt.html)。 | 值范围 | 缺省 | 分级设置 | | ------------ | ----- | ---------------------- | | 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 | # 六、参考 - [Configuration Parameters](https://gpdb.docs.pivotal.io/6-9/ref_guide/config_params/guc-list.html)