如何通过Profile快速定位Doris查询瓶颈

1 如何获取profile

参考文档:https://doris.apache.org/zh-CN/docs/query/query-analysis/get-profile

我们时常遇到对应 SQL 执行时间不及预期的情况,为了优化 SQL 达到预期查询时延,通过 Profile 我们能够看出可以做哪些优化。现在说明在不同环境下应该如何拿到对应 Query 的 Profile。
使用请求方式
HTTP://FE_IP:HTTP_PORT GET /API/Profile
Doris 集群能够正常访问外网

  1. 开启 Profile 上报参数 enable_profile
  2. 该参数开启的是 session 变量,此变量不建议全局开启。
--开启变量
mysql> set enable_profile=true;
Query OK, 0 rows affected (0.00 sec)

--确认变量是否正常开启
mysql> show variables like '%profile%';
+----------------+-------+---------------+---------+
| Variable_name  | Value | Default_Value | Changed |
+----------------+-------+---------------+---------+
| enable_profile | true  | false         | 1       |
+----------------+-------+---------------+---------+
1 row in set (0.00 sec)
  1. 执行对应 Query
  2. 集群在多个 FE 的情况下,需要到开启 Profile 上报参数的 FE 上执行对应 Query, 参数并没有全局生效。
--开启变量
mysql> set enable_profile=true;
Query OK, 0 rows affected (0.00 sec)
--确认变量是否正常开启
mysql> show variables like '%profile%';
+----------------+-------+---------------+---------+
| Variable_name  | Value | Default_Value | Changed |
+----------------+-------+---------------+---------+
| enable_profile | true  | false         | 1       |
+----------------+-------+---------------+---------+
1 row in set (0.00 sec)

