热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一个典型的测试压力机的性能调优过程

转自:https:www.sohu.coma166900718_151779https:www.cnblogs.com111testingp11218538.html性能测试过程中

转自:https://www.sohu.com/a/166900718_151779

https://www.cnblogs.com/111testing/p/11218538.html

性能测试过程中,不仅仅是对被测系统的性能问题定位、分析、优化,很多时候负责批量请求发起的压力机也存在各类性能瓶颈。毕竟用几千块钱的机器就想把几个亿的机器压瘫也是稍稍需要点技术的。

这里介绍一次典型的压力机性能优化过程,期间涉及到磁盘IO问题、CPU不足的问题、内存耗尽的问题,分别采用参数调整、代码调整等方法一一化解。

压力机disk busy100%问题

(一) 问题

压力机的一个重要功能是作为挡板,接收A报文,返回对应的B报文。

性能测试过程中发现,用来接收报文的的本地队列拥堵,收到一批报文后,挡板要较长时间才能处理完,即回挡报文的效率很低。比如,接收A报文共10分钟,挡板一共用了17分钟才将所有B报文返回。

(二) 分析定位

首先看PC的任务管理器->资源监视器,从CPU、内存、网络、磁盘入手分析

发现PC机“磁盘最长活动时间”长时间保持100%

接下来查看哪个进程用磁盘最多,发现是JAVA,但JAVA的应用很多,需要具体定位到是哪个应用。

在任务管理器中看这个进程是哪个应用,单击那个进程,右键“打开文件位置”;定位到使用磁盘最多的是MQ程序。

(三) 解决

MQ导致的写磁盘IO过多,最简单的方法就是减少写IO的次数。MQ写磁盘无非就是写日志、写报文,怎么样减少写IO的测试,这里需要一些MQ的知识。

1. 循环日志VS线性日志

MQ日志,有循环日志和线性日志两种,其中:

1)线性日志是连消息内容都保存在日志里,如果queue里面的消息被删了,也可以用日志恢复,即线性日志保存的内容多。

2)循环日志不保存消息

检查mq日志是不是线性日志,如果是,可以改为循环日志来缓解。

如果不起作用,进入下一步

2. 3重写入VS 1重写入

MQ默认的日志写入是3重写入。改为1重写入

这样可以节省大量Disk IO

如果还没有达到效果,进入下一步

3. 持久消息VS非持久消息

持久消息是要写的磁盘的文件里,且记日志(两次写磁盘)

非持久消息,不记日志,一般不会写到磁盘里,除非mq buffer不够用,放不下当前的消息,才会进入磁盘,(非持久消息只有在发不出去的情况下才丢掉,一般情况不会丢失),即一般情况不写磁盘

对于测试压力机,可以容许异常情况下丢报文,所以可以改为非持久消息,这样,又少了一次写IO。

4. 增大MQ buffer

上面提到“非持久消息,不记日志,一般不会写到磁盘里,除非MQ buffer不够用,放不下当前的消息,才会进入磁盘”。因此增大MQ Buffer也可以在某些压力情况下减少一次写IO。

本场景中,我们调整MQ buffer为10M。

(四) 效果

最后“磁盘最长活动时间”由100%变为10%以下,TPS大幅提高。

压力机CPU 80~90%

(一) 问题7台压力机,总计预计发送750笔报文/秒,但发现只能发出来500多笔报文/秒。

继续从PC的任务管理器->资源监视器,CPU、内存、网络、磁盘的分析入手。

这次,我们发现每台压力机CPU 80~90%,也就是说,磁盘IO的问题解决之后,CPU又变成了下一个瓶颈。

(二) 分析

这种情况下,一般是代码占用了过多的CPU。

分析代码发现,每一次性能测试工具的迭代(线程被调用),这个线程只处理一个MQ消息,即处理一个MQ消息需要打开、关闭一次MQ队列,这个打开、关闭队列是非常消耗CPU的。

(三) 解决

每次性能测试工具的迭代(线程被调用),让这个线程处理多个MQ消息。

