云上业务一键性能调优,应用程序性能诊断工具 Btune 上线

news2025/3/14 3:11:45

图片

- 01 -

终于等来了预算,这就把服务迁移到最新的 CPU 平台上去,这样前端的同事立马就能感受我们带来的速度提升了。可是…… 这些性能指标怎么回事?不仅没有全面提升,有些反而下降了。不应该这样啊,这可怎么办?

花费了几个月时间终于搞定了业务模块的重构,立刻部署升级让业务焕然一新。可是……长尾延迟居然还增加了一倍,说好的业务效果提升呢,到底是哪里出了问题?

上面的这些问题,对于开发运维工程师来说一定不陌生,经常被这类出乎意料的状况打个措手不及。但是,性能优化是一项高技术门槛的工作,这通常需要运维人员有丰富的系统知识和经验,对业务反复进行分析、定位、测试、验证。遇到麻烦的 case,有时候可能需要花费数周时间。如果团队中缺乏这类运维人员,那就只能盯着性能指标下降却没有有效的方法,最后影响了业务上线效果。

在将业务迁移至不同计算平台,或者进行新业务上线的过程中,为了能够完全发挥计算平台的能力,及时找出性能瓶颈,对系统进行全面优化,百度智能云推出了「应用程序性能诊断工具 Btune」。

就像电脑管家可以快速对 PC 进行性能优化,Btune 能够对云上业务进行一键性能调优,短时间内完成性能瓶颈的定位并提供优化建议,使得初级运维人员可以胜任高技术门槛的性能调优工作。

源自百度智能云多年在各种服务器 CPU(Intel、AMD、ARM) 和多类业务(推荐、搜索、广告、大数据、数据库、视频编解码等)上的性能调优经验,Btune 支持多维度应用性能分析,可以自动生成优化建议提高应用性能,并提供可视化分析数据展示。

- 02 -

Btune 内置了百度自研的瓶颈分析树模块,通过自顶向下的方式,从 CPU、内存、磁盘、网络、并发等 5 个维度对业务应用进行性能剖析和瓶颈定位,并从应用、runtime、系统、硬件等多个层次对每个瓶颈给出可操作的优化建议。

借助 Btune 的专业能力,用户不仅能知道性能问题的根因,还能获得问题优化的方法。只需在 Btune 的前端界面进行一键操作,几分钟后就可以得到一份完整的性能瓶颈和优化建议报告。

图片

在 Btune 提供的性能瓶颈和优化建议报告中包含两部分:分析摘要和分析详情。其中,「分析摘要」清晰地展示了业务性能瓶颈点和相应的优化建议,可以满足绝大部分的场景的需求。「分析详情」提供了更详细的性能分析数据,从系统配置、系统性能、进程线程模型、函数指令热点等多个维度呈现负载的资源分布、耗时分布、线程关系等运行特性,满足用户更细粒度性能优化。

- 03 -

接下来,我们通过一个测试用例介绍如何使用 「应用程序性能诊断工具 Btune」。(此测试用例仅用于展示 Btune 基本功能和使用方法,实际生产环境业务负载比较复杂,但 Btune 使用方法和分析原理相同。)

在这个例子中,首先我们编写一个测试程序作为分析对象。在这个程序中主要是调用 glibc 库的 memset 和 memcpy 函数对内存进行操作。然后通过 numactl 命令模拟程序跨 NUMA 访问内存的情况。我们通过 Btune 对这个程序进行分析给出性能瓶颈和优化建议。在 Btune 输出的报告中,给出了两类建议:

  • 在计算方面,给出了内存操作热点函数和对应的热点库升级建议。

  • 在内存方面,给出了跨 NUMA 访存优化建议。

最后我们根据 Btune 给出的建议对程序进行优化,可以看到优化后程序性能提高了 36.8%,优化效果显著。

测试程序代码如下,程序会无限循环执行简单的内存拷贝操作,可通过编译命令:gcc -o test test.c 和启动命令:nohup numactl -N 0 -m 1 ./test & 来运行此程序。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#define ARRAY_SIZE 1000000000

