AnalyticDB PostgreSQL是一个开箱即用的产品,默认配置就适用大多数应用场景,但是您依然可以通过数据库配置参数对系统进行微调,以最好的性能满足特定的业务场景。

参数生效级别

AnalyticDB PostgreSQL的参数分为如下四个级别,部分参数只能在固定级别设置。

级别 生效范围 设置方法
SYSTEM级别 对该实例的所有库所有用户生效。 需要提交工单,由运维人员协助修改。
DATABASE级别 对设置的数据库的所有会话生效。 设置命令如下:
ALTER DATABASE name SET parameter { TO | = } { value | DEFAULT };
ROLE级别 对设置的用户的所有会话生效。 设置命令如下:
ALTER ROLE name SET parameter  { TO | = } { value | DEFAULT };
SESSION级别 对当前会话生效。 设置命令如下:
SET parameter TO   { TO | = } { value | DEFAULT };

目前支持提交工单修改的SYSTEM层参数如下:

参数名 默认值 单位 取值范围
gp_autostats_mode ON_NO_STATS STRING [NONE|ON_CHANGE|ON_NO_STATS]
gp_autostats_mode_in_functions NONE STRING [NONE|ON_CHANGE|ON_NO_STATS]
gp_max_slices 500 INT [0~1000]
log_rotation_size 102400 kB [0~4194304]
master.rds_enable_vmem_protect on STRING [on|off]
master.rds_max_non_super_conns 500 INT [10~1000]
max_stack_depth 2048 kB [100~2048000]
max_statement_mem 2048000 kB [32768~2147483647]
optimizer on STRING [on|off]
random_page_cost 4 DOUBLE [0~1000]
rds.rds_enable_aliyun_oss_endpoint on STRING [on|off]
rds.rds_enable_oss_endpoint_whitelist_check on STRING [on|off]
rds_max_super_conns 50 INT [10~100]
segment.rds_enable_vmem_proctect off STRING [on|off]
segment.rds_max_non_super_conns 1000 INT [10~3000]
statement_mem 2047000 kB [50~2147483647]
statement_timeout 10800000 INT [0~2147483647]
说明 建议您优先适用SESSION级别设置参数,当确认不会对业务其他用户产生副作用时,再设置为更高级别的参数。

参数说明

