Linux 常见性能分析方法论介绍(业务负载画像、下钻分析、USE方法论,检查清单)

news2024/11/26 20:32:23

写在前面


  • 博文内容为 《BPF Performance Tools》 读书笔记整理
  • 内容涉及常用的性能调优方法论介绍:
  • 业务负载画像
  • 下钻分析
  • USE方法论
  • 检查清单
  • 理解不足小伙伴帮忙指正

不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树


讲到性能分析,可以觉得有点高大上,实际上,性能分析在日常运维场景中很常见,系统故障往往可以是性能问题导致。

性能分析的目标是什么?

一般来说,性能分析的目标是

  • 改进最终用户的体验
  • 降低运行成本

最好能将性能分析的目标进行量化定义;这种量化能够表明是否已经达到性能优化目标,还可以用来定义距离目标还有多少差距。可以测量的指标包括如下几项。

  • 延迟:多久可以完成一次请求或操作,通常以毫秒为单位。
  • 速率:每秒操作或请求的速率
  • 吞吐量:通常指每秒传输的数据量,以比特(bit)或者字节(byte)为单位。
  • 利用率:以百分比形式表示的某资源在一段时间内的繁忙程度
  • 成本:开销/性能的比例。

最终用户眼中的性能,可以通过用户请求从发出到被响应之间所花费的时间来衡量,性能优化的目标就是缩短这个时间。这个等待时间被称为延迟

针对延迟的改进可以通过分析请求时间的组成,将其细分为各个组成部分,例如,

  • CPU上运行代码的时间;
  • 等待某个资源,比如磁盘IO、网络以及锁的时间,等待CPU 调度的时间等。

可以编写一个 BPF工具,直接跟踪应用的总体请求延迟以及各个部分的单独开销不过这样的工具会和具体应用相关,并且由于同时对多个事件进行跟踪会带来显著的运行开销。

在开展性能分析工作时请牢记上述目标使用BPF工具,很容易出现这种情况:生成了大量数据,然后又花费了大量时间来理解这些数据,最后却发现该指标并不重要

首先应该明确工作目标是什么:我们是要降低请求延迟,还是降低运行成本?明确目标后,进一步的分析工作就有了上下文,不至于跑偏。

BPF性能分析工具,不只用于分析特定类型的问题。下表所示的是一个性能分析工作的列表,以及在每项工作中 BPF 性能分析工具可以发挥的作用。

性能分析活动BPF 性能分析工具
原型软件或硬件的性能特征分析测量不同业务负载下的延迟直方图
在开发阶段、集成阶段之前的性能分析解决性能瓶颈点,寻找一般的性能改进点
针对软件的某个版本,在发布前/后进行的非回归测试从多个不同来源记录代码的使用和延迟数据,支持快速定位回归测试问题
基准测试,为软件发布的市场宣传工作提供数据支撑研究性能问题,寻找机会改进基准测试性能
在目标环境下进行的概念验证(Proof-ofconcept)测试生成延迟分布直方图,确保性能满足请求的服务等级协议(SLA)
监控生产环境中运行的软件编写可以 24x7运行的工具,提供新的、之前属于盲区的性能指标
故障排查时的性能分析使用现成的工具或根据需要创建自定义的观测点来解决特定的性能问题

多重性能问题

同时发现多个性能问题,需要识别那个性能问题才是最重要的,通常是那些对延迟或者成本开销影响最大的性能问题。

开展那些工作对性能分析有帮助?(性能分析方法论)

如何处理性能分析工具提取的数据,需要机遇性能分析方法论,方法论是一个可以遵循的过程,指导从哪里开始,中间需要做些什么,从哪里结束。

业务负载画像

业务负载画像的目的是理解实际运行的业务负载。你不需要对最终的性能结果进行分析.

消除不必要的工作”是笔者在性能优化结果中收益最显著的一种,通过研究业务负载的构成就可以找到这样的优化点。开展业务负载画像的推荐步骤如下:

  • 负载是谁产生的(比如,进程ID、用户ID、进程名、IP地址)?
  • 负载为什么会产生(代码路径、调用、火焰图)?
  • 负载的组成是什么(IOPS、吞吐量、负载类型)?
  • 负载怎样随着时间发生变化(比较每个周期的摘要信息)?
vfsstat

在这里插入图片描述

上面的输出显示了这虚拟文件系统 VFS 层面业务负载的细节,并且回答第三个问题,即负载类型和操作的速率,同时还通过周期性的输出信息回答了第四个问题
作为第一个问题的Demo,使用 bpftrace 运行一个单行的程序

bpftrace -e 'kprobe:vfs_read { @[comm] == count(); }'

在这里插入图片描述

输出显示了名称为“Web Content”的进程在上述测量期间执行了1725次 vfs read IO 操作。

第二个问题,可以通过火焰图来分析

在这里插入图片描述
Linux CPU 性能分析工具火焰图(Flame Graphs)认知

下钻分析

下钻分析的工作过程是从一个指标开始,然后将这个指标拆分成多个组成部分,再将最大的组件进一步拆分为更小的组件,不断重复这个过程直到定位出一个或多个根因。

