常见性能参数调优设计
在使用数据库的时候,为了提高集群的性能,有多种方式去调优,从硬件配置到软件驱动升级,再到数据库的内部参数调整。本章节旨在介绍一些常用参数以及推荐配置。
- query_dop :用户自定义的查询并行度
SMP架构是一种利用富余资源来换取时间的方案,计划并行之后必定会引起资源消耗的增加,包括CPU、内存、I/O和网络带宽等资源的消耗都会出现明显的增长,而且随着并行度的增大,资源消耗也随之增大。
- 当资源成为瓶颈的情况下,SMP无法提升性能,反而可能导致性能的劣化。在出现资源瓶颈的情况下,建议关闭SMP。
- 当资源许可的情况下,并行度越高,性能提升效果越好。
SMP并行度支持会话级设置,推荐在执行符合要求的查询前,打开SMP,执行结束后,关闭SMP。以免在业务峰值时,对业务造成冲击。
query_dop的默认值是1, 可通过set query_dop=10,在会话中打开SMP。
- enable_dynamic_workload:动态负载管理
动态负载管理指数据库内部根据用户负载情况,自动对复杂查询进行队列控制,不再需要手动设置参数,做到系统参数免调优。
该参数默认打开,需要注意以下几点。
- 集群有一个CN会作为中心协调节点(CCN),用于收集和调度作业执行,该节点可以通过gs_om -t status --detail查询到,Central Coordinator State会显示其状态。当CCN不存在时,作业不再受动态负载管理控制。
- 简单查询作业(估算值<32MB)、非DML(即非INSERT、UPDATE、DELETE和SELECT)语句,不走自适应负载,需要通过max_active_statements来进行单CN的上限控制。
- 默认work_mem数值为64MB,在自适应负载特性下,该数值不能变大,否则会引起内存不受控(例如未做Analyze的语句)。
- 以下场景或语句由于内存使用特殊性和不确定性,可能导致大并发场景内存不受控,如果遇到需要降低并发数。
- 单条元组占用内存过大的场景,例如,基表包含超过MB级别的宽列。
- 完全下推语句的查询。
- 需要在CN上耗费大量内存的语句,例如,不能下推的语句,withhold cursor场景。
- 由于计划生成不当导致hashjoin算子建立的hash表重复值过多,占用大量内存。
- 包含UDF的场景,且UDF中使用大量内存的场景。
该参数可配合query_dop=0使用,当query_dop设置为0(自适应),系统会根据资源情况和计划特征,动态为每个查询选取[1,8]之间的最优的并行度。enable_dynamic_workload参数会动态分配内存。
- max_active_statements
设置全局的最大并发数量。此参数只应用到CN,且针对一个CN上的执行作业。
需根据系统资源(如CPU资源、IO资源和内存资源)情况,调整此数值大小,使得系统支持最大限度的并发作业,且防止并发执行作业过多,引起系统崩溃。
- 当取值-1或者0时,不限制全局并发数。
- 在点查询的场景下,参数建议设置为100。
- 在分析类查询的场景下,参数的值设置为CPU的核数除以DN个数,一般可以设置5~8个。
- session_timeout
缺省情况下,客户端连接数据库后处于空闲状态时会根据参数的默认值自动断开连接。
建议设成0,表示关闭超时设置,以防止超时断连。
- 影响数据库内存的五大参数:
max_process_memory、shared_buffers、cstore_buffers、work_mem和maintenance_work_mem。
- max_process_memory
max_process_memory是逻辑内存管理参数,主要功能是控制单个CN/DN上可用内存的最大峰值。
计算公式:max_process_memory=物理内存*0.665/(1+主DN个数)。
- shared_buffers
设置DWS使用的共享内存大小。增加此参数的值会使DWS比系统默认设置需要更多的System V共享内存。
建议设置shared_buffers值为内存的40%以内。主要用于行存表scan。计算公式:shared_buffers=(单服务器内存/单服务器DN个数)*0.4*0.25
- work_mem
设置内部排序操作和Hash表在开始写入临时磁盘文件之前使用的内存大小。
ORDER BY,DISTINCT和merge joins都要用到排序操作。Hash表在散列连接、散列为基础的聚集、散列为基础的IN子查询处理中都要用到。
对于复杂的查询,可能会同时并发运行好几个排序或者散列操作,每个都可以使用此参数所声明的内存量,不足时会使用临时文件。同样,好几个正在运行的会话可能会同时进行排序操作。因此使用的总内存可能是work_mem的好几倍。
计算公式:
对于串行无并发的复杂查询场景,平均每个查询有5-10关联操作,建议work_mem=50%内存/10。
对于串行无并发的简单查询场景,平均每个查询有2-5个关联操作,建议work_mem=50%内存/5。
对于并发场景,建议work_mem=串行下的work_mem/物理并发数。
- maintenance_work_mem
maintenance_work_mem用来设置维护性操作(比如VACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY等)中可使用的最大的内存。
设置建议:
建议设置此参数的值大于work_mem,可以改进清理和恢复数据库转储的速度。因为在一个数据库会话里,任意时刻只有一个维护性操作可以执行,并且在执行维护性操作时不会有太多的会话。
当自动清理进程运行时,autovacuum_max_workers倍数的内存将会被分配,所以此时设置maintenance_work_mem的值应该不小于work_mem。
- max_process_memory
- bulk_write_ring_size
该参数主要影响入库性能,建议导入压力大的场景增加DN上的该参数配置。
- 连接两大参数:
max_connections取值的设置受max_prepared_transactions的影响,在设置max_connections之前,应确保max_prepared_transactions的值大于或等于max_connections的值,这样可确保每个会话都有一个等待中的预备事务。
- checkpoint_completion_target
含义是每个checkpoint需要在checkpoints间隔时间的50%内完成。
默认值为0.5,为提高性能可改成0.9。
- data_replicate_buffer_size
发送端与接收端传递数据页时,队列占用内存的大小。此参数会影响主备之间复制的缓冲大小。
默认值为128MB,若服务器内存为256G,可适当增大到512MB。
- wal_receiver_buffer_size
默认值为64MB,若服务器内存为256G,可适当增大到128MB。