问题来了,并不是每次迭代处理的越多越好,每次处理多少个MQ消息合适?

我们采用了 “当前队列深度”和“指定参数”的最小值。

为什么不是“当前队列深度”:设置为“当前队列深度”即每次迭代处理这个队列中所有的报文。那么如果队列深度很大(比如深度是100),这个线程要顺序处理这些消息,比较慢,其他线程得不到消息去处理,性能测试工具发挥不了并发处理的优势。

如果设置一个参数(比如10),每个线程每次最多处理10个消息,那么其他线程就有机会得到消息去并发处理。

因此,我们采用了 “当前队列深度”和“指定参数”的最小值。

(四) 效果

调整代码之后,预计发送750笔报文/秒,实际也真的发出来750笔报文/秒,不但如此,CPU由80-90%变为了30-60%,节约一半的CPU资源。

TPS提升50%,CPU降低一半,里外里,意味着TPS提升了200%(以前40%的CPU利用率支撑250TPS,现在是750TPS)

场景跑完后,压力机CPU变为100%

(一) 问题

场景跑的时候压力机 CPU 60-70%,跑完后,压力机CPU变为100%。

(二) 分析

这种情况一定是循环没有设置间隔。

或者是线程里面没有设置间隔,或者是线程的两次迭代之间没有设置间隔。经分析是线程的两次迭代之间没有设置间隔。

为什么最初没有设置间隔呢?因为这段代码的作用是实时抓取到达的报文并处理,如果设置间隔了就不那么实时了。

(三) 解决

设置间隔一定能解决这个问题,那么怎么设置呢?

1) 如果线程的两次迭代之间设置间隔,那么接收报文处理的环节就有一定的延时。不是我们想要的(人为的延长了响应时间)。

2) 在应用线程里面设置间隔。

如果有报文需要处理的时候,不设置时间延迟,实时抓取,没有报文的时候延迟20ms后再次读取队列。

处理方法为,判断队列深度,如果深度为0,则延迟20ms,不为0则不延时。

(四) 效果

修改代码后,场景跑完后CPU自然回落(100%变为10%以下)。

内存耗尽

(一) 问题

PC机(4G内存)执行测试时,只有200M剩余,鼠标键盘操作非常缓慢。

(二) 分析

性能工具的JVM是预分配的1.5G,但实际上并没有用那么多

(三) 解决

把性能工具所占的jvm内存从1.5G调为1G。

(四) 效果

调整后,系统显示有840M可用内存,鼠标键盘操作比较灵活

----------------

从上面的4个问题的描述、分析和解决可以看出,有些问题需要些产品的知识,有些问题需要些代码的知识,完成一个性能测试会遇到各方面的问题,性能测试人员必须是多面手。



推荐阅读
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • java线程池的实现原理源码分析
    这篇文章主要介绍“java线程池的实现原理源码分析”,在日常操作中,相信很多人在java线程池的实现原理源码分析问题上存在疑惑,小编查阅了各式资 ... [详细]
  • 一面自我介绍对象相等的判断,equals方法实现。可以简单描述挫折,并说明自己如何克服,最终有哪些收获。职业规划表明自己决心,首先自己不准备继续求学了,必须招工作了。希望去哪 ... [详细]
  • 子类从父类继承所有的成员(字段,方法,嵌套类),构造方法不属于成员,所有子类不能继承,但是子类可以调用父类的构造方法对于private方法和属性,子类一定是继承了的,但是没有访问权 ... [详细]
  • jvm内存区域与溢出为什么学习jvm木板原理,最短的一块板决定一个水的深度,当一个系统垃圾收集成为瓶颈的时候,那么就需要你对jvm的了解掌握。当一个系统出现内存溢出,内存泄露的时候 ... [详细]
  • Android系统启动过程分析一、Android平台架构首先贴一张Android系统架构图方便理解整个Android架构,这可以让我们从整体上对整个启动流程有个大概认知。可以看出整 ... [详细]
author-avatar
桃Z夭夭
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有