GaussDB性能优化:你踩过哪些坑?
GaussDB性能优化:你踩过哪些坑?
在数据库技术领域,性能调优一直是一个备受关注的话题。无论是大型企业的关键业务还是初创公司的项目,数据库性能都直接影响到业务运行和用户体验。本文将结合GaussDB的特点,从多个维度探讨数据库性能调优的策略和实践。通过综合考虑硬件、操作系统、数据库设计等多方面因素,采取针对性的优化措施,有效提升GaussDB的性能表现。分享你在实际操作中的经验或遇到的问题,让我们一起交流学习!
性能调优的整体思路
GaussDB总体性能调优的思路是:先进行性能瓶颈点分析,找到相应的瓶颈点之后,再针对性地进行优化,直到系统性能到达业务可接受的范围内。
调优思路,如图1所示:
首先,应该确认应用压力是否传递到数据库,可以通过分析数据库节点的资源使用情况,如CPU、I/O、内存以及数据库线程池、活跃会话等信息来辅助判断。GaussDB数据库的管控平台提供了丰富的监控指标体系,便于性能分析人员查看数据库的实时或者历史资源使用情况。
登录管控平台后,进入监控巡检菜单,选择监控大盘,即可查看对应实例的CPU/内存使用率,如图2所示:
点击磁盘/存储菜单,可以查看磁盘I/O使用率,重点关注磁盘读写速率以及时延是否符合预期,如图3所示:
点击网络菜单,可以查看网络传输速率及网卡是否有丢包、错包等情况,如图4所示:
选择连接菜单,可以查看数据库的连接及会话状态,如图5所示:
图5中,如果活跃会话的占比远低于应用的并发数,说明数据库中大量会话处于空闲状态。同时,如果CPU使用率也很低,那么,就可以判断压力没到达数据库,此时需要排查应用端是否存在瓶颈。
导致应用侧瓶颈的问题比较常见的原因有:
- 应用服务器资源瓶颈。比如,应用服务器的CPU满载,应用程序内存分配不足等;
- 应用到数据库网络问题。比如,网络时延高,带宽满,存在丢包现象等;
- 应用自身逻辑处理速度慢;
- 应用配置不优,比如连接池参数、内存相关配置等设置不当。
例如,某个客户通过 jmeter 做大并发压测,性能不及业务预期。经过分析,发现是 jmeter 工具分配的最大可用内存不足,导致压力没有到达数据库。通过修改如下配置,问题得到了解决。
编辑jmeter.sh文件:set HEAP=-Xms1g -Xmx4g
确认压力到达数据库后,再针对相应的瓶颈点进行分析优化。主要从以下两个方面进行:
1)排查数据库中是否存在性能不优的业务SQL语句,并对性能不优的SQL进行优化。通过如下语句,查看数据库中耗时高的TOP SQL语句,并对那些执行性能不符合预期的SQL语句逐一进行分析与调优。
select unique_sql_id,substr(query,1,50) as query ,n_calls,round(total_elapse_time/n_calls/1000,2) avg_time,round(total_elapse_time/1000,2) as total_time from dbe_perf.summary_statement t where n_calls>10 and avg_time>3 and user_name='root' order by total_time desc;
如图6所示,n_calls 表示该SQL语句在数据库中的执行次数,avg_time 为该SQL 语句的平均执行时间,total_time 为该SQL语句的总耗时。对于平均执行时间超过阈值的SQL语句,重点进行分析与优化。
针对执行性能不优的SQL语句,通过unique_sql_id可以查看该SQL语句的执行详情,帮助分析SQL语句的性能瓶颈点。
select * from dbe_perf.statement where unique_sql_id=3508314654;
如图7所示,该视图记录了SQL语句在数据库的详细执行情况,比如,总执行次数(n_calls)和总耗时(total_elapse_time),便于获取该SQL的总耗时以及平均耗时。
行活动,包括随机扫描、顺序扫描行数、返回的行数、插入/更新/删除的行数以及buffer命中的页面数等信息。此外,还记录了软解析(n_soft_parse)、硬解析(n_hard_parse)的次数,比如SQL大量硬解析导致的数据库CPU飚高,可以通过该指标进行分析定位。
时间模型,包含db_time、cpu_time、execution_time、plan_time、data_io_time、net_send_info、net_recv_info、sort_time以及hash_time等指标,有助于判断SQL在数据库中的时间消耗在哪个阶段。例如,若某环境磁盘性能不佳,则data_io_time的耗时占比就会比较高。
如果需要进一步分析SQL本身的性能问题,比如执行计划是否最优、索引是否最优等性能问题,可以借助SQL的执行计划进行分析。
通过如下方式,可查看SQL的执行计划:
explain analyze SELECT c_id FROM bmsql_customer WHERE c_w_id = 1 AND c_d_id = 1 AND c_last = 'ABLEABLEABLE' ORDER BY c_first;
结合SQL的执行计划,分析SQL性能的瓶颈点,再进行性能优化,如图8所示:
2)从系统层面进行操作系统级和数据库系统级的调优,充分利用机器的CPU、内存、I/O和网络资源,避免资源冲突,从而提升整个系统查询的吞吐量。
具体优化方法和案例
- 选择合适的分布列
a.现象描述
表定义如下:
CREATE TABLE t1 (a int, b int);
CREATE TABLE t2 (a int, b int);
执行如下查询:
SELECT * FROM t1, t2 WHERE t1.a = t2.b;
b.优化分析
如果将a作为t1和t2的分布列:
CREATE TABLE t1 (a int, b int) DISTRIBUTE BY HASH (a);
CREATE TABLE t2 (a int, b int) DISTRIBUTE BY HASH (a);
则执行计划将存在“Streaming”,导致DN之间存在较大通信数据量,如图1所示。
如果将a作为t1的分布列,将b作为t2的分布列:
CREATE TABLE t1 (a int, b int) DISTRIBUTE BY HASH (a);
CREATE TABLE t2 (a int, b int) DISTRIBUTE BY HASH (b);
则执行计划将不包含“Streaming”,减少DN之间存在的通信数据量,从而提升查询性能,如图2所示。
祝贺您,您已经成功地完成了GasssDB通过选择合适的分布列来达到性能调优全流程体验。
总结
GaussDB同时拥有云上高可用,高可靠,高安全,弹性伸缩,一键部署,快速备份恢复,监控告警等关键能力,能为企业提供功能全面,稳定可靠,扩展性强,性能优越的企业级数据库服务。
GaussDB分布式形态整体架构如下:
欢迎大家交流~