最近产品组更新了一个包,做压测的时候发现不管用4核cpu还是16核cpu压测,总利用率都是100%多,吞吐量为2/SEC。
如果部署多个springboot实例,则cpu使用率会提升。
然后将问题反馈给项目组,项目组发现代码中有锁,去掉锁修改相关代码后,测试。
用jmeter压测5000并发()发现16核cpu空闲率达到40%,虽然吞吐量上去了 达到12/SEC,但是单个请求才560ms,按道理,吞吐量应该
能达到20-30/sec。
按之前经验,修改application.properties中:
hystrix.threadpool.default.coreSize=10/1000/5000
都无效果。
然后用stack -l xxx查看发现:
以http-nio-9900开头都线程200个,其中有大量处理waitting,通过代码栈查看到大量线程在等待锁,为
OutputStreamAppender.subAppend 210 查看源代码发现有lock.lock代码。
原来最近为了调试日志,有大量日志打印,导致写日志的时候锁定,后将日志级别改成error。吞吐量达到30/sec
知识点:1、容器默认200个线程处理请求,tomcat.maxThreads。
2、总200个,有9个线程正在执行业务代码,1个线程写入logback文件,其他的等待锁。并不是只有10个线程处理。
3、C1 CompilerThread知识点,编译器优化线程。详见https://blog.csdn.net/chenxiusheng/article/details/74007750
4、转16进制
jstack -l 4796 | grep 1367 -A 20
并将线程号2129和2130转换成16进制(printf "%x\n" 2129)