

请教 Springboot 接口 RPS 优化问题
source link: https://www.v2ex.com/t/900684
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

目前的部署环境如下:
服务:jdk11 +springboot2.5 JVM 默认配置
阿里云 ECS 4c 16G * 2 + SLB 做负载均衡 RDS MySQL5.7 2c 8G 单机 Redis 主要做分布式锁
目前测试下来,TPS avg 500+,峰值 900+,业务异常大主要是 tryLock 没获取到锁直接 return 了。
领导说这配置理论应该能处理 5000 ,峰值可以到 8000 ?之前冷系统做的多,不太清楚,这个配置可以能到什么量级,虚心求教。sql 基本已做优化,没啥慢 sql 了。
请问下还有什么优化的方式吗?
Seulgi 7 小时 11 分钟前 你领导是在说理论 tps 5000?
|
![]() |
cheng6563 7 小时 9 分钟前 没用消息队列消峰?那瓶颈基本就在数据库了。
|
2han9wen71an 6 小时 57 分钟前 @Kontinue 100QPS 的我觉得同步不太可能,等一手大佬回复
|
fengpan567 6 小时 55 分钟前 看看接口的响应时长
|
Seulgi 6 小时 53 分钟前 本身 2c 8g 的 mysql 配置也不算高. 同步峰值不到 1000, 感觉已经差不多了.
|
![]() |
Kontinue 6 小时 51 分钟前 @fengpan567 图里写了,正常 100 以内,压测下 avg:320ms
|
night98 6 小时 45 分钟前 2c8g tps 顶天应该在 3-4000 左右,理论和实际肯定有差别,你领导在瞎编
|
![]() |
cheng6563 6 小时 31 分钟前 那没啥办法咯,MySQL 这类数据库的事务性能就这样了。要么怼高配置要么搞下数据分片咯。
|
![]() |
pangdundun996 6 小时 27 分钟前 有 cat 埋点吗?压测看调用耗时,看具体瓶颈在哪里:应用还是 mysql ,mysql 慢的话看负载,基本就知道该怎么优化了。
而且 QPS 和 TPS 是两码事,你领导要的是 QPS 还是 TPS ? |
fengpan567 6 小时 20 分钟前 每台部署了几个服务,看能不能加下服务数量? btw ,压测时用 arthas 的 trace 命令看看方法的链路的消耗时长
|
![]() |
Kontinue 6 小时 19 分钟前 @fengpan567 一台一个服务,峰值 cpu 已经 90%,再多开也没意义吧?
|
![]() |
Kontinue 6 小时 10 分钟前 @pangdundun996 QPS 和 TPS 对于数据库,Q for 查询,T for 事务,那对于一个接口而言指的是什么?我也不太清楚= =
|
![]() |
PlanV 6 小时 8 分钟前 这是什么测试工具啊,小白认真提问,还有你们说的 TPS 、QPS 分别指什么呢
|
![]() |
mango88 6 小时 4 分钟前 你领导在瞎扯
|
![]() |
liuhuansir 5 小时 56 分钟前 @Kontinue 我的理解 tps 的 T 指的是用户通过客户端访问,到服务端响应的整个过程,业务有简单的一次查询 mysql ,也有复杂的多次查询,甚至查询多个库,qps 的 Q 则只是单独指 mysql 的一次查询,也就是说一次 t 可能包含多个 q
|
![]() |
pangdundun996 5 小时 47 分钟前 @Kontinue 我理解都是指客户端请求接口到返回的过程,但 QPS 是纯查询,而 TPS 是包含增删改操作,显然用 TPS 衡量系统性能更合理,很明显这都是跟特定接口相关联的,不可能每个接口 TPS 都能到 8000 ,所以压测指标一定是根据接口逻辑不同而不同,不可能一概而定,试想一下,查询订单跟下单这两个接口能一样吗?所以你领导的要求不准确
|
![]() |
mango88 5 小时 33 分钟前 可以尝试一下
1. 把 -xms -xmx 设置成相同的固定值,避免 JVM 自动伸缩堆大小带来影响 2. 增加一个空接口,作为基准测一下机器网络 IO 3. 看一下 redis 的负载监控和数据库的负载,压测时候看一下机器 CPU 负载高的原因,排除一下是否因为写日志造成的磁盘 io 高 |
![]() |
justplaymore 5 小时 19 分钟前 你的服务组成总共有三个组件:Java 应用,Redis ,MySQL 。
思路:隔离组件测试,找瓶颈点。 经验:大概率瓶颈点是 MySQL ,在上面的三个组件里,关系型数据库的性能是相对很低的。 |
![]() |
xuanbg 4 小时 44 分钟前 2 台 4C ,rps8000 ?接口响应时间要在 1ms 才能做得到。其实平均 400 就已经非常不错了
|
![]() |
byte10 4 小时 29 分钟前 @xuanbg 并不是的。https://www.bilibili.com/video/BV1FS4y1o7QB/ 可以看下,这里的压测说明。
从响应时间来说,你的 java 程序起码 大概需要开到 3000 个线程才可以。所以不管你什么配置,哪怕 32 核心,100G 内存。 首先设置足够的线程数: 先验证是否 mysql 的瓶颈,直接 mysql 加到 16 核,看看是否有改善。如果没有的话,那么就说明瓶颈在 java 程序上,估计是 java 的代码太复杂了。 如果瓶颈在 mysql ,要么优化 sql ,要么加配置。 https://www.bilibili.com/video/BV1FS4y1o7QB/ 可以看下,这里的有讲解吞吐量的实际情况。 还有你压测的 http 连接数一定要跟大于线程数,也就是你接口响应是 100ms ,那么你至少 1000 个 http 连接数才有可能达到 1w qps ,这个细节很少人知道。不解释,可以直接看视频。 另外 java 有 jit ,必须要预热一下,才可以得到 实际上的性能,不然不准确。 |
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK