性能参数调优
AnalyticDB PostgreSQL版是一个开箱即用的产品,默认配置就适用大多数应用场景,但是您依然可以通过数据库配置参数对系统进行微调,以更好的性能满足特定的业务场景。
参数生效级别
AnalyticDB PostgreSQL的参数分为如下四个级别,部分参数只能在固定级别设置。
级别 | 生效范围 | 设置方法 |
SYSTEM级别 | 对该实例的所有库所有用户生效。 | 需要提交工单,由运维人员协助修改。 |
DATABASE级别 | 对设置的数据库的所有会话生效。 | 设置命令如下:
|
ROLE级别 | 对设置的用户的所有会话生效。 | 设置命令如下:
|
SESSION级别 | 对当前会话生效。 | 设置命令如下:
|
目前支持提交工单修改的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_conns加rds_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越大。