一文带你搞懂GaussDB数据库性能调优
摘要:数据库性能调优涉及硬件、操作系统、数据库、应用等多个层面,因此,在性能调优过程中,需要综合考虑各方面因素的影响。
1. 性能调优思路
图1 GaussDB总体性能调优思路
图2 对应实例的CPU/内存使用率
图3 磁盘读写速率以及时延情况
图4 网络传输速率及网卡发送速率
图5 连接及会话状态
set HEAP=-Xms1g -Xmx4g
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 SQL语句指标及对应数据展示
select * from dbe_perf.statement where unique_sql_id=3508314654;
图7 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;
图8 SQL性能优化过程
2. 系统级性能问题分析
2.1 CPU使用率高
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,round(cpu_time/1000,2) as cup_time from dbe_perf.statement t where n_calls>10 and avg_time>3 and user_name='root' order by cpu_time desc limit 5;
图9 某客户压测期间的火焰图
2.2 内存不足
图10 GaussDB的内存管理机制
图11 数据库的buffer命中率
图12 算子落盘情况
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,hash_mem_used,sort_mem_used from dbe_perf.statement t where n_calls>10 and avg_time>3 and user_name='root' order by (hash_mem_used+sort_mem_used) desc;
图13 GaussDB内存相关的监控视图
select contextname, sum(totalsize)/1024/1024 totalsize, sum(freesize)/1024/1024 freesize, count(*) count from gs_shared_memory_detail group by contextname order by totalsize desc limit 10;
select contextname, sum(totalsize)/1024/1024 totalsize, sum(freesize)/1024/1024 freesize, count(*) sum from gs_thread_memory_context group by contextname order by sum desc limit 10;
图14 数据库线程的内存上下文消耗情况
2.3 IO瓶颈
图15 数据库节点 I/O 的繁忙度和吞吐量
2.4 网络异常
图16 ping命令,排查两个服务器之间的网络时延及丢包等情况
图17 sar -n DEV 1 命令,网络传输情况
3. 锁阻塞问题分析
SELECT a.pid as w_pid,a.query as w_query,a.state,d.query as locking_query,d.state as l_state,d.pid as l_pid,d.sessionid as l_sessionid FROM pg_stat_activity AS a JOIN pg_thread_wait_status b ON b.query_id = a.query_id JOIN pg_thread_wait_status c ON c.sessionid = b.block_sessionid and c.node_name=b.node_name JOIN pg_stat_activity d on d.sessionid=c.sessionid ;
SELECT a.pid as w_pid,a.query as w_query,a.state as w_state, a.datname, a.usename,d.query as lock_query,d.state as l_state,d.pid as l_pid,d.sessionid as l_sessionid FROM pgxc_stat_activity AS a JOIN pgxc_thread_wait_status b ON b.query_id = a.query_id JOIN pgxc_thread_wait_status c ON c.sessionid = b.block_sessionid and c.node_name=b.node_name JOIN pgxc_stat_activity d on substring(d.global_sessionid,0,instr(d.global_sessionid,'#')) ilike substring(c.global_sessionid,0,instr(c.global_sessionid,'#')) ;
图18 锁阻塞查询结果展示
SELECT PG_TERMINATE_BACKEND(pid);
select wait_status,event,count(*) from gs_asp where sample_time>='20241016 18:45:00' and sample_time <='20241016 19:00:00' group by 1,2 order by 3 desc;
图19 特定事件内数据库占比最高的两个等待事件
图20 获取数据库中存在锁等待的SQL语句
execute direct on datanodes $$select t1.unique_query_id,t1.thread_id,t1.sessionid,t1.wait_status,t1.event,t1.state, t2.query_id as lock_query_id from gs_asp t1,gs_asp t2 where t1.block_sessionid=t2.sessionid and t1.unique_query_id=168353725$$;
图21 获取阻塞锁等待SQL语句的query_id
图22 锁等待的SQL语句查询结果
4. 总结

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
“入圈”腾讯元宝,让工作效率一路快跑
从“百模”到“千体”,国产化大模型的尾牙大战正式打响。 如果说大模型的上半场是在拼基础能力、Token 数、算法,那么在 2024 Q4 竞速赛中,AI Agent (智能体)无异于是竞争最激烈的战场。无他,智能体就是 AI 应用落地的产品形态。 简单来说,智能体是一种基于大语言模型的,具备规划思考能力、记忆能力、使用工具函数的能力,且能够自主完成给定任务的 AI 程序。在百模相争的下半程,智能体成为各大厂商交给市场的最直观的答卷。 自今年 5 月腾讯元宝正式上线,腾讯通过接入一系列 APP 产品,如微信、QQ 、腾讯文档等,不断发掘用户的真实需求,再把这些需求交给具有超千亿参数、超万亿 Tokens 的混元大模型,一旦混元能够解决这些需求,那就把其功能入口加进腾讯元宝之中,为用户解决复杂问题提供新的视角和工具。 换句话说,腾讯元宝本质并不是“一个” APP ,而是“一群” APP 。 在腾讯元宝上,用户可根据“订阅管理”,选择包括科技数码、金融理财、教育学习、政策法律、游戏娱乐、人文艺术、旅游、宠物在内的18 个应用场景。根据订阅的不同,腾讯元宝会将所选场景下的相关资讯推送给用户,并...
- 下一篇
其实,我更喜欢写SQL
此文章充满了个人的主观色彩,如果引起了大家的不适,那我也没办法。 其实,我更喜欢写SQL,如果在此基础上再稍微方便一些就更好了,所以,我理想中的持久层应该是这样的。 对于单表的增删改查 由于它不需要各种join,所以我们关心的只不过是字段,参数和条件而已,所以必须要有一种方式让我们只需要关注这三点,不需要去写那些固定模式的SQL,比如这样。 ParamPO paramPO = new ParamPO(); paramPO.setUserName("a"); paramPO.setUserEmail("test@qq.com"); int result = MagicDBUtils.get(jdbcTemplate).insert("表名", paramPO); 又或者这样 / 构建查询条件 ConditionBuilder conditionBuilder = ConditionBuilder.createCondition() .add("id > ?", 10) .add("and (name = ? or age > ?)", "bee", 1...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 2048小游戏-低调大师作品
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,CentOS7官方镜像安装Oracle11G