void main()
{
    int i=0;
    int *a = malloc(sizeof(int)*ARRAY_SIZE);
    int *b = malloc(sizeof(int)*ARRAY_SIZE);

    while(1)
    {
        memset(a, 0, sizeof(int)*ARRAY_SIZE);
        memset(b, 0, sizeof(int)*ARRAY_SIZE);

        memcpy(b, a, sizeof(int)*ARRAY_SIZE);
    };

}

具体操作步骤如下:

1. 登录云服务器控制台

创建一个云服务器实例,登陆实例并拷贝、启动测试程序 test。然后在百度智能云控制台侧边栏选择云服务器并选择「运维与监控」下面的「自助诊断工具」进入性能分析界面。

图片

2. 启动性能检测

在自助诊断工具页面选择「性能检测」选项,然后选择刚才创建的云服务器实例作为诊断实例,以及选择 test 进程作为诊断进程,Btune 需要一定周期的采集时间分析该进展。参数配置完可开始检测。

图片

3. 查看分析摘要报告

几分钟后,诊断完毕。Btune 输出分析摘要报告:

(1)待优化项

列出了程序的几个瓶颈点,并给出了优化建议。在此例中,有 3 条优化建议:前 2 条给出了热点函数 memset 和 memcpy 的热点占比,并推荐升级 glibc2.33 进行优化(当前 CentOS 7.9 默认 glibc 是 2.17,版本较低,性能差)。第 3 条给出了当前程序跨 NUMA 内存使用率是 100%,建议减少跨 NUMA 访问。

图片

(2)诊断详情

诊断详情可查看 CPU、内存、网络、磁盘、并发等 5 个维度的监控数据。我们以 CPU、内存和并发 3 个诊断项说明如下:

  • CPU 诊断项:内核的网络、存储和调度正常,主要风险是 glibc 热点函数和库版本。

图片

  • 内存诊断项:无内存泄漏,采用匿名大页,整机内存使用量较少,主要风险是跨 NUMA 使用内存。

图片

  • 并发诊断项(mpi):线程数是 1,由于内存默认对齐所以没有出现 split lock 情况,线程上下文切换和线程等待时间均正常,无风险。

图片

4. 查看分析详情报告

点击检测报告右下角的「查看详细报告」,可以查看详细的性能性能分析数据。

详细报告界面分为三部分:概要、进程和系统。「概要」从程序运行时间维度给出了初步分析;「进程」给出了进程粒度的分析数据(CPU、内存、磁盘、网络、热点、多线程并发);「系统」给出了整机粒度的分析数据(CPU、内存、磁盘、网络)。

图片

此案例中,通过进程「热点」可以查看热点函数 list,跨路的热点函数 list,火焰图,跨路火焰图等,具体如下:

  • 热点函数:此例中主要热点是内存操作函数__memset_sse2 和__memcpy_sse3_back,分别占比 63.09% 和 36.91%。

图片

  • 跨 NUMA 热点函数:此例中主要跨路热点函数是__memcpy_sse3_back,占比 100%。

图片

  • 火焰图:此例中,glibc 中的__memset_sse2 和__memcpy_sse3_back 占比最大。

图片

  • 跨 NUMA 火焰图:此例中,glibc 中的__memcpy_sse3_back 占比最大。

图片

5. 程序优化效果

根据 Btune 给出的优化建议,我们需要做两项优化措施:一个是升级 glibc 到 2.33,一个是减少跨 NUMA 访存。

为了方便对比优化前后性能差异,我们统计核心代码段的耗时,修改程序如下:

clock_gettime(CLOCK_REALTIME, &start);

memset(a, 0, sizeof(int)*ARRAY_SIZE);
memset(b, 0, sizeof(int)*ARRAY_SIZE);

memcpy(b, a, sizeof(int)*ARRAY_SIZE);

clock_gettime(CLOCK_REALTIME, &end);

elapsed = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1e9;

printf("Elapsed time: %f seconds\n", elapsed);

首先,优化前的默认程序执行单次耗时 2.576349 秒。

图片

然后,执行 Btune 的建议优化项其一,关闭跨 NUMA 启动并保持 2.17 版本 glibc,此时程序耗时 1.821380 秒,优化 29.3%。

