云上业务一键性能调优,应用程序性能诊断工具 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 1000000000void 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.mzph.cn/news/696219.shtml

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

相关文章

使用单一ASM-HEMT模型实现从X波段到Ka波段精确的GaN HEMT非线性仿真

来源:Accurate Nonlinear GaN HEMT Simulations from X- to Ka-Band using a Single ASM-HEMT Model 摘要:本文首次研究了ASM-HEMT模型在宽频带范围内的大信号准确性。在10、20和30 GHz的频率下,通过测量和模拟功率扫描进行了比较。在相同的频…

day05-进程通信

1> 将互斥机制的代码实现重新敲一遍 代码&#xff1a; #include<myhead.h>int num520;//临界资源//1.创建互斥锁 pthread_mutex_t fastmutex;//定义任务函数 void *task1(void *arg){printf("1111111\n");//3.临界区上面获取锁资源&#xff08;上锁&#…

LeetCode每日刷题:101. 对称二叉树

题目&#xff1a; 解题思路&#xff1a;可以新写一个函数&#xff0c;从root开始&#xff0c;root的left的头结点将记为lefttree&#xff08;左子树&#xff09;,root的lright的头结点将记为righttree&#xff08;右子树&#xff09;&#xff0c; 然后递归左子树的root.left与右…

【鸿蒙 HarmonyOS 4.0】TypeScript开发语言

一、背景 HarmonyOS 应用的主要开发语言是 ArkTS&#xff0c;它由 TypeScript&#xff08;简称TS&#xff09;扩展而来&#xff0c;在继承TypeScript语法的基础上进行了一系列优化&#xff0c;使开发者能够以更简洁、更自然的方式开发应用。值得注意的是&#xff0c;TypeScrip…

Python:Keyboard Interrupt - 当代码遇到“Ctrl+C“时发生了什么?

Python&#xff1a;Keyboard Interrupt - 当代码遇到"CtrlC"时发生了什么&#xff1f; &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;【Matplotlib之旅&#xff1a;零基础精通数据可视化】 &#x1f4a1; 创作高质量博文&#x…

Web服务器集群: kylin 部署 Halo博客系统

目录 一、实验 1.环境 2. kylin 部署mysql数据库 3. kylin 构建Java运行环境 4. 创建博客使用的数据库 5. kylin 部署 halo博客系统 6. kylin 部署nginx 7. kylin 使用 SSL证书基于https访问部署的博客系统 二、问题 1.mysql安装报错 2.查看mysql数据库报错 3.syste…

【SQL注入】靶场SQLI DUMB SERIES-24通过二次注入重置用户密码

先使用已知信息admin/admin登录进去查下题&#xff0c;发现可以修改密码 猜测可能存在的SQL语句&#xff1a;UPDATE user SET password新密码 WHERE user用户名 and password旧密码 假设我们知道有个admin用户&#xff0c;但是不知道其密码&#xff0c;如何可以将其密码重置&…

杂题——1097: 蛇行矩阵

题目描述 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。 输入格式 本题有多组数据&#xff0c;每组数据由一个正整数N组成。&#xff08;N不大于100&#xff09; 输出格式 对于每一组数据&#xff0c;输出一个N行的蛇形矩阵。两组输出之间不要额外的空行。矩阵三角…

如何在群辉7.2中使用Docker搭建容器魔方服务并远程访问【内网穿透】

文章目录 1. 拉取容器魔方镜像2. 运行容器魔方3. 本地访问容器魔方4. 群辉安装Cpolar5. 配置容器魔方远程地址6. 远程访问测试7. 固定公网地址 本文主要介绍如何在群辉7.2版本中使用Docker安装容器魔方&#xff0c;并结合Cpolar内网穿透工具实现远程访问本地网心云容器魔方界面…

MySQL 窗口函数温故知新

本文用于复习数据库窗口函数&#xff0c;希望能够温故知新&#xff0c;也希望读到这篇文章的有所收获。 本文以&#xff1a;MySQL为例 参考文档&#xff1a; https://www.begtut.com/mysql/mysql-window-functions.html 使用的样例数据&#xff1a;https://www.begtut.com/m…

对象池模式-Object Pool Pattern

原文地址:https://jaune162.blog/design-pattern/object-pool-pattern/ 原文中可下载高清SVG矢量类图 引言 对象池模式(Object Pool Pattern)是一种创建一组可重用对象的设计模式。它通过维护一个预分配的对象集合,避免了频繁地创建和销毁对象所带来的性能开销。在需要使用…

力扣_字符串11—实现前缀树(字典树、Trie树)

题目 方法 对于每一个节点&#xff0c;初始化一个长度为26的数组&#xff0c;用来存储对应字母子节点的地址对于每一个节点&#xff0c;初始化一个 b o o l bool bool 变量用来表示是否为叶子节点 代码 class Trie { private:vector<Trie*> children vector<Trie…

ESP8266智能家居(1)——开发环境的搭建

1.前期介绍 本次打算使用esp8266的开发板——NodeMCU&#xff0c;进行物联网相关项目的学习。开发环境使用Arduino软件。 NodeMCU实物图为&#xff1a; 开发环境截图为&#xff1a; 2.软件下载 我使用的arduino版本为1.8.5&#xff0c;其安装包如下&#xff1a; 【免费】ar…

学习总结22

解题思路 简单模拟。 代码 #include <bits/stdc.h> using namespace std; long long g[2000000]; long long n; int main() {long long x,y,z,sum0,k0;scanf("%lld",&n);for(x1;x<n;x)scanf("%lld",&g[x]);for(x1;x<n;x){scanf(&qu…

GEE必须会教程—时间都去哪了(Date参数类型)

时间和空间是世界存在的两种基本属性&#xff0c;大部分的数据都有特有的通道存储时间信息&#xff0c;用户需要通过获取数据存储的信息&#xff0c;来判断数据的可用性&#xff0c;以及数据在时间上发生的变化。在遥感上&#xff0c;空间数据集合中&#xff0c;时间信息显得更…

django配置视图并与模版进行数据交互

目录 安装django 创建一个django项目 项目结构 创建视图层views.py 写入视图函数 创建对应视图的路由 创建模版层 配置项目中的模版路径 创建模版html文件 启动项目 浏览器访问结果 安装django pip install django 创建一个django项目 这里最好用命令行完成&#xf…

SQL注入之DNSLog外带注入

一、认识&#xff1a; 什么是dnslog呢&#xff1f; DNS就是域名解析服务&#xff0c;把一个域名转换成对应的IP地址&#xff0c;转换完成之后&#xff0c;DNS服务器就会有一个日志记录本次转换的时间、域名、域名对应的ip、请求方的一些信息&#xff0c;这个日志就叫DNSLog。…

汉诺塔问题—java详解(附源码)

来源及应用 相传在古印度圣庙中&#xff0c;有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上&#xff0c;有三根杆(编号A、B、C)&#xff0c;在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标&#xff1a;把A杆上的金盘全部移到C杆上&#xff0c;并仍…

【Nacos】构建云原生应用的动态服务发现、配置管理和服务管理平台【企业级生产环境集群搭建应用】

基础描述 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和…

猫头虎分享已解决Bug || Spring Error: Request method ‘POST‘ not supported

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …