性能测试的一些(我们用的)方法 * 2
1.观测, 观测, 观测
-eBPF/Systemtap
-中间件自身提供观测
-USE
2.测试工具校准
关于观测:
第一,推荐两种观测工具,eBPF或Systemtap;
第二,我们自己也做中间件,我们中间件自身是提供了一些观测指标的,向大家介绍一下这种方法;
第三,有一种线程是对于资源消耗的观察手段,即USE;
l eBPF *** 作系统级的观测
eBPF此处引用我的同事洪斌在今年的PHPCON的演讲,他的演讲主题是《MySQL性能诊断与实践》,其中详细的介绍了一下这个工具能给大家带来什么好处,列举其中几个,如:
1. 延迟分布,比如MySQL请求的延迟,VFS延迟,Ext4的延迟,块设备的延迟等;
2. MySQL的文件IO压力分析;
3. 临时表的生命周;
4. 短连接的分析;
举一个例子,下图是eBPF的一个脚本,可观察MySQL的延迟,它会给大家列出延迟的分布曲线:
左边这一类是延迟,从零到一,二到三,四到七,它是指数级增长,单位是微秒,可以看到的是 压力打在数据库上的平均延迟,大量的数据压力在128微妙到255微妙之间,这个数据库的整体延迟还是不错的。
这张材料引用自Breddan Gregg的项目BCC,是eBPF的实用脚本集,它能观测 *** 作系统的方方面面,来帮助大家做压力观测。
l 中间件自身提供观测
*** 作系统的观测已经很全了,为什么中间件本身也要提供一些观测点,我们自己的中间件DBLE,是一个开源项目,GitHub上可以搜到,在DBLE中我们提供了这样的一种观测方法,如下:
DBLE把一个压力下来分成了六个阶段:
- 开始梳理
- 完成解析
- 完成路由分配
- 从数据库回收结果
- 后置处理
- 反馈处理
每个阶段提供了时间分布,这样我们可知道压力到底在中间件的哪一个阶段变慢。
比如在这个数据下,中间件的性能其实不错,是因为从第三个点到第四个点之间是后端数据库的处理,它占了整个处理时间的70%以上,所以在这种情况下可以判断后端数据库已经慢了,而不是中间件产生了什么太大的问题,所以中间件本身应该提供观测。
在这个项目的文档中, 我们把画了中间件的压力处理流程,其实对于大部分的中间件都是这样的,这张图在DBLE开源的文档上都可以找到。安利一下我们自己的中间件DBLE,大家有兴趣的话可以去看一下,文档齐全,分析方法也很齐全。
中间件本身的观测与 *** 作系统的区别在于: 中间件提供的视角是站在压力处理的视角来提供的, *** 作系统视角是站在资源的视角来提供,这两个视角缺一不可。如果只知道 *** 作系统说IO压力大,但是并不知道是哪个环节造成的压力大,那诊断瓶颈的成本会比较高. 这就是为什么中间件要补充一个视角。
l USE
对于资源来说,强烈推荐《性能之巅》这本书,它介绍的分析方法叫USE,就是使用率、饱和度、错误率这三个指标就足以评估一个资源,IO资源也好,网络资源也好,足以评估一个资源现在的使用状况。
举一个例子,为什么使用率和饱和度得分开,如果现在 *** 作系统告诉我们内存占用率是100%,内存能不能再申请出来一块?是可以的,因为内存的使用率100%,其中比如说有50%是分给buffer和cache, *** 作系统会自动回收,这种情况下内存的使用率是100%,但饱和度并没有达到饱和,我们可以继续使用内存,直到它的饱和度上升到100%为止,这个内存就再也申请不出来了。
所以这就是为什么这本书将使用率和饱和度一定要拆开的原因。强烈推荐!
我们在DBLE中间件内部也提供了类似这样的观察机制,有点像Linux的Load average. 我们对于它的每一个线程的使用都提供了一分钟、五分钟或者是十五分钟这三种使用率的评估。通过使用率就可以观察到在并发压力下中间件的运行状况到底是死在了一根线程上,还是每根线程上承载的压力差不多。之前关于线程公平性的问题也可以通过这个指标来诊断。
2.测试工具校准
测试工具校准,举个例子,BenchmarkSQL,是Java版的TPCC,不少银行都在用它检验一个数据库或者是检验一个中间件能不能正常表现,但是我们碰到了这样一个问题:在测试压力中, 测试脚本要删一个记录,如果删不掉我就一直的删,一直删,但是这个工具在RR的隔离级别下造成一个死循环。
这个死循环是这样的:
第一句话它把auto commit设成0;
第二句select就会开启一个事务;
第三句话在这个压力下跑过一段逻辑之后再select看看这行数据还在不在,如果在就去删掉它。如果隔离级别是RR的,在第二三句之间把这行数据删掉,那么此时还能看到这行数据对吧. 但之后的delete回应没有影响数据行,所以BenchmarkSQL就会陷入上面的这条死循环,看到数据, 删除, 没删掉, 然后就一直会去删,但是一直能看到这行数据,所以就会陷入这个死循环。
换句话说BenchmarkSQL,在RR的隔离级别下就会造成这样一个死循环。 很难想象这个工具是在银行客户中被大量使用. 有一天项目经理告诉我,友商的中间件好着啊,然后我们就必须要去研究这款中间件,为什么它没有问题,原因是设置了RR的隔离级别, 它实际下到数据库的压力是RC隔离级别,RC隔离级别错在第三步看不到这条数据,它就不会跑下面这个循环,所以人家的中间件的错误将测试工具的错误抵消了。我们呼吁在测试时保持科学的态度.
在开始演讲之前姜老师的笔记本在这个环境下工作是好的,我说能不能换我的笔记本做这个演讲,我就把线插入我的笔记本然后两边都显示不出来了. 这个时候姜老师最应该说的一句话是什么呢?在我的环境下它是好的啊,但他并没有说,这是一个很科学的态度。
关于性能测试,我们推荐两个方法:
第一个方法,性能测试一定要去观测,观测的目的是什么,看到瓶颈,看到瓶颈的目的是什么?解决掉它以获得一个完全可以重复的正确的性能测试值来获得正确的结论。
第二个方法,测试工具一定要校准,业界常用的测试工具有很多,不要相信一些小众的测试工具,每一种测试工具都一定要校准。校准的话可以用多种测试工具同时去跑,去校准,或者是去分析测试工具的压力类型,刚才的观测过程就足以分析一个测试工具实际下发到后端的压力到底是什么,足以看到它的压力类型是什么,分析它的压力模式是不是正确的,以做测试工具校准。
所以在我们的公司ISO流程里边有一个规定是半年用这个测试工具做一次校准,因为测试工具也在面临着升级,我们面临的测试工具很多,这是我想讨论的第二个部分。
是软件,不是服务器中间件是一类连接软件组件和应用的计算机软件,它包括一组服务,以便于运行在一台或多台机器上的多个软件通过网络进行交互。该技术所提供的互 *** 作性,推动了一致分布式体系架构的演进。该架构通常用于支持并简化那些复杂的分布式应用程序,它包括web服务器、事务监控器和消息队列软件
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)