前言
在对一个web进行性能测试过程中,需要开发者掌握一些概念,例如性能测试,到底要测试什么?常见的测试指标有哪些?要怎么做调优?
这里分享一个案例。
案例
有一个接口,需要对上传文件进行分析,流程是上传一个zip文件,解压后进行校验,分析处理后,对文件进行签名,同时返回前也会验证签名一次,再进行zip压缩输出,返回到平台,有几个重要参数,例如,文件摘要值、对文件操作的算法。
zip操作简图初步解析
这个案例看完后,从开发的角度上看,我们可能会思考,哪一些步骤会出现哪一些瓶颈,哪一个步骤需要采用什么角度来进行优化?
1)签名所用到的算法,对算法调优,或者降低安全性选用低运算的算法
2)上传大文件与下载大文件的网络传输,与本地文件多次读取的处理
3)多文件下,考虑zip的压缩与解压的调优处理
4)不考虑立即同步,是否可以采用异步调用的方式
5)web应用,tomcat容器对上传文件存放在临时文件,考虑减少IO读写
6)有哪些可以采用缓存的方式
7)JVM调优、有那些对象不需要每次都加载、处理...
签名算法
没整理好,待补充
网络传输
没整理好,待补充
zip的压缩与解压
经过压力测试,通过阿里的arthur工具包,发现在压缩与解压过程,耗时不逊于文件上传下载。
这里采用了not buffer copy、buffer copy、nio copy、nio mapped copy、nio pip copy这几种方式来对比压缩过程,文件流读取
zip压缩策略
代码迟点更新到github,待补充,各位看官稍安勿躁
异步调用
接口返回,就不采取同步了,而是提供一个返回的调用接口,执行完返回到这个回调接口,这种方式可以大大提升文件的并发吞吐量。
代码迟点更新到github,待补充,各位看官稍安勿躁
临时文件
考虑是web应用+内存,文件读取远远没那么简单,因为不可能完全让内存去直接对文件操作,所以需要将zip临时存放在服务器上,而不是内存上。
同时如果是tomcat,还会有临时目录处理上传文件,从接口上拿到的数据,并不是请求的数据,而是从tomcat临时文件中再一次获取的数据。
所以这里有居多的IO操作
1)tomcat从获取请求数据在临时文件夹(地址:tomcat.tmp.path);
2)接口获取临时文件位置的数据,存放在配置上指定的文件夹(地址:config.file.path);
3)解压文件,需要将这些files存放在又一个临时文件夹(地址:unzip.files.path);
4)对这一个个文件进行一次页面的签名,防止文件篡改,签完名,同时验证签名值存放临时文件夹(地址:sign.files.path);
5)接着通过unzip对签名文件进行压缩到一个临时文件夹(地址:sign.zip.path);
6)接口读取该地址返回。
需要改造的方向:
1)将tomcat默认的临时文件夹存放,通过springboot的配置改为制定配置的位置
如果是用springboot2.x.x,那么配置server.tomcat.basedir就行了
2)考虑响应式编程,对这个逻辑进行重新设计与重构,即解压一个文件,就立马消费(进行签名+验签),接着在准备压缩,一套流程走一起
... ...
没整理好,待补充
- 从性能测试的角度上看,需要测试什么呢?吞吐量、一次请求的响应时间、并发用户数、还有资源使用率,其中资源使用率,例如有CPU的使用情况(算法处理与常规运算),内存使用率(保证足够大的空间能够对单个文件进行处理),磁盘IO的处理(文件读取与写入)
资源使用命令
介绍完以上的一些调优方案,这里介绍一些常用的常见的测试指标,来查看系统资源的命令(Linux)
CPU占用率
vmstat 3
# 查看cpu最后一项,记录us、sy、id的数据值
# us :用户进程消耗的CPU时间百分比
# sy : 内核进程消耗CPU时间百分比
# id : CPU处在空闲状态的时间百分比
# us+sy参考值为80%,如果大于80%,说明可能存在CPU资源不足的情况
# 综上所述,CPU性能评估中重点注意r、us、sy和id列的值。
vmstat查看CPU占用率
或者采用top命令,可以观察%CPU选项,输入数字1可进行排序
top查看CPU占用率内存使用率
top
# 控制台上实时监控,查看Mem中从测试开始到测试各个阶段使用的内存有多大,MEM占比有多少,这里可以输入字母m来切换显示模式
free
# 不会实时监控,只测试一次
top查看内存使用率
free查看内存使用率
网络I/O
# eno1 为使用的端口
dstat -t -clmnsyr --tcp --net-packets -N eno1
dstat 查看网络IO变化
磁盘I/O
vmstat 3
# bi : 从块设备读入数据的总量,即读磁盘,单位kB/s
# bo : 写入到块设备的数据总量,即写磁盘,单位kB/s
vmstat 查看磁盘IO变化
使用iostat -d -x -k 1 2获取磁盘IO的数据变化情况
iostat 查看磁盘IO变化未完待续,持续更新
性能测试工具
JMX的使用
配置JAVA或者是web容器里的JAVA_OPTS类似的参数,指定JMX的
Jstat的使用
Jmeter
可视化zabbix
jmeter虽然也可以看,但是效果不佳
可视化zabbix
网友评论