--执行对应 Query
mysql> select id,name from test.test where name like "%RuO%";
+---------------------------+-----------------------------------------------------------------------------------------------------------------------------+
| id                        | name                                                                                                                        |
+---------------------------+-----------------------------------------------------------------------------------------------------------------------------+
| 1ZWXYGbb8nr5Pi29J4cEMyEMb | ZN1nqzBRSl1rTrr99rnX1aplxhRuOUTLw6so7rzjlRQ317gTPxh0dHljmrARDJjH7FjRkJW9c7YuUBmWikq7eNgmFKJPreWirDrGrFzUYH4eP6kDtSA3UTnNIIj |
+---------------------------+-----------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
  1. 获取 Profile
  2. 集群在多个 FE 的情况下,需要访问执行对应 Query 的 FE HTTP 界面 ( HTTP://FE_IP:HTTP_PORT ) 的 QueryProfile 页面,点击对应 Profile ID 查看对应 Profile,还可以在 Profile 界面下载对应 Profile。

Doris 集群访问外网受到限制

集群不能正常访问外网时,需要通过 API 的方式拿到对应 Profile (HTTP://FE_IP:HTTP_PORT/API/Profile?Query_ID=),IP 和端口是指执行对应 Query 的 FE 对应 IP 和端口。此时获取对应 Query 的 Profile 步骤前两步和正常访问外网时是一样的,第三步获取 Profile 时会有差别。
获取 Porfile

找到对应 Query ID

  • 根据对应 Query 找到 Profile ID
mysql> show query profile "/";
+-----------------------------------+-----------+---------------------+---------------------+-------+------------+------+------------+-------------------------------------------------------+
| Profile ID                        | Task Type | Start Time          | End Time            | Total | Task State | User | Default Db | Sql Statement                                         |
+-----------------------------------+-----------+---------------------+---------------------+-------+------------+------+------------+-------------------------------------------------------+
| 1b0bb22689734d30-bbe56e17c2ff21dc | QUERY     | 2024-02-28 11:00:17 | 2024-02-28 11:00:17 | 7ms   | EOF        | root |            | select id,name from test.test where name like "%RuO%" |
| 202fb174510c4772-965289e8f7f0cf10 | QUERY     | 2024-02-25 19:39:20 | 2024-02-25 19:39:20 | 19ms  | EOF        | root |            | select id,name from test.test where name like "%KJ%"  |
+-----------------------------------+-----------+---------------------+---------------------+-------+------------+------+------------+-------------------------------------------------------+
2 rows in set (0.00 sec)
  • 查询 Profile 并将 Profile 重定向到一个文本中
模板:CURL -X GET -u user:password http://fe_ip:http_port/api/profile?query_id=1b0bb22689734d30-bbe56e17c2ff21dc > test.profile

[user@VM-10-6-centos profile]$ curl -X GET -u root:root http://127.0.0.1:8030/api/profile?query_id=1b0bb22689734d30-bbe56e17c2ff21dc > test.profile
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1211    0  1211    0     0   168k      0 --:--:-- --:--:-- --:--:--  168k
  • 返回的 Profile 换行符为 \ \n 分析起来很不方便,可以在文本编辑工具中将 \ \n 替换为 \n

  • [user@VM-10-6-centos profile]$ cat test.profile
    {“msg”:“success”,“code”:0,“data”:{“profile”:“Query:\n Summary:\n
    Profile ID: 1b0bb22689734d30-bbe56e17c2ff21dc\n - Task Type: QUERY\n
    Start Time: 2024-02-28 11:00:17\n - End Time: 2024-02-28 11:00:17\n
    Total: 7ms\n - Task State: EOF\n - User: root\n - Default Db: \n
    Sql Statement: select id,name from test.test where name like “%RuO%”\n Execution Summary:\n
    Workload Group: \n - Analysis Time: 1ms\n
    Plan Time: 2ms\n - JoinReorder Time: N/A\n
    CreateSingleNode Time: N/A\n - QueryDistributed Time: N/A\n
    Init Scan Node Time: N/A\n - Finalize Scan Node Time: N/A\n
    Get Splits Time: N/A\n - Get PARTITIONS Time: N/A\n
    Get PARTITION FILES Time: N/A\n - Create Scan Range Time: N/A\n
    Schedule Time: N/A\n - Fetch Result Time: 0ms\n - Write Result Time: 0ms\n
    Wait and Fetch Result Time: N/A\n - Doris Version: doris-2.0.4-rc06-003a815b63\n
    Is Nereids: Yes\n - Is Pipeline: Yes\n - Is Cached: Yes\n
    Total Instances Num: 0\n - Instances Num Per BE: \n
    Parallel Fragment Exec Instance Num: 48\n - Trace ID: \n”},“count”:0}

  • 替换后的效果如下

{"msg":"success","code":0,"data":{"profile":"Query:
  Summary:
     - Profile ID: 1b0bb22689734d30-bbe56e17c2ff21dc
     - Task Type: QUERY
     - Start Time: 2024-02-28 11:00:17
     - End Time: 2024-02-28 11:00:17
     - Total: 7ms
     - Task State: EOF
     - User: root
     - Default Db: 
     - Sql Statement: select id,name from test.test where name like \"%RuO%\"
  Execution Summary:
     - Workload Group: 
     - Analysis Time: 1ms
     - Plan Time: 2ms
       - JoinReorder Time: N/A
       - CreateSingleNode Time: N/A
       - QueryDistributed Time: N/A
       - Init Scan Node Time: N/A
       - Finalize Scan Node Time: N/A
         - Get Splits Time: N/A
           - Get PARTITIONS Time: N/A
           - Get PARTITION FILES Time: N/A
         - Create Scan Range Time: N/A
     - Schedule Time: N/A
     - Fetch Result Time: 0ms
     - Write Result Time: 0ms
     - Wait and Fetch Result Time: N/A
     - Doris Version: doris-2.0.4-rc06-003a815b63
     - Is Nereids: Yes
     - Is Pipeline: Yes
     - Is Cached: Yes
     - Total Instances Num: 0
     - Instances Num Per BE: 
     - Parallel Fragment Exec Instance Num: 48
     - Trace ID: 
"},"count":0}

2 如何分析profile

如何确认慢在哪里

注:以下profile分析以2.1为例,其他版本可供参考
首先通过Execution Summary 这部分来确定一下查询的瓶颈是在FE还是BE上。FE的情况比较少,如果是的话,看下是否有压测/线上压力情况/是否FE有GC等等,重点去看FE的CPU的压力情况。绝大部分情况都是BE这边的,然后如果是BE这边慢的话,重点去按照后面的分析去看看各个部分的算子的情况。

2.1的profile经过profile merge之后,显示是很精简的,我们需要通过去看每个算子的查询时间,来看具体卡在那里。这里我们重点关注,我下面划线的部分,很快就能定位到对应的问题:

基本上顺着找下来ExecTime最大的就是最耗时的节点,顺着这个id继续往下看。如果没有最大的,大家都差不多,说明没有明确的热点。

ps:如果是使用2.1.4 selectdb以后包的webui,则可以直接看慢在哪里

常见问题的处理方案

2.1 如果发现热点出在nested loop join上的话,首先看一下能否通过改sql的方式,让nested loop join变成hash join 那么性能能得到明显的提升
2.2 热点在join上的话,问题排查就会更加复杂一些了:
2.2.1 首先看join order的顺序,这个是重中之重。

(1)最简单条目数上看是否合理,如果右表条目数显著大于左表,需要优化器的同学介入进行问题的排查调优
Build端:

Probe端:

(2)这种情况相对少见,如果出现左右表数据量差不多,或者右表的条目数显著小于左表时候,也不一定join reorder是合理情况。这个时候需要判断右表的列是不是显著的大于左表,比如右表是一个大宽表,而左表可能只扫描一列,这种情况下导致的性能问题也认为是join reorder的问题

2.2.2 Runtime filter:
(1) 排查rf是否生效,等待时间是否合理,是否应该规划的rf没有规划

(2)是否规划多余或者无用的rf,导致了性能的问题,和无谓的等待时间

2.2.3. join列的优化

(1)能建非null的列就一定建成非null,尤其是join列和group by列

(2)能建立定长列就不用变长列:比如用户的id,订单id,ip地址,很多时候可以用bigint代替string
4. join的shuffle方式是否合理,如果Join之前的Exchange很费:

注:下面这个图搜的id应该也是21,截图错了
(1) Broadcast <-> shuffle
(2) 能否用colocate优化
(3) Bucket shuffle的优化
2.2.4. 热点在agg上

(1) 参考join列的优化方式来进行优化

(2) 表结构调整,比如能不能group by的列作为表的分桶列,或者分区列,这种对单表聚合的优化有奇效

2.2.5. scan上慢,这种情况就比较复杂了,通常的经验是:

(1)参考下面步骤进行排查

  • 在Doris 里不同的表引擎的查询性能差异比较大,查询性能由好到差依次为 duplicate key > merge on write unique key > merge on read unique key == aggregate key。

    所以一般的时候,如果没有特殊要求,都建立duplicate key ,可以避免很多问题。

    • 使用以下sql 检查,是否分桶有数据倾斜问题
select  分桶列,count(*) from table grou p by 分桶列 order by count(*) desc limit 100;
  • 注意key列的顺序问题。因为doris 底层存储引擎按照key列 做了排序存储,这样可以快速的做二分查找。
2.2.6. 观察表的compaction情况:
(1) 找到慢scan的tablet:

(2) 找到compaction情况的链接:

这里需要查看多个副本的情况,如果有慢副本的话,可以通过set use_fix_replica 绕过。但是对应的情况要找官方同学来进行分析。

常见会出现慢的就是这么几大算子,也给了一些初步判断和定位方式。如果对于慢的算子,仍然没有头绪的话,可以找官方同学来处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/758537.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为何同一PDF文档用不同软件打印效果不同?

通过扫描仪生成的同一PDF文档&#xff0c;同样的设置&#xff0c;为什么别的电脑打出来是白底我的打出来有灰色格子背景&#xff1f;这种情况通常是由于PDF阅读软件的不同造成的差异。 ### 可能的原因和解决方法&#xff1a; 1. **PDF阅读软件的不同**&#xff1a; - **解决方…

小型光纤抗干扰无人机技术详解

一、光纤通信技术应用 光纤通信技术是现代通信技术的重要组成部分&#xff0c;其在小型无人机中的应用为无人机的数据传输带来了革命性的改变。光纤通信具有高速率、大带宽、低损耗和抗电磁干扰等优点&#xff0c;使得无人机在执行任务时能够实时传输高清图像、视频和大量数据…

[JS]BOM操作

介绍 BOM(Browser Object Model)是浏览器对象模型 window对象是一个全局对象, 也是JS中的顶级对象通过var定义在全局作用域中的变量和函数都会变成window对象的属性和方法window对象下的属性和方法调用时一般省略window 间歇函数 定时器 定时器是间歇函数的一种, 可以每个每…

《昇思25天学习打卡营第2天 | 昇思MindSpore张量 Tensor》

第二天学习 1.今天学习了张量 Tensor&#xff0c;了解到Tensor是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数&#xff0c;也是一个特殊的数据结构&#xff0c;与数组和矩阵非常相似。是MindSpore网络运算中的基本数据结构。学些了张量和稀疏张量的属性…

Node版本管理工具 fnm 安装使用

fnm 是一个基于 Rust 开发的 Node 版本管理工具&#xff0c;它的目标是提供一个快速、简单且可靠的方式来管理 Node.js 的不同版本。同时&#xff0c;它是跨平台的&#xff0c;支持 macOS、Linux、Windows。&#x1f680; Fast and simple Node.js version manager, built in R…

五十九周:文献阅读+FiLM

目录 摘要 Abstract 文献阅读&#xff1a;用于长时间序列预测的频率改进的勒让德记忆模型 一、现有问题 二、提出方法 三、相关知识 1、Legendre Projection&#xff08;Legendre投影&#xff09; 2、Fourier Transform&#xff08;傅立叶变换&#xff09; 四、提出的…

文件操作与管理

程序经常需要访问文件和目录&#xff0c;读取文件信息或写入文件信息&#xff0c;在Python语言中对文件的读写是通过文件对象&#xff08;file object&#xff09;实现的。Python的文件对象也称为类似文件对象或流&#xff08;stream&#xff09;&#xff0c;因为Python提供一种…

数据库-数据完整性-用户自定义完整性实验

NULL/NOT NULL 约束&#xff1a; 在每个字段后面可以加上 NULL 修饰符来指定该字段是否可以为空&#xff1b;或者加上 NOT NULL 修饰符来指定该字段必须填上数据。 DEFAULT约束说明 DEFAULT 约束用于向列中插入默认值。如果列中没有规定其他的值&#xff0c;那么会将默认值添加…

ProPainter – AI视频去水印工具,可以去除视频中的静态水印、动态物体/人物等 本地一键整合包下载

ProPainter是一个基于E2FGVI实现的AI视频编辑工具&#xff0c;它可以一键移除视频内的移动物体和水印。这个开源项目提供了一个简单而强大的解决方案&#xff0c;帮助用户轻松编辑和改善视频内容。 项目地址&#xff1a;https://github.com/sczhou/ProPainter 一键包下载&…

【C++初阶 ---- string类】文档介绍 | 容量操作 | 模拟实现

string介绍 前言1. C语言中的字符串2. 标准库中的string类2.1string类对象的容量操作2.2string类对象的访问及遍历操作访问操作 [ ]和at string底层模拟实现 前言 其实 string 就是一个管理字符数组的顺序表&#xff0c;因为字符数组的使用广泛&#xff0c;C 就专门给了一个 s…

mac系统docker默认不支持host主机网络模式

环境描述&#xff1a;在mac系统上安装docker及docker-compose服务&#xff0c;并且打算搭建一个redis集群 问题描述&#xff1a;mac默认不支持host网络模式&#xff0c;导致集群无法通过外部主机访问 具体验证步骤&#xff1a; docker-compose.yml如下&#xff1a; version…

山东省著名烈士孙善师孙善帅故居布展喜添新篇

人海信息网山东讯&#xff08;张春兄、冯爱云&#xff09; “……他们以钢铁般的意志&#xff0c;坚守共产党员的使命&#xff0c;他们就是泺口九烈士的孙善师孙善帅兄弟&#xff01;”6月28日&#xff0c;对于山东省著名烈士孙善师孙善帅故居来说&#xff0c;又是一个不平凡的…

二、安装虚拟机

本篇来源&#xff1a;山海同行 本篇地址&#xff1a;https://shanhaigo.cn/courseDetail/1805875642621952000 本篇资源&#xff1a;以整理到-山海同行 一、官网下载centos7 1. 进入CentOS 官方网站 官方网站&#xff1a;https://www.centos.org/download/ 2. 选择iso 点击下…

基于Delphi编写PC上位机串口通信工具

1&#xff09;Delphi入门级小知识&#xff0c;分享给将要学习或者正在学习Delphi上位机开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 Delphi&#xff0c;是Windows平台下著名的快速应用程…

python(基础语法,pandas,numpy,正则表达式,数据预处理)

python学习推荐网址&#xff1a; 白月黑羽 一、语法基础 目标&#xff1a; • list、tuple、set、dict的基本用法 • 内置函数 len&#xff08;&#xff09;&#xff0c; eval&#xff08;&#xff09;&#xff0c;range&#xff08;&#xff09;&#xff0c;sort&#xff08;…

weiyang**4.合约

通过合约开发&#xff0c;合约编译&#xff0c;SDK配置与业务开发构建了一个基于FISCO BCOS联盟区块链的应用。 官网&#xff1a;开发第一个区块链应用 — FISCO BCOS 2.0 v2.11.0 文档 (fisco-bcos-documentation.readthedocs.io) CSDN&#xff1a;FISCO BCOS开发第一个区块链…

教师资格证(教资)笔试如何备考?含备考资料

教师资格证&#xff08;教资&#xff09;笔试如何备考&#xff1f;含备考资料 前言 教师&#xff0c;一直以来的热门职业&#xff0c;而要成为一名教师&#xff0c;考取教师资格证则是基本条件&#xff0c;那么教资笔试如何备考呢&#xff1f;&#xff0c;这里准备笔试备考攻…

基于单片机光纤测距系统的设计与实现

摘要 &#xff1a; 光纤由于其频带宽 、 损耗低及抗干扰能力强等优点已被广泛地应用在通信 、 电子及电力方面 &#xff0c; 是我们生产生活中必不可少的媒介。 在实际的光纤实验 、 安装 、 运营和维护工作中 &#xff0c; 一种精准 、 轻便和易操作的光纤测距系统显得尤为重…

PingCastle 3.2.0.1 - Active Directory 安全检测和评估

PingCastle 3.2.0.1 - Active Directory 安全检测和评估 活动目录域安全分析工具 请访问原文链接&#xff1a;https://sysin.org/blog/pingcastle/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 在 20% 的时间内获得 80% 的…

LitelDE安装---附带每一步截图以及测试

LiteIDE LiteIDE 是一款专为Go语言开发而设计的开源、跨平台、轻量级集成开发环境&#xff08;IDE&#xff09;&#xff0c;基于 Qt 开发&#xff08;一个跨平台的 C 框架&#xff09;&#xff0c;支持 Windows、Linux 和 Mac OS X 平台。LiteIDE 的第一个版本发布于 2011 年 …