一、内存参数调优
数据库的复杂查询语句性能非常强的依赖于数据库系统内存的配置参数。数据库系统内存的配置参数主要包括逻辑内存管理的控制参数和执行算子是否下盘的参数:
1.逻辑内存管理参数:max_process_memory
max_process_memory – shared memory ( 包括shared_buffers ) – cstore_buffers
根据上述计算公式可以看出影响执行作业可用内存参数的主要两个参数为shared_buffers及cstore_buffers
2.共享内存参数:shared_buffers
设置实例使用的共享内存大小。增加此参数的值会使openGauss比系统默认设置需要更多的System V共享内存。
3.列存共享缓冲区:cstore_buffers
列存表使用cstore_buffers设置的共享缓冲区,几乎不用shared_buffers。因此在列存表为主的场景中,应减少shared_buffers,增加cstore_buffers。
4.逻辑内存查询
逻辑内存管理有专门的视图查询数据库节点中各大块内存区域已使用内存及峰值信息。
select * from PG_TOTAL_MEMORY_DETAIL;
5.work_mem
内部排序操作和Hash表在开始写入临时磁盘文件之前使用的内存大小:work_mem
二、逻辑内存管理模块
逻辑内存管理模块参数:enable_memory_limit
设置enable_memory_limit为true,即启用内存管理模块,可用于限制进程的内存使用。当其他参数配置不满足数据库启动条件时,则启动失败,并给出提示。
-
用户设置enable_memory_limit=true,但其他参数配置不满足条件,则数据库启动失败,并提示原因:
- 如果用户设置enable_memory_limit=false, 启动成功并且提示风险
三、IO参数调优
1.pagewriter_sleep
增量checkpoint模式下,控制后端写线程pagewriter刷页频率,当脏页占据shared_buffers的比例达到dirty_page_percent_max时,每批脏页数量以设定的max_io_capacity计算出的值刷页。
pagewriter线程刷页用于推进recovery点,设置时间较长时,会导致recovery点推进慢,宕机启动时间长和xlog日志堆积问题。
为降低RTO,减少日志膨胀,需要将pagewriter_sleep适当调小,加快页面刷盘,推进recovery点,促进日志回收。
2.bgwriter_delay
增量checkpoint模式下,控制后端写线程bgwriter刷页频率,当前空闲缓冲页面个数占据shared_buffers的比例低于candidate_buf_percent_target时,每批脏页数量以设定的max_io_capacity计算出的值刷页。
bgwriter线程将可以淘汰的页面刷盘,加速业务执行时,页面占用槽位的速度,时间过长会影响性能。
为了提升业务性能时,适当调小bgwriter_delay的时间
3.max_io_capacity
设置后端写线程(pagewriter线程和bgwriter线程)批量刷页每秒的I/O上限,需要根据具体业务场景和机器磁盘I/O能力进行设置。
要求RTO很短时间或者数据量比共享内存大多倍的情况,业务访问数据量又是随机访问时,该值不宜过小。该参数设置较小会减小后端写线程刷页个数,如果业务触发页面淘汰多时,该值设置小会影响业务。
max_io_capacity需依据随机写I/O能力进行最优设置。
四、常见问题
1.work_mem 参数设置得太小
在 openGauss数据库中,work_mem 参数指定了每个运行的内部排序操作或哈希表操作使用的内存量。如果将 work_mem 参数设置得太小,可能会导致以下一些常见问题:
临时文件使用增加: 当内存不足以执行排序或哈希操作时,openGauss可能会将部分数据存储在临时文件中进行处理。这会增加磁盘 I/O 操作,导致查询性能下降,并可能对系统的整体性能产生负面影响。
性能下降: 当 work_mem 设置得太小时,数据库可能不得不频繁地将数据分成更小的块进行处理,这可能会导致性能下降。特别是对于需要进行大量内部排序或哈希操作的查询,性能影响可能尤为明显。
查询超时: 对于需要大量内存的查询,如果 work_mem 设置得太小,可能会导致查询超时或被取消。这可能会影响用户体验,并且可能导致某些查询无法完成。
资源争用: 如果多个并发查询都需要大量内存,但 work_mem 设置得太小,可能会导致资源争用和竞争条件,进而影响系统的整体稳定性和性能。
2.I/O 操作较大
性能下降: 大量的 I/O 操作可能会导致数据库性能下降,因为 I/O 操作通常是数据库中最耗费资源的操作之一。特别是在磁盘 I/O 受限的情况下,数据库的响应时间可能会显著增加。
查询响应时间增加: 如果数据库需要频繁地从磁盘读取或写入数据,查询的响应时间可能会显著增加。这可能会影响用户体验,并导致用户感觉到数据库反应不及时。
并发性能下降: 当大量的 I/O 操作发生时,数据库可能会面临并发性能下降的问题。例如,如果多个用户同时执行大量的查询或写操作,磁盘可能会成为瓶颈,导致查询响应时间增加或甚至查询超时。
数据一致性问题: 如果数据库在执行写操作时发生故障或意外关闭,可能会导致数据一致性问题,因为尚未写入磁盘的数据可能会丢失或损坏。因此,高 I/O 负载下的数据库需要确保适当的备份和恢复策略,以最大程度地减少数据丢失的风险。
五、总结
CPU通常情况下并没有多少调优手段,依赖于厂商调校。所以需要与服务器厂商充分沟通。研读厂商技术手册。
I/O性能指标通常有:使用率、饱和度、IOPS(Input/Output Per Second)吞吐量、响应时间。通过选择不同的文件系统、缓存配置以及数据库参数pagewriter_sleep、bgwriter_delay等进行调优。
网络的性能指标通常有:带宽、延时、吞吐量、PPS,网络性能通常情况下较难诊断,若为生产环境建议部署监控。
数据库中可以通过内存参数work_mem、shared_buffers等进行调优,或者根据实际情况选择是否开启参数enable_memory_limit。