图片

最后,执行 Btune 的全部优化建议,升级到 2.33 版本 glibc,并关闭跨 NUMA 启动,耗时 1.625940 秒,共优化 36.8%。

图片
- - - - - - - - - - END - - - - - - - - - -

推荐阅读

一文详解静态图和动态图中的自动求导机制

千万级高性能长连接Go服务架构实践

百度搜索Push个性化:新的突破

数据交付变革:研发到产运自助化的转型之路

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软考中级备考笔记】计算机体系结构

计算机体系结构 2月19日 – 天气:阴转小雪 1. 冯诺依曼计算机体系结构 冯诺依曼将计算机分为了五大部分,分别是: 控制器:主要负责协调指令到执行运算器:负责算数和逻辑运算存储器:负责存储在指令执行过程…

vue封装el-table表格组件

先上效果图&#xff1a; 本文包含了具名插槽、作用域插槽、jsx语法三种&#xff1a; Render.vue&#xff08;很重要&#xff0c;必须有&#xff09;: <script> export default {name: "FreeRender",functional: true,props: {scope:Object,render: Functio…

Gitlab操作流程

阶段1-构建账户信息 1.1 管理员分配账户 方式1-推荐 企业正常使用gitlab时&#xff0c;一般由项目经理(超级管理员)手动创建开发者账户信息&#xff0c;然后将账户发送给开发者&#xff0c;以便登录使用&#xff1b; 流程如下&#xff1a; 点击创建用户按钮&#xff1b; 创…

自动驾驶中之定位总结

1 前言2 典型的单个定位方式2.1 基于通信的定位方法2.1.1 GNSS 全球卫星导航系统2.1.1.1 gnss的优点与缺点2.1.1.2 gnss定位技术2.1.1.2.1 RTK定位技术2.1.1.2.2 PPP定位技术 2.1.1.2 gnss定位技术总结 2.1.2 车联网定位 2.1 基于航位推算的定位方法2.1.1 惯性测试单元定位IMU2…

docker安装一系列镜像

启动docker systemctl start docker docker 启动已经停止的容器 docker start idOrName PS&#xff1a;idOrName为容器的id或者名称 1、安装mysql镜像 拉取mysql5.7的镜像 docker pull mysql:5.7 查看镜像 docker images 启动mysql #启动mysql docker run --name mysql…

PostgreSQL技术内幕(十三)探究MPP数据库分布式查询分发Dispatcher

Dispatcher&#xff08;分布式查询分发器&#xff09;是MPP数据库的核心组件&#xff0c;所有的查询任务都要经过其进行分发&#xff0c;起着沟通用户到协调者&#xff08;Coordinator&#xff0c;即QD&#xff09;和执行调度的关键作用。 在这次的直播中&#xff0c;我们为大…

Opencv中的RNG-随机绘图

在OpenCV中&#xff0c;RNG是一个随机数生成器类&#xff0c;用于生成各种类型的随机数&#xff0c;包括均匀分布或高斯分布的整数和浮点数。RNG类的实例化时可以接受一个无符号整数作为种子值&#xff0c;这个种子值决定了随机数生成序列的起点&#xff0c;相同的种子值将产生…

分布式id实战

目录 常用方式 特征 潜在问题 信息安全 高性能 UUID 雪花算法 数据库生成 美团Leaf方案 Leaf-segment 数据库方案 Leaf-snowflake 方案 常用方式 uuid雪花算法数据库主键 特征 全局唯一趋势递增信息安全 潜在问题 信息安全 如果id连续递增, 容易被爬虫, 批量下…

【动态规划】【字符串】2167移除所有载有违禁货物车厢所需的最少时间

作者推荐 【深度优先搜索】【树】【有向图】【推荐】685. 冗余连接 II 本文涉及知识点 动态规划汇总 LeetCode2167移除所有载有违禁货物车厢所需的最少时间 给你一个下标从 0 开始的二进制字符串 s &#xff0c;表示一个列车车厢序列。s[i] ‘0’ 表示第 i 节车厢 不 含违…

