1. 性能测试

1.1 确定需求

因为要支持某个业务,领导希望系统的某个接口能够支持2万的 QPS,因为我们的应用部署在多台机器上,要支持两万的QPS,我们必须先要知道该接口在单 机上能支持多少QPS,如果单机能支持1千QPS,我们需要20台机器才能支持2万的QPS。需要 注意的是,要支持的2万的QPS必须是峰值,而不能是平均值,比如一天当中有23个小时QPS不足1万,只有一个小时的QPS达到了2万,我们的系统也要支持2万的QPS。

1.2 使用工具

推荐使用Jmeter进行性能测试,该工具脚本编写简单,可以分布式部署。

1.3 执行测试

在多台机器上部署了Jmeter之后,可以通过调度机进行调度,统计出QPS和响应时长。

1.4 结果分析

1.4.1 查看机器连接

测试开始后,首先登录到服务器里查看当前有多少台机器在压测服务器,因为程序的端口是12200,所以使用netstat命令查询有多少台机器连接到这个端口上。命令如下。

netstat -nat | grep 12200 -c

通过这个命令可以知道已经有多少台机器在压测服务器。

1.4.2 优化数据库连接与SQL

QPS达到了1400,程序开始报错获取不到数据库连接,因为我们的数据库端口是3306,用netstat命令查看已经使用了多少个数据库连接。命令如下。

netstat -nat | grep 3306 -c

增加数据库连接,QPS没上去,但是响应时长从平均1000毫秒下降到700毫秒。

这里可以查询下慢SQL。如果查询出有慢SQL,要对SQL进行优化。

1.4.3 查看CPU利用率

使用 TOP命令观察CPU利用率,发现已经90%多了,于是升级CPU,和线上的机器保持一致。再进行压测,CPU利用率下去了达到了75%,QPS上升到了1800。执行一段时间后响 应时长稳定在200毫秒。

1.4.4 优化线程池

增加应用服务器里线程池的核心线程数和最大线程数到1024,通过ps命令查看下线程数 是否增长了,执行的命令如下。

ps -eLf | grep java -c

再次压测,QPS并没有明显的增长,单机QPS稳定在1800左右,响应时长稳定在200毫秒。

注:这里是用数据库举例,如果用到了其他服务,比如ES或者Redis,同理。

2. 性能测试中使用的其他命令

查看网络流量:cat /proc/net/dev

查看系统平均负载:cat /proc/loadavg

查看系统内存情况:cat /proc/meminfo

查看CPU利用率:cat /proc/stat

参考资料

《Java并发编程的艺术》