请教 Springboot 接口 RPS 优化问题

2022-12-07 09:50:05 +08:00
 Kontinue

目前的部署环境如下:

服务: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 了。

请问下还有什么优化的方式吗?

2181 次点击
所在节点    程序员
29 条回复
Kontinue
2022-12-07 11:07:39 +08:00
@PlanV 阿里云这边,我创建的测试是最高 1000 个 RPS ,就是每秒 1000 个请求,实际 TPS 峰值是 960 ,就是最多能处理这么多
liuhuansir
2022-12-07 11:07:41 +08:00
@Kontinue 我的理解 tps 的 T 指的是用户通过客户端访问,到服务端响应的整个过程,业务有简单的一次查询 mysql ,也有复杂的多次查询,甚至查询多个库,qps 的 Q 则只是单独指 mysql 的一次查询,也就是说一次 t 可能包含多个 q
pangdundun996
2022-12-07 11:17:03 +08:00
@Kontinue 我理解都是指客户端请求接口到返回的过程,但 QPS 是纯查询,而 TPS 是包含增删改操作,显然用 TPS 衡量系统性能更合理,很明显这都是跟特定接口相关联的,不可能每个接口 TPS 都能到 8000 ,所以压测指标一定是根据接口逻辑不同而不同,不可能一概而定,试想一下,查询订单跟下单这两个接口能一样吗?所以你领导的要求不准确
mango88
2022-12-07 11:30:34 +08:00
可以尝试一下
1. 把 -xms -xmx 设置成相同的固定值,避免 JVM 自动伸缩堆大小带来影响
2. 增加一个空接口,作为基准测一下机器网络 IO
3. 看一下 redis 的负载监控和数据库的负载,压测时候看一下机器 CPU 负载高的原因,排除一下是否因为写日志造成的磁盘 io 高
justplaymore
2022-12-07 11:44:49 +08:00
你的服务组成总共有三个组件:Java 应用,Redis ,MySQL 。
思路:隔离组件测试,找瓶颈点。
经验:大概率瓶颈点是 MySQL ,在上面的三个组件里,关系型数据库的性能是相对很低的。
xuanbg
2022-12-07 12:19:54 +08:00
2 台 4C ,rps8000 ?接口响应时间要在 1ms 才能做得到。其实平均 400 就已经非常不错了
byte10
2022-12-07 12:34:28 +08:00
@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 ,必须要预热一下,才可以得到 实际上的性能,不然不准确。
superliy
2022-12-07 14:07:59 +08:00
@xuanbg 我觉得你这样考虑不准确,2 台 4C ,也就是一共 8 个核心,1ms 处理一个请求,那么 8 个核心 1ms 就是处理 8 个请求,1s=1000ms 处理 8000 个请求,你是这样算的对吗?

那如果需要 10ms 处理一个请求,但其实 10ms 里是包含了 io 的操作的,也就是 10ms 里真正 cpu 占用的时间可能只有 1ms ,剩余的 9ms 是在等 io ,等 io 的时间 cpu 是让出资源给其他线程的,所以虽然一个请求时长 10ms ,但是 10ms 里一个核心可能也处理了 10 个请求
Kontinue
2022-12-07 14:53:08 +08:00
@superliy 10ms 一个请求算上网络时间了吗?

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

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

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

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

© 2021 V2EX