自动化上位机开发C#100例:如何用面向对象的方式封装雷赛运动控制卡EtherCAT总线卡(C#代码)

自动化上位机开发C#100例:雷赛运动控制卡EtherCAT总线卡C#封装类 文章目录 LTDMC.dll下载LTDMC.cs LTDMC.dll C#调用封装下载ICard.cs 运动控制卡接口Card.cs 运动控制卡抽象类CardLTDMC.cs 雷赛运动控制卡EtherCAT总线卡实现类CardList.cs 总线卡列表封装 LTDMC.dll下载 最新…

MLP-Mixer: AN all MLP Architecture for Vision

发表于NeurIPS 2021, 由Google Research, Brain Team发表。 Mixer Architecture Introduction 当前的深度视觉结构包含融合特征(mix features)的层:(i)在一个给定的空间位置融合。(ii)在不同的空间位置&#xff0c;或者一次融合所有。在CNN中&#xff0c;(ii) 是由N x N(N &g…

golangci-lint如何关闭typecheck

https://github.com/golangci/golangci-lint/issues/2912 typecheck是go源码的校验&#xff0c;无法通过.golangci.yml配置关闭 可以直接在golangci-lint源码层面关闭typecheck

Jmeter教程-JMeter 环境安装及配置

Jmeter教程 JMeter 环境安装及配置 在使用 JMeter 之前&#xff0c;需要配置相应的环境&#xff0c;包括安装 JDK 和获取 JMeter ZIP 包。 安装JDK 1.JDK下载 示例环境为Windows11环境&#xff0c;读者应根据实际环境下载JDK的安装包。 JDK下载地址&#xff1a; Java21 下载 …

windows自带录屏指南,让视频制作更简单!

随着网络技术的发展&#xff0c;录制电脑屏幕已成为了许多用户的常见需求&#xff0c;无论是录制游戏画面、软件教程还是制作演示视频&#xff0c;一款好用的录屏工具都至关重要。windows操作系统为用户提供了多种录屏工具&#xff0c;无需额外安装软件。本篇文章将介绍windows…

Guitar Pro 8.1 Mac 2024最新下载、安装、激活、换机图文教程

Guitar Pro 8是吉他手的终极工具箱,也是阅读和编辑乐谱的领先软件。26 年来,Guitar Pro 一直在帮助世界各地的音乐家学习弹吉他、创作歌曲以及转录和编辑歌集。 Guitar Pro是一款专业的吉他制谱软件&#xff0c;现在已更新至Guitar Pro8&#xff0c;新增了支持添加音频轨道、支…

19-树-填充每个节点的下一个右侧节点指针 II

这是树的第19篇算法&#xff0c;力扣链接。 给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 next 指针设置为 NULL 。…

从入门到精通:AI绘画与修图实战指南

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在这篇文章中&#xff0c;我们将深入探讨如何利…

JAVA高并发——人手一支笔:ThreadLocal

文章目录 1、ThreadLocal的简单使用2、ThreadLocal的实现原理3、对性能有何帮助4、线程私有的随机数发生器ThreadLocalRandom4.1、反射的高效替代方案4.2、随机数种子4.3、探针Probe的作用 除了控制资源的访问&#xff0c;我们还可以通过增加资源来保证所有对象的线程安全。比如…

2024年数学建模竞赛汇总——时间轴

美赛已过&#xff0c;好多小伙伴表示已经错过&#xff0c;不清楚什么时候报名&#xff0c;什么时候准备&#xff0c;其实每年数学建模比赛有很多个&#xff0c;各大比赛的级别、报名时间、参赛对象等要求什么呢&#xff1f;小编从竞赛说明、竞赛级别、是否允许跨校、报名费用、…

MySQL基础学习

MySQL基础 注意&#xff1a;本文的图片截图自尚硅谷MySQL笔记。 一&#xff1a;基本概述&#xff1a; 什么是数据库&#xff1a; 数据库是一种用来存储和管理数据的系统。它是一个组织化的数据集合&#xff0c;可以通过计算机系统进行访问、管理和更新。数据库可以存储各种…