可以用一个类比来帮助解释这个过程。设想一下,如果你收到了一笔数额巨大的信用卡账单。为了分析它,需要登录到银行账户中调阅交易记录。在那里你发现了一笔线上书店的大额交易。然后你又登录到线上书店去看哪些书引发了这笔交易,结果有点意外:你发现不小心将此刻正在读的这本书购买了1000本(多谢!)。这就是下钻分析过程:先找到一个线索,然后拆分以寻找更深一步的线索,如此反复直到问题解决。下钻分析的推荐步骤如下:

  1. 从业务最高层级开始分析。
  2. 检查下一个层级的细节。
  3. 挑出最感兴趣的部分或者线索。
  4. 如果问题还没有解决,跳转至第2步。

下钻分析可能会涉及对工具进行定制,此时bpftrace 比 bcc 更加适合。有一种类型的下钻分析涉及将延迟分解为各个组成部分。想象一下下面的分析过程:

  1. 请求延迟 100ms 毫秒
  2. 有10ms在CPU上运行,90ms消耗在脱离CPU的等待过程。
  3. 在脱离CPU等待的部分中,有89ms阻塞于文件系统上。
  4. 文件系统的部分,有3ms阻塞于锁上,而86ms阻塞于存储设备上。

到此为止,你可能已经得出结论:存储设备是问题所在–这确实是一种答案。但是下钻分析可以使问题的上下文更清晰。设想另一种可能的分析过程:

  1. 一个应用花费了89ms被阻塞在文件系统上。
  2. 文件系统花费了78ms被阻塞在写操作上,11ms被阻塞在读操作上。
  3. 在文件系统写操作中,77ms被阻塞在时间戳的更新上。

此时,可以得出的结论是:文件系统访问时间戳是延迟的根源,它们可以被禁止(通过改变挂载选项)。这个分析结果要比“我们需要更快的磁盘”好得多。

一个下钻分析Demo

USE方法论

通过 USE 方法论来对资源的使用情况进行分析

  1. 使用率
  2. 饱和度
  3. 错误

使用当前方法第一补是 绘制软件或者硬件资源图,然后一次对资源进行上述检查

在这里插入图片描述

这个方法论的优势之一是,它以重要的问题作为开始,而非以某种指标形式的答案作为开始,反过来再去找出为什么它重要。这个方法论同时会帮助发现盲区:从你需要回答的问题开始,而不管是否已有工具能够方便测量。

关于Linux中使用USE(使用率/饱和度/错误)方法分析系统性能

检查清单法

性能分析检查清单可以列出一系列工具和指标,用于对照运行和检查。这些工具和指标可以聚焦于那些唾手可得的性能问题:列出十几个常见的问题,以及对应的分析方法,这样让每个人都能参照检查。这个方法论适用于指导公司各个层次的工程师实施操作,允许你将个人的技能应用于更广的范围内。
下面会给出两个清单,
一个使用了传统(非BPF)工具,比较适合于快速分析(开始的 60 秒);
Linux 60秒快速性能分析操作手册

另一个清单是适合及早使用的 BCC 工具列表。

博文部分内容参考

© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知 😃


《BPF Performance Tools》


© 2018-2024 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

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

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

相关文章

基于百度地图实现Android定位功能实现(一)

Android集成百度地图 文章目录 Android集成百度地图前言准备工作创建工程申请密钥 在项目中集成BaiduMap SDK创建地图 前言 本案例使用百度地图实现在Android中集成地图,并且实现了普通地图/卫星地图,以及路况图和热状图功能; 参考技术文档&…

SRS OBS利用RTMP协议实现音视频推拉流;WebRTC 屏幕直播分享工具

一、SRS OBS利用RTMP协议实现音视频推拉流 参考:https://ossrs.net/lts/zh-cn/docs/v5/doc/getting-started 1)docker直接运行SRS服务: docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 registry.cn-hangzhou.aliyuncs.co…

如何使用固定公网地址远程访问内网Axure RP生成的网站原型web页面

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

开源翻译大模型

