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

相关文章

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机