压测的时候准备工作
1.明确运行环境(避免环境污染),准备相应的压测环境
2.明确压测内容
3.预估压测结果,然后根据实际结果进行比较,得出相应的结论。
一般压测的时候,我会先本地压测,然后在没有环境污染的环境进行压测,主要原因是本地压测的时候,可以进行代码调整,这个时候压测的结果会不准,但是压测时间长的时候,基本可以看出一些系统问题,会报一些系统错误,就可以在本地调试了。在本地调试没问题,然后在没有环境污染的环境进行压测。然后本地压测结果进行参考。
在k8s压测比较好,因为k8s资源比较充足,然后cpu和内存比较好分配
一般压测的话,是对http请求进行压测的话,可以用jmeter进行压测,如果对mq进行压测,jmeter也可以,不过需要自己装插件就是了。
对http请求压测流程:
1.明确压测环境参数,如下:
配置 (内存和cpu配置),集群数量,并发线程数量,循环次数,吞吐量,错误率,cpu使用率,内存使用率
吞吐量(QPS):每秒钟处理请求次数
我在不同的配置进程压测,测试内存和cpu不同情况压测结果。
然后通过集群来测试一下,压测结果是不是成倍增加。
2.首先在当前环境一下,请求一个http,这个http不做任何业务逻辑,返回一个ok字符串就行,然后压测的出这个请求的吞吐量,这样的话,就是一个http的极限值,可以做为结果基础参考。
3.然后请求一个正常的http请求,这个就是要压测的http请求。这个http请求日志记录一下http请求需要花费多长时间,里面的每个业务逻辑也记录一下时间。最好每个redis和mq请求也记录一下时间,这样的话,可以明确出每个处理点花费的时间,这样子可以明确出哪个地方需要优化。
当然,如果集成调用链工具,进行埋点,统计各个点的时间,这个效果更好。
优化方案:
1.tomcat线程池优化
一般tomcat的线程数为200,这个线程数处理的吞吐量有点低,然后通过修改线程数,不断的压测,提高吞吐量。2核2g内存吞吐量最大大概在4000左右,所以线程数可以调整到2000-3000左右。
2.redis和mq优化
如果压测时候,发现redis和mq处理时间越来越长,就要看一下,redis和mq是哪里阻塞了。
- 线程池数量够不够
- tcp释放是否及时(window netstat -an|find "TIME_WAIT" /c)
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
- mq是不是有确认消息确认机制(能不能不要消息确认,这样的话,处理速度会非常高)
- 如果确认是tcp没释放,可以单独压测redis或者mq或者httpclient,看是哪个引起的.
3.查看是不是有sleep等让线程暂停的方法
尽量不要用sleep方法,在高并发的时候会引起线程阻塞。如果不会影响线程的话,是可以用的
4.有写比较耗时的操作,可以尽量用异步线程处理,这样可以提高高并发,减少处理时间
jmeter压测
jmeter下载
https://jmeter.apache.org/download_jmeter.cgi
windows下载zip后,解压,然后到bin目录下,点击jmeter.bat启动既可
docker 安装比较简单
docker pull egaillardon/jmeter
#去除报告和日志
rm -rf *.log *.jtl
#选择压测计划和配置压测结果存放位置
docker run --interactive --tty --rm --volume /usr/local/jmeter:/jmeter egaillardon/jmeter --nongui --testfile http.jmx --logfile http.jtl
jmeter汉化
在bin/jmeter.properties
修改
language=zh_CN
jmeter使用步骤
1.新建线程组
右击添加线程,线程组
填写线程数和循环次数
2.由于http请求是通过body方式的,所以需要设置请求头
在线程组那边,右击添加,配置元件,http信息请求头,Content-Type:application/json
3.添加http请求,右击添加取样器,http请求
4.右击添加监听器,观察结果树和聚合报告
5.点击最上面的绿色三角形,就是表示运行压测,扫把表示清除压测结果。记得压测的时候,不要切换到聚合包括和观察树那边去,会影响压测结果。每次重新压测的时候,最好把上次的压测结果清除掉。