开源翻译大模型 1 简介 在开发过程中,会遇到定制化翻译工具的需要,开源的翻译模型可以解决相应的问题。其中英语转中文的比较好的开源项目有: 序号组织模型地址备注1赫尔辛基大学语言技术研究小组(Language Technology Researc…

debug: 解决typora两侧留白过大问题

问题如下图:解决办法:打开: 文件 -> 偏好设置 -> -> 外观 -> 看主题选择的是哪一个, 我选择的是GitHub * 点击打开主题设置 -> 选择你对应主题的.css文件 -> CTRL cv 备份一份, 然后打开 在文件中找到max-width : 修改对应的值 , 我改成了1920px * 改好以后…

安装即启动?探索流氓App的自启动“黑科技” (Android系统内鬼之ContentProvider篇)

前段时间发现了一个神奇的app,它居然可以在安装之后立即自启动: 看到没有,在提示安装成功大概1到2秒后,就直接弹出Toast和通知了! 好神奇啊,在没有第三方app帮忙唤醒的前提下,它是怎么做到首次安…

谷粒商城——RabbitMQ

0. 消息中间件 1.RabbitMQ的核心概念 2. 工作流程 整体架构: 相关细节: 上述要注意的是: 路由键包含在message的头中,其作用是用于指定该消息存储与哪个消息队列中。 信道是客户端(包括生产者和消费者)用…

WIFI驱动移植实验:WIFI从路由器动态获取IP地址与联网

一. 简介 前面两篇文章,一篇文章实现了WIFI联网前要做的工作,另一篇文章配置了WIFI配置文件,进行了WIFI热点的连接。文章如下: WIFI驱动移植实验:WIFI 联网前的工作-CSDN博客 WIFI驱动移植实验:连接WIF…

Python字符串字母大小写变换,高级Python开发技术

寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ‘’’ demo ‘tHis iS a GOod boOK.’ print(demo.casefold()) print(demo.lower()) print(demo.upper()) print(demo.capitalize()) print(demo.title()) print(dem…

什么是 SSL 证书?

SSL 证书的介绍 SSL(Secure Sockets Layer)证书是一种由数字证书颁发机构(CA)签发的加密证书,用于在 Web 浏览器和服务器之间建立安全连接。SSL 证书能够确保网站和应用程序的数据传输过程中不被窃听、篡改或伪造&…

springboot点餐平台网站

目 录 摘 要 1 前 言 2 第1章 概述 2 1.1 研究背景 3 1.2 研究目的 3 1.3 研究内容 4 第二章 开发技术介绍 5 2.1相关技术 5 2.2 Java技术 6 2.3 MySQL数据库 6 2.4 Tomcat介绍 7 2.5 Spring Boot框架 8 第三章 系统分析 9 3.1 可行性分析 9 3.1.1 技术可行性 9 3.1.2 经济可行…

初始《string》及手搓模拟实现《string》

目录 前言: 为什么学习string类? 标准库中的string类 1. string类对象的常见构造 ​编辑 2. string类对象的容量操作 ​编辑 3. string类对象的访问及遍历操作 4. string类对象的修改操作 5. string类非成员函数 vs和g下string结构的说明 vs下s…

C/C++游戏编程实例-飞翔的小鸟

飞翔的小鸟游戏设计 首先需要包含以下库&#xff1a; #include<stdio.h> #include<windows.h> #include<stdlib.h> //包含system #include<conio.h>设置窗口大小&#xff1a; #define WIDTH 50 #define HEIGHT 16设置鸟的结构&#xff1a; struct …

在线版的超级马里奥 Super Mario HTML5

原本是在csdn资源找个代码学习的&#xff0c;无奈下载了几份都是垃圾代码(下载了几份都是) 废话不多说&#xff0c;直接上干活。代码、音效、图片、样式都包含 <!doctype html> <html> <head> <meta charsetutf-8 /> <title>Super Mario HTML5 …

C语言变量存储属性

在C语言中&#xff0c;变量不仅仅是用来存储数据的容器&#xff0c;还拥有一些额外的存储属性&#xff0c;这些属性决定了变量的生命周期、作用域和存储位置等。本文将介绍C语言中常见的变量存储属性&#xff0c;包括自动存储、静态存储、寄存器存储和外部链接存储&#xff0c;…

吾空笔记本X15降温

低成本搞了个悟空笔记本&#xff0c;其实就是蓝天磨具&#xff0c;跟木叶村&#xff0c;机革一样&#xff0c;只是说机革边角改得多点&#xff0c;这两个基本没改。通病是轻薄本压不住AMD这个U&#xff0c;如果在超频模式&#xff0c;且带高刷屏&#xff0c;GPU加CPU的功耗&…

【Linux】认识线程池 AND 手撕线程池(正常版)

文章目录 0.回顾进程池1.计算机层面的池化技术2.线程池预备知识2.1介绍线程池2.2设计线程池的意义是什么&#xff1f;2.3其他知识 3.回顾C类与对象3.1cpp什么情况下成员函数必须是静态的&#xff1f;3.1可变参数列表3.2格式化输出函数3.3预定义符号 4.图解线程池运作原理4.0完整…

并查集----格子游戏

并查集中最重要的是要搞懂&#xff1a; 不明白的可以拿纸自己先演示一番&#xff0c;find函数不仅能找到他们的祖先数&#xff0c;而且同时也能更新路径的子结点都等于祖先&#xff0c;然后以后寻找时会更加的方便&#xff01;

P3817 小A的糖果(贪心)

思路&#xff1a;真绝了&#xff0c;开了longlong从80分到了100分。因为一个特判st值影响我AC&#xff0c;那个单独的特判竟然有问题。我想的是如果有a[i] a[i1]则将状态值st标为true。最后在输出结果之前先看st的值&#xff0c;如果他为false&#xff0c;则说明没有两盒子的和…

网络编程套接字 (一)

本专栏内容为&#xff1a;Linux学习专栏&#xff0c;分为系统和网络两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握Linux。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;网络 &#x1f69a;代码仓库&#xff1a;小小unicorn的代…