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

图片

- 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个性化:新的突破

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

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

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

相关文章

为什么在MOS管开关电路设计中使用三极管容易烧坏?

MOS管作为一种常用的开关元件,具有低导通电阻、高开关速度和低功耗等优点,因此在许多电子设备中广泛应用。然而,在一些特殊情况下,我们需要在MOS管控制电路中加入三极管来实现一些特殊功能。然而,不同于MOS管&#xff…

猫咪不喝水是什么原因?这些方法远离缺水小猫

有经验的铲屎官都知道,家里的猫似乎不太喜欢喝水。只看到一只或两只猫不喝水,那可能是例外情况。但绝大部分的猫都不咋爱喝水,这是为什么呢? 一、猫咪不喝水是什么原因? 如果你已经尝试了各种方法来让猫咪多喝水&…

springboot整合mybatisPlus超级详细

springboot整合mybatis-plus超级详细 一、环境二、springboot整合myBatisPlus2.1新建2.2 添加Mybatis-plus和mysql依赖2.3 修改配置文件2.4 新建包和文件2.5 新建表2.6 创建实体类2.7 创建Mapper接口2.8 创建Service接口2.9 创建Service实现类2.10 增删改查 MyBatis-Plus&#…

IDEA左侧启动图标消失

一、问题如图 二、解决方式

水经注下载注记地图, mars3d加载底图

使用 水经微图 (公司提供的,需付费,我也没有这个东西)下载注记地图; 1、选择下载 选择区域: 根据需求进行选择,两边都可以选择,看个人喜欢;这里以澳门为演示 选择地图…

渗透测试—信息收集

渗透测试—信息收集 1. 收集域名信息1.1. 域名注册信息1.2. SEO信息收集1.3. 子域名收集1.3.1. 在线子域名收集1.3.2. 子域名收集工具 1.4. 域名备案信息1.5. ICP备案号查询1.6. SSL证书查询 2. 收集真实IP2.1. 超级ping2.2. Ping2.3. CDN绕过 3. 收集旁站或C段IP3.1. 旁站或C段…

瑞_Redis_初识Redis(含安装教程)

文章目录 1 初识Redis1.1 认识NoSQL1.1.1 结构化与非结构化1.1.2 关联和非关联1.1.3 查询方式1.1.4 事务1.1.5 总结 1.2 认识Redis1.2.1 介绍1.2.2 特征1.2.3 优势 1.3 安装Redis ★★★1.3.1 Linux安装Redis1.3.1.1 安装Redis依赖 1.3.2 Windows安装Redis1.3.2.1 安装步骤1.3.…

挖掘机生产装配线无线通讯应用

一、应用背景 山东某挖掘机机械有限公司主要产品有装载机、挖掘机、道路机械及核心关键零部件等系列工程机械产品。为加速新旧动能转换,全新挖掘机整机装配线配合劳动组合的调整,提高装配水平和生产效率;可集中、合理地使用工装、专用工具&a…

【深度学习】Pytorch教程(八):PyTorch数据结构:2、张量的数学运算(6):高维张量:乘法、卷积(conv2d~四维张量;conv3d~五维张量)

文章目录 一、前言二、实验环境三、PyTorch数据结构1、Tensor(张量)1. 维度(Dimensions)2. 数据类型(Data Types)3. GPU加速(GPU Acceleration) 2、张量的数学运算1. 向量运算2. 矩阵…

【rust】8、连接数据库:sqlx

sqlx 是 rust 的数据库访问工具, 本身并不是 orm,但常见的 orm 都是基于它实现的。其有如下特点: 支持异步,适合高并发编译时检查:cargo build 时检查执行 sql,校验响应值支持多数据库:mysql、…

Leo赠书活动-17期 《基础软件之路:企业级实践及开源之路》

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 赠书活动专栏 ✨特色专栏:…

学习笔记-Git

Git 问题一描述解决方法注意事项 问题一 描述 在commit和push的时候因为网络太慢了中途强行关闭了进程,而push的内容因为文件过大导致无法正常push 按照原本的流程在push的时候会提示失败,并且需要在解决了大文件之后重新push 而因为中途中断了&#x…

Autosar-Mcal配置详解-MCU

3.6.1创建、配置RAM 1)创建RAM配置 2)配置RAM 以F1KM R7F7016533ABG为例,它的local RAM有512K, global RAM 192K,Retention RAM 64K. Local RAM: local RAM就是程序平常使用的RAM,在DeepStop模式下内容会丢失。 Global RAM:主要用于DMA的源地址和目的地址使用,在Dee…

win电脑截屏的图片在哪里?电脑截屏的图片删了怎么找回来

在使用Windows操作系统的电脑时,截屏功能是我们经常使用的工具之一。然而,有时我们可能会遇到找不到截屏图片或误删截屏图片的情况。那么,Win电脑截屏的图片究竟存放在哪里?如果误删了截屏图片,我们又该如何找回呢&…

使用Windbg动态调试目标程序去分析异常的两实战案例分享

目录 1、前言 2、案例1:程序退出时弹出报错提示框 2.1、问题说明 2.2、到系统应用程序日志中看系统有没有自动生成dump文件 2.3、将Windbg附加到目标程序上进行动态调试 3、案例2:程序在运行过程中弹出ASSERT断言提示框 3.1、问题说明 3.2、将Wi…

【Python笔记-设计模式】组合模式

一、说明 组合模式是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们。 (一) 解决问题 处理树形结构:可以很好地处理树形结构的数据,使得用户可以统一对待单个对象和对象组合。统一接…

Java零基础 - 逻辑运算符

哈喽,各位小伙伴们,你们好呀,我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。 我是一名后…

第13讲实现自定义logout处理

默认logout请求实现是有状态的,返回到login请求页面;我们现在是前后端分离处理,所以需要自定义实现logout 新建JwtLogoutSuccessHandler /*** 自定义Logout处理* author java1234_小锋 (公众号:java1234)…

Python算法题集_岛屿数量

Python算法题集_岛屿数量 题200:岛屿数量1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【双层循环递归】2) 改进版一【双层循环迭代】3) 改进版二【双层循环迭代高速双向队列】4) 改进版三【双层循环并查集】 4. 最优算法5. 相关资…

五、分类算法 总结

代码: from sklearn.datasets import load_iris, fetch_20newsgroups from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.naive_bayes import MultinomialNB from s…