lixintcwdsg
2021-11-21 22:00:07 +08:00
不合理,一般来说 QPS200 CPU70%,大概率存在大量线程切换,检查一下几个地方
1. spring boot 线程数是不是满了,自带 tomcat 默认 200 ,如果满了说明后端处理太慢了。
2. 看一下你的 mysql 线程池大小多少,是不是默认的 8 。
3. 看一下你的 mysql 每条查询到底多少毫秒,开一下 druid 这类链接池监控就行,看看是不是 mysql 查询存在瓶颈。
4. 开 jprofile 之类的工具,在线看一下 CPU 事件消耗在哪里,大概是 mysql 引起的线程等待
可能的处理方案:
1. 如果 mysql 存在瓶颈,建议把 spring boot 的线程数调低,高了毫无意义。
2. mysql 查询快,你可以缩小你的 mysql 线程池数量,反之扩大。
3. redis 确保用异步驱动不要用 jedis
4. 客户端是离散的还是集中的,如果固定一些极其请求你这个服务,http keep-alive 记得开。
最后,你这类服务如果要用 java ,不建议 spring boot 。至少不要用同步的 jdbc ,该用异步数据库驱动+异步 redis 驱动+少线程(一般都是基于 netty )的 web 容器。比如干脆 vert.x
当然这个涉及到技术选型,可能你说了不算。还有一个方案你可以参考,就是把 spring boot 不要自己接 http 请求,spring boot 就启动一个 netty 就好了,netty 负责 http 编解码和 vo 转换部分,netty 和 spring boot 通过 applicationContext 交互。至少保证线程数不太多,CPU 也不会飙多高,你专心调整的 mysql 线程池到一个合理数量。
最后,CPU 飙高说来说起大概率还是线程太多的问题~~