数仓实时算子难以观测,快来试试算子级监控吧

本文分享自华为云社区《GaussDB(DWS)监控工具指南(四)算子级监控【绽放吧!GaussDB(DWS)云原生数仓】》,作者: 幕后小黑爪 。

随着数据量的增大和数据处理的复杂性增加,数据库系统的性能问题变得越来越突出。应用程序对数据库的访问频率和数据量也越来越大。因此,优化数据库系统的性能成为了数据库管理员和开发人员的重要任务。通过SQL性能调优,可以提高数据库系统的响应速度和吞吐量,减少资源消耗,提高系统的稳定性和可靠性,从而提高应用程序的性能和用户体验。目前GaussDB(DWS)已有的explain工具无法满足用户实时定位问题的需求,为此DWS推出了算子级监控,以解决实时算子难以观测的问题。

1. 需求描述

举个例子,用户下发语句后,无法知道当前语句的执行计划生成的是否合理,目前语句的执行进度和消耗资源等情况。如下图所示,用户仅能看到执行花费了多长时间,并不能看到语句后面执行的什么信息?算子是咋样运行的?每个算子怎么交互的,生成的计划是否合理,无法进行判断。

为此,DWS提供了explain performance的方式进行事后分析,而explain performance需要将语句执行完后才能看到结果,对于某些新上业务的语句,不知道会运行多久,甚至说能不能运行出来结果都不知道,所以无法直接通过explain performance分析结果。

因此亟需一种实时观测语句算子运行的手段来确定执行计划的优化点,以便SQL调优。

2. 解决方案

针对这些情况,GaussDB(DWS)在新版本821新推出了算子监控,算子监控能看到语句具体运行的情况,能追踪到具体某个算子的进度以及消耗资源情况。使用步骤如下:

1)设置guc参数resource_track_level为operator_realtime级别,然后执行语句;

2)重新打开一个窗口,连接gaussdb,通过pgxc_wlm_operator_statistics查询集群所有打开算子监控的语句,又或者通过查询pg_stat_get_wlm_realtime_operator_info(queryid)可以获取到该queryid对应语句的信息。

csharp 复制代码
select * from pgxc_wlm_operator_statistics;

注:该功能对性能有一定影响,执行基线测试,同样情况下可能会最大新增2%左右的性能劣化,建议用户在追踪性能问题时使用。

算子监控跟语句监控功能类似,同样包含的语句的静态信息和运行态信息。

1)语句静态信息是语句在真正执行前就已经由优化器生成的信息,如执行计划plan_node_name,queryid,预估行数estimated rows等信息。可用来分析生成的执行计划是否合适。

2)语句动态信息是语句在执行器中执行过程中所占用的资源信息,如算子执行进度progress、内存peak_memory、算子下盘spill_size、网络net_size、磁盘IO(read_bytes、write_bytes),CPU(cpu_time)等不同DN的实时的信息记录。可用来分析语句执行过程中的进度和资源消耗情况,通过该字段可以分析出语句在运行是消耗较久的在什么地方,便于后续优化。

3. 实际使用

我们下发某个查询,在另一个会话中查询算子视图,结果如下:

1)当前算子进度:字段progress展示了当前算子的运行进度,对于第一个算子而言,该字段展示的是当前语句的整体进度。

2)不断刷新视图,能看到语句执行情况,观察进度介于(0,100)之间的进度算子,这些代表该算子正在运行。

3)观察当前算子实际消耗资源情况,判断可能阻塞的原因。

4. 总结

以往需要explain performance执行完毕后才能获取算子运行信息,现在通过该视图可以直接在运行期间获取,且该视图对结果集无影响。本文提供的视图可以支持用户对语句算子进行实时监控,能较为准确的反应语句的执行情况,通过观察运行时长较久的算子和消耗资源,可以判断计划生成是否合理,又或者通过进度字段观察语句运行进度可用来定位SQL性能问题。当然,该视图也许和其他运行态的视图结合使用,最终确定SQL性能较慢的原因,并采取措施进行调优。

点击关注,第一时间了解华为云新鲜技术~

相关推荐
CC呢8 分钟前
基于单片机的智能婴儿床监护系统多功能婴儿床摇篮系统
数据库·mongodb
海绵波波1071 小时前
flask后端开发(1):第一个Flask项目
后端·python·flask
林的快手1 小时前
209.长度最小的子数组
java·数据结构·数据库·python·算法·leetcode
HEU_firejef1 小时前
Redis——缓存预热+缓存雪崩+缓存击穿+缓存穿透
数据库·redis·缓存
KELLENSHAW2 小时前
MySQL45讲 第三十七讲 什么时候会使用内部临时表?——阅读总结
数据库·mysql
一只淡水鱼662 小时前
【mybatis】详解 # 和 $ 的区别,两者分别适用于哪种场景,使用 $ 不当会造成什么影响
sql·spring·mybatis·sql注入
SelectDB3 小时前
飞轮科技荣获中国电信星海大数据最佳合作伙伴奖!
大数据·数据库·数据分析
小刘鸭!3 小时前
Hbase的特点、特性
大数据·数据库·hbase
AI人H哥会Java3 小时前
【Spring】控制反转(IoC)与依赖注入(DI)—IoC容器在系统中的位置
java·开发语言·spring boot·后端·spring
凡人的AI工具箱3 小时前
每天40分玩转Django:Django表单集
开发语言·数据库·后端·python·缓存·django