AnalyticDB PostgreSQL与性能有关的参数可以分为以下几类:

  • 连接相关参数
    参数 生效条件 依赖关系 描述
    max_connections 重启实例生效 Segment节点的值需要是Master节点的3~5倍。 max_connections与数据库服务器并发连接的最大数量,是实例连接总数的硬性值,在master和segment上需要分布设置,一般不建议调整这个值,而是调整rds_max_non_super_conns,目前初始值是500,如果业务的并发短连接的场景,可以适当调大这个值,但最大不超过max_connections的值;rds_max_super_conns是super user的连接控制参数,一般也不需要调整。
    max_prepared_transactions 重启实例生效
    • 推荐与max_connections一致。
    • max_prepared_transactions参数的值乘以2应大于rds_max_non_super_connsrds_max_super_conns的值。
    这个参数是实例中处于两阶段提交状态的事务数,初始设置为与max_connections的大小一致,如果在高并发的场景下报错,需要增加这个值。
    rds_max_non_super_conns Reload Config生效
    • 应小于max_connections的值。
    • rds_max_non_super_conns的值与rds_max_super_conns的值的和应小于等于max_connections的值。
    • Segment节点的值需要是Master节点的3~5倍。
    非super user用户最多可用连接数。
    rds_max_super_conns Reload Config生效
    • 应小于max_connections的值。
    • rds_max_non_super_conns的值与rds_max_super_conns的值的和应小于等于max_connections的值。
    • Segment节点的值需要是Master节点的3~5倍。
    super user用户最多可用连接数。
  • 内存控制参数
    参数 取值范围 生效条件 依赖关系 描述
    shared_buffers 千字节数 重启实例生效 行存为主条件下,Segment值设置为实例内存规格的25%,可适当增大。 这个参数主要是控制共享缓冲区大小,需要在Master和Segment上分别进行设置。Master上的缓存页面主要是数据字典表,Segment上缓存页面主要行存表,AOCS表不受共享缓冲区的影响。一般情况下不需要用户修改这个值。如果业务创建的表较多(>10万)考虑在Master和Segment上增加这个值;如果存储以行存表为主,在Segment上增加这个值。
    temp_buffers 千字节数 Reload Config生效 称之为临时缓冲区,用于数据库会话访问临时表数据,系统默认值为8M。可以在单独的Session中对该参数进行设置,尤其是需要访问比较大的临时表时,将会有显著的性能提升。
    gp_vmem_protect_limit 千字节数 重启实例生效 gp_vmem_protect_limit = gp_vmem / acting_primary_segments 设置segment的所有postgres进程可以使用的内存量(以MB为单位)。如果查询超出该限制,系统不会分配内存,查询将失败。请注意,这是本地参数,必须为系统中的每个segment(包括primary和mirror)设置。

    为了防止内存的过度分配,可以按照下面的估计一个安全的gp_vmem_protect_limit值:

    gp_vmem = ((SWAP + RAM) – (7.5GB + 0.05 * RAM)) / 1.7
    gp_vmem_protect_limit = gp_vmem / acting_primary_segments

    acting_primary_segment 使用segments数目进行估计,保守一些可以将mirror个数也算上,如果这个值设置的过小,会导致查询失败,需要对这个值进行调整。

    gp_vmem_protect_segworker_cache_limit 千字节数 重启实例生效 查询执行器进程缓存的限制值。具有大量连接或空闲进程的系统可能希望减少这个值以释放segment上的更多内存。这是一个本地参数,必须为每个segment设置。
    gp_resqueue_memory_policy none、auto、eager_free Reload Config生效 启用AnalyticDB PostgreSQL内存管理的功能。一般查询计划被分成几个阶段,如果设置为eager_free 数据库将在该阶段结束时急速释放分配给前一个阶段的内存,然后将新的内存分配给新阶段,使用这个参数会降低查询执行阶段内存不足的可能性,但也会带来额外的性能开销。当设置为auto,查询内存使用情况由statement_mem和资源队列内存限制来控制。
    statement_mem 千字节数 Reload Config生效
    • gp_resqueue_memory_policy设置为auto时生效。
    • 不超过max_statement_mem的值。
    为每个查询分配主机内存。使用此参数分配的内存量不能超过max_statement_mem或查询提交的资源队列上的内存限制。当gp_resqueue_memory_policy=auto时,statement_mem和资源队列内存限制了查询内存的使用。

    如果查询需要额外的内存,则会使用磁盘上的临时溢出文件。

    该计算可用于估计各种情况下的合理值。

    ( gp_vmem_protect_limit GB * 0.9 ) / max_expected_concurrent_queries

    将gp_vmem_protect_limit设置为 8192MB (8GB) 并假设最大40个并发查询和10%的缓冲区。

    (8GB * 0.9) / 40 = 184MB

    由于gp_resqueue_memory_policy设置为eager ,默认情况下此参数并没有实际生效。

    max_statement_mem 千字节数 Reload Config生效 (seghost_physical_memory) / (average_number_concurrent_queries) 设置查询的最大内存限制。将statement_mem设置得太高,有助于在查询处理期间避免segment主机上的内存不足的错误。当gp_resqueue_memory_policy=auto时, statement_mem 和资源队列内存限制了控制查询内存的使用。考虑到单个段主机的配置,计算该设置如下:

    (seghost_physical_memory) / (average_number_concurrent_queries)

  • 工作负载相关参数
    参数 取值范围 生效条件 依赖关系 描述
    gp_resqueue_priority Boolean 重启实例生效 启用或者禁用查询优先级。禁用此参数时,不会再查询运行时评估现有的优先级设置。如果业务对查询性能要求较高,可以考虑关闭优先级队列。
    gp_resqueue_priority_cpucores_per_segment 0.1~512.0 重启实例生效 指定每个segment实例分配的CPU单元数,这个参数在实例创建阶段就分配完成,不正确的设置可能导致CPU使用率不足或查询优先级不能按照设计工作。
    gp_resqueue_priority_sweeper_interval 500ms~15000ms 重启实例生效 gp_resqueue_priority CPU时间片统计间隔,SQL执行时,计算它的share值(根据优先级以及计算gp_resqueue_priority_cpucores_per_segment出来)。越小越频繁,优先级设置带来的效果越好。但是overhead越大。