7D性能项目日记5:性能分析是查找瓶颈证据链的过程,而不是罗列数据

本文主要是介绍7D性能项目日记5:性能分析是查找瓶颈证据链的过程,而不是罗列数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、前言
    • 二、性能分析工程师要有产出
    • 三、性能瓶颈要有明确的证据链
    • 四、看到现象就蒙原因

一、前言

在性能项目中,性能分析部分是最为复杂,也是最能体现价值的地方。

二、性能分析工程师要有产出

在我们这个项目中,我设置了专门做性能分析的人。

专职性能分析,就是在性能场景执行起来之后,在场景运行的过程中分析出性能瓶颈点在哪里。

有人说,这样的要求是不是太高了,一个系统涉及到那么多的技术栈,一个人如果不能覆盖所有,怎么分析出来瓶颈呢。在我看来,如果分析不了全部,那至少可以分析部分,如果任一部分都给不出明确的结论,那就不具备分析能力。

但是,性能分析工程师不能没有性能分析的产出,也就是我在项目中定义的一个产出物“性能分析调优报告”。

我是要求每个性能分析工程师只要有场景执行就要有分析过程的产出的。即使没有最终的瓶颈分析出来,那也要把分析的过程记录下来,因为我要看这个分析的逻辑是不是对的。

如果逻辑是对的,但是由于技能不足导致了没有结果,那这时候我可以支持你继续分析下去。在关键点上,没有思路了,告诉我,我来告诉你怎么往下走。

如果瓶颈结论没有分析出来,分析的过程也没记录,那谁知道你的价值是什么呢?

三、性能瓶颈要有明确的证据链

在项目中,我一直强调一句话:所有性能场景都有瓶颈。而性能分析工程师要做的是把这些瓶颈找到,并且把证据链列出来。

这里的证据链是什么呢?

不是“CPU使用率高”、“DISK中bi/bo过多”、“CS很高”这样模糊的描述,高是多少?要给出具体的值。

那你说,我改成这样的描述是不是就可以?“CPU总体使用率达到100%”、“DISK bi/bo每秒超过2万”、“CS每秒超过10万次”,这总有数值了吧。但是这样的描述可不可以做为结论来描述呢?

当然是不行的,因为这样的数值也只是瓶颈分析过程中的起点,它也只是瓶颈的现象,离瓶颈点还远。

也就是我们还要回答下一个问题:这个值是不是瓶颈?要想回答这个问题,就没那么简单了。

比如说:DISK bi/bo每秒超过2万,这个值合理还是不合理呢?我们首先要做出的是判断,对于性能来说,就两个关键字:快、慢。

我们在场景执行过程中首先看的是场景数据,场景中有响应时间的趋势图,如果响应时间的趋势仅和DISK IO的趋势相关,而通过响应时间的拆分判断发现,只要DISK IO高,响应时间就必然会高,同时在其他所有的计数器上都没有发现问题,这样可以判定为DISK IO影响了响应时间,这时候就是不合理的,就是瓶颈点;如果没有这样的关系,那就不是瓶颈点。

举个具体的例子:
在这里插入图片描述

在看到这个图时,项目中有小同学说这个bi/bo是个瓶颈点,因为这里的值上上下下的,显然不规律嘛。并且也有挺高的时候,达到 3 万以上。那这个判断对不对呢?我们详细拆解一下。

从bi/bo两列来看,确实一直都是有值的。那这个值是不是我们的瓶颈点呢?在判断是不是瓶颈点之前,我们先算一下,这个值到底大不大。

如果你不清楚 bo 是什么,就先看一下命令的帮助,其中这样写到:

在这里插入图片描述

可见 bi、bo 是指的每秒读写的 block 个数。所以这个值不是字节,那既然不是字节,就要查一下block是多大。怎么查 block 是多大呢?先得看一下磁盘的格式。有很多种手段看磁盘的格式,这里我用 df -TH 来看。

在这里插入图片描述

从Type一列来看,/dev/sda1用的是vfat,/dev/sda2用的是vfs,vdev/mapper/rhel-u01用的是xfs。文件类型有很多种,像cramfs,ext2,ext3,ext4,fat,msdos,xfs,btrfs,minix,vfat这些。 为什么这里我要查一下文件格式呢,因为不同的文件格式要用不同的命令来看block大小。

在这里,我们的文件是在 /u01 这个挂载点上的,所以格式就是 xfs,这里我用 xfs_info 来看磁盘的信息。

在这里插入图片描述

从上图中可以看到,bsize 是 4096 字节,如果你不理解这个输出,也可以看 xfs_info 的帮助中有一句:

在这里插入图片描述

也就是说,一个block是4096字节。

再回到上面的vmstat输出:

  • 最大的一次bi(读)是 34171 个block,也就是: ( 34171 x 4096 ) / 1024 / 1024 (34171x4096)/1024/1024 (34171x4096)/1024/1024 约为 133.48M。而其他的值显然都比它要小。
  • 最大的一次bo(写)是 4429个 block,也就是: ( 4429 x 4096 ) / 1024 / 1024 (4429x4096)/1024/1024 (4429x4096)/1024/1024 约为 17.3M。

如果你有兴趣,可以把这一列的所有值都算一遍,看看读写的趋势。我即便没有一个个算,也大概能判断,这个读写的趋势一定是上上下下跨度很大的。像bi列最小的才19,bo列最小的是500多。

那这个趋势和我们的tps、响应时间有没有关系呢。再回来看一眼tps和响应时间图。

在这里插入图片描述
在这里插入图片描述

从趋势上看就对不上,因为tps比较平稳地上升,动荡幅度并不大,而响应时间也随着tps的增加也在上升,虽然慢,但是动荡幅度也并不大。

所以,上面的 bi/bo 和这个性能瓶颈点并没有关系。

上面的过程,在我看来才是分析,我们把别人脑子里认为的逻辑关系经过分析了之后,给出明确的答案,这是性能项目中经常的事情。

四、看到现象就蒙原因

在性能分析过程中,我经常看到一些人,看到现象就蒙原因。而这个蒙原因的过程由于没有完整的证据链,就会产生沟通上的误导。

只能让人根据蒙的原因试着去优化。一次、两次、三次,就会逐渐失去信任。

在我们这个项目中,我说过,如果没有明确的证据就不用找开发。因为那样会让开发觉得我们不是专业的,有些基础的自己可以判断的都在瞎蒙,怎么能得到别人技术上的尊重。

记得疫情期间做扫码系统的时候碰到一个架构师的角色的人,一个问题蒙了七次都没对。这样的人怎么会让人信任呢?

在这个项目中,也是因为一直这样要求团队,所以在和开发的沟通界面上,从一开始开发的被动配合,到后来的主动配合,时不时的还能唠个闲嗑。

如果你想在性能市场上生存下去,性能分析的思路一定是重要的能力之一。

这篇关于7D性能项目日记5:性能分析是查找瓶颈证据链的过程,而不是罗列数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/914799

相关文章

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加