GBase 8c 是一种支持多模式的分布式事务数据库。本文为使用者与开发者提供性能优化的实用建议,旨在通过调整操作系统和数据库配置,合理分配资源如 CPU、内存、I/O 和网络,提升系统整体性能与查询效率。
一、操作系统优化
为了提高数据库的运行效率,可以根据业务需求对操作系统关键配置进行调整。
准备工作
使用工具 gs_check 检测当前操作系统参数是否达到建议值。如存在差异,需结合实际需求进行修改。
内存配置
通过编辑 sysctl.conf 文件,将内存参数 vm.extfrag_threshold 设置为推荐值 1000。若参数不存在,可自行添加。
vim /etc/sysctl.conf
修改完成后,请执行如下命令,使参数生效。
sysctl-p
修改完成后,请执行如下命令,使参数生效。
sysctl-p
网络相关参数设置
配置 “sysctl.conf” 文件,修改网络相关参数,如果文件中没有网络相关参数,可以手动添加。
vim /etc/sysctl.conf
在修改完成后,请执行如下命令,使参数生效。
sysctl-p
为确保数据库能够高效运行,应结合硬件资源和实际业务需求,合理配置数据库系统参数(GUC 参数)。
二****、数据库内存优化****
数据库内存配置对复杂查询性能至关重要,主要涉及逻辑内存管理参数和算子执行时的内存分配。
逻辑内存管理
逻辑内存管理的核心参数为 max_process_memory,用于限制单节点的最大内存占用。其计算公式如下:
max_process_memory = 可用内存总量 - shared memory(包括 shared_buffers)- cstore_buffers
其中,shared_buffers 和 cstore_buffers 是影响作业内存的关键参数。
为了查看数据库节点的内存使用详情,可以通过以下视图查询:
- 连接单个节点:使用 pg_total_memory_detail 查看内存区域的使用和峰值。
- 连接主节点:使用 pgxc_total_memory_detail 查询多节点的内存分布。
参数 work_mem 调优
work_mem 参数决定单个查询执行算子的内存分配。一旦超出设置值,数据将写入临时磁盘空间,可能导致性能显著下降(响应时间从秒级延迟到分钟级)。推荐设置如下:
- 对于复杂查询(5-10 个关联操作,无并发):work_mem = 总内存的 50% ÷ 10
- 对于简单查询(2-5 个关联操作,无并发):work_mem = 总内存的 50% ÷ 5
- 对于并发场景:work_mem = 串行情况下的 work_mem ÷ 并发数
此外,work_mem 的设置会影响算子的 “下盘” 行为。常见的可下盘算子包括:
- Hash/VecHashJoin
- Agg/VecAgg
- Sort/VecSort
- Material/VecMaterial
- SetOp/VecSetOp
- WindowAgg/VecWindowAgg
调优时需平衡并发吞吐量和单作业性能,建议结合实际查询(通过 Explain Performance 输出)进行分析后调整。
三、 数据库并发优化
数据库支持全局并发队列和局部并发队列两种控制方式。
全局并发队列
全局并发队列通过参数 max_active_statements 限制主节点的并发作业数。当作业数达到上限时,后续作业将排队等待。管理员执行的任务不受此限制。
设置此参数时,应综合考虑系统内存和 I/O 的使用情况:
- 事务型高并发场景:max_active_statements = -1(不限并发数)。
- 分析型查询场景:max_active_statements = CPU 核数 ÷ 数据库节点数,推荐值为 5~8。
局部并发队列
局部并发队列用于限制单个资源池内的并发作业数,依据作业复杂度(cost 值)进行调控。参数 parctl_min_cost 用于定义复杂作业的最低判定标准,从而平衡资源池的使用效率。