本文章主要是讲述下项目调优中遇到的问题和调优思路,关于jmeter的使用,可以在我的博客中jmeter的使用找到,有兴趣的可以看看。
看完的jmeter的使用方式文章的朋友都知道,我只是使用了简单的两个接口进行压测,吞吐量可以达到1.5w以上,一般我们的系统是完全达到不到这个吞吐量的,因为系统接口在处理方法时既要处理逻辑处理业务,又要连接数据库处理数据,其中连接数据库是一个很大的耗时间的线程,另外如果业务逻辑出现冗余代码块,也会影响性能,这些都是可以优化的,话不多说,直接说下我在项目中遇到问题和优化方式

先说说我调优前的吞吐量,非常之低,很低很低,当时吞吐量是只有30,太可怕,想到需求方要求是单个接口200的吞吐量,我是绝望的,但想想活还是得有人干,只能闷头干活了,看看哪里出现了问题!!!!!!
数据源连接池

经过分析后,可能是框架使用数据源出了问题,debug一步一步走下去,看看系统是怎么使用数据源配置文件参数,创建线程池的,果然框架创建的线程池出现问题,全程只使用了一个线程,不30才奇怪呢。
大家可能不会遇到我这个问题,毕竟大家使用的框架应该都是很成熟的,我之所以遇到这个问题是:公司的框架很旧很旧,另外此次项目中途换了数据源,搭建项目时也没多想,该还的时候还是得还呀!!!!一步一步优化下,将数据源连接池加上去。

数据源配置文件

可以看看数据源配置文件,各个配置参数是否正常,我们一开始创建的线程初始化只有5个,最大才20个,这种配置即使数据源线程池没有问题,高并发后,肯定出现问题,因为最大值只有20个,

initialSize = 300
maxActive = 1024
minIdle = 5
maxWait = 2000
removeAbandoned = true
removeAbandonedTimeout = 10
timeBetweenEvictionRunsMillis = 60000
minEvictableIdleTimeMillis = 300000
validationQuery = SELECT 1 FROM DUAL
testWhileIdle = true 
testOnBorrow = true
testOnReturn = false

果断设置成300,这种方式带来的后果就是启动时会很慢,因为需要创建300个线程,没办法,启动慢不是问题,毕竟要加载很多配置文件,只要运行起来不出问题稳定就好

业务逻辑优化

看看接口java代码业务逻辑能不能优化,能优化赶紧优化

sql调优

优化完后,使用jmeter压测下试试看,比上次30好很多,已经可以达到120左右,还得继续优化,无法发现问题所在,只能针对每一个可能出现长时间处理的代码块进行时间打印,打印时间显示执行sql处理时间很长,特别是查询sql,那说明只能优化sql了(压测的数据库数据量为了针对压测,每一个表创建了10w条数据,如果只是少数据量的话,很难发现sql出现了问题)
1)sql语句优化下,尽量少使用函数,或者分组,如果需要分组,看看怎么分组更合理,也尽量少使用排序,排序也很耗时间
2)sql语句涉及的数据库表,是否有到索引,没有使用到的赶紧建立索引
3)优化sql语句连表查询问题,尽量少连接表查询,无关紧要的表能不连接就不连接
4)对于insert的sql语句,观察下表结构,减少不必要的字段作非空限制,或者索引的创建,数据库执行insert语句时在这些上面也很耗时间

java虚拟机的内存配置优化

项目启动时的java虚拟机的内存配置,尽量配置高一点,这样也会提高很多性能,我们项目服务器内存是8GB,我直接将java的jvm设置4GB,只要服务器的运行指标没有问题及直接设置,别慌!!

nginx进行性能调优

如果使用到了nginx作为负载均衡,可以针对nginx进行性能调优,将worker_processes 4;直接四核跑起来

ps -ef|grep nginx
显示nginx是跑了四个线程,四个线程对于负载均衡也是有好处的,可以往这方面调优下
减少日志打印

如果日志打印太多,对于性能来讲不是一件好事,io流写文件很耗时间,另外日志写多了,很容易写满磁盘空间,很影响性能稳定性测试
ps:题外话:我们项目在跑1个小时的压测,生成的日志就有3GB,几个小时候瞬间把磁盘写满,严重影响了后续的压测,赶紧调下日志输出级别,一般可以调成info或error级别,最好是info,如果info级别无法满足你的压测要求,可以试试error级别,那么日志只会打印错误信息。但是系统没什么问题,打印太多info日志对于压测来讲,也没啥意义
设置完后,整个项目运行起来达到质的突变

调优成功

一步一步调优后,最后我们的接口吞吐量在多表查询时,主表数据量达10W的情况下,查询接口吞吐量达到600左右,插入数据接口吞吐量到达500左右,两个接口混测,吞吐量达到500左右,需求方的要求是在400以上,完事下班走人

20211118更新

大家在测试稳定性问题,如果是插入数据比较多,请记得对数据库空间设置足够多容量,否则可能会把数据库空间写满磁盘空间,导致后端出现报错信息,影响压测