springboot 单机 qps 只有 2000 合理吗?

2021-11-21 10:33:03 +08:00
 passer9527
我们用的 springcloud 那一套,部署在阿里云的 ecs 上。

ecs 配置:4c 8g
程序流程:从 rds (mysql) 中获取数据,放入 redis ,然后做 vo 转换,返回。如果有 redis 有数据,就会直接返回,不会从 mysql 中获取。

目前结果是单机 qps 只能到 2000 ,超过 3000 之后,机器负载就会很高,比如 cpu 超过 70%, 内存也超过 70%。

我们高峰 qps 有 3w , 感觉只能加很多机器才能抗住。

我的问题是:springboot 的单机 qps 这么低吗?
5769 次点击
所在节点    Java
19 条回复
xbh1794970183564
2021-11-21 11:48:53 +08:00
合理
xbh1794970183564
2021-11-21 11:50:39 +08:00
3W 你们指望几台机器就顶住吗。。。
wudaye
2021-11-21 14:54:12 +08:00
排查过瓶颈在哪吗?做过 tomcat 调优吗?
moshiyeap100
2021-11-21 16:27:01 +08:00
如果不是简单查询接口,我觉得还算合理的,我们的核心业务接口单机 qps 估计 400 都不到。。。。
fighterhit
2021-11-21 16:34:33 +08:00
听听楼下大佬怎么说
mind3x
2021-11-21 18:06:09 +08:00
Spring Boot 什么版本?同步还是异步(WebFlux)? Redis 命中率多高? JVM heap 使用如何? GC 开销占多少?
reeco
2021-11-21 18:20:56 +08:00
信息太少了,没法评估
coderbbb
2021-11-21 18:34:48 +08:00
盲猜。按你说的程序流程的话,CPU 大头应该在 VO 转换上,建议把转换后的 VO 缓存。另外,还得看具体业务,比如 VO 的更新频率高不高,缓存命中率能到多少。
Salticey
2021-11-21 19:15:17 +08:00
合理吧,我之前有压过一个和你说得类似的模块,还是 16C16G 的,但是是容器部署的(我晓得性能会损失多少),单纯命中缓存的数据 tps 能到 3700 ,再往上 cpu 打满直接宕机了。
mazyi
2021-11-21 20:57:06 +08:00
就看 vo 转换要多少 cpu 了,一个字段还是一百个字段都不一样
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 飙高说来说起大概率还是线程太多的问题~~
GeekGao
2021-11-21 23:11:04 +08:00
4c8g 的虚拟机能跑出这种 QPS 已经很好了。毕竟云上都是 vCPU ,主频分配是动态的。
btw 从实用角度来看,单机这种量级的线上应用估计起码是个准独角兽公司吧
Feiex
2021-11-21 23:50:42 +08:00
#11 基础上,再加一项:是不是日志打印太多了,关掉日志再看下
salmon5
2021-11-22 09:54:28 +08:00
关键是“qps 有 3w”,不差这几块钱
pmispig
2021-11-22 10:01:47 +08:00
单机居然有这么多,我们单机 qps 只有 20
securityCoding
2021-11-22 11:24:47 +08:00
@Feiex 日志打印可太影响效率了,曾经压测一个接口关闭日志后 qps 提高了 40%。。。
securityCoding
2021-11-22 11:27:28 +08:00
可以使用阿里开源的 arthas 注入进程看下整体的链路耗时
jorneyr
2021-11-22 12:55:19 +08:00
云主机的性能不好,同样的配置,比物理机差很多。

2014 年的 MBP, i7 4C 8G ,也是 Spring Boo 程序,和你这个逻辑差不多。
2018 年做的压测,同时连上无线和有线双网卡都工作,QPS 达到 15000 左右,如果只有无线或者有线,QPS 为 7000 多。
xinQing
2022-01-28 16:20:32 +08:00
单机居然有这么多,我们单机 qps 只有 100

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/816898

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX