性能参数调优

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 | = } { 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

50

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个数也算上,如果这个值设置的过小,会导致查询失败,需要对这个值进行调整。

    说明

    如需对资源队列的内存进行限制,建议修改资源队列相关参数,具体信息,请参见使用Resource Queue(资源队列)进行负载管理

    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越大。