Tomcat 高并发情况下响应时间优化

2022-03-21 21:57:54 +08:00
 night98

应用服务器配置 2C4G MYSQL 配置 1C1G SpringBoot 项目,使用 Docker 运行,默认配置,最大内存配置 2G ,运行环境 OPENJDK17 ,内嵌 tomcat 容器,JVM 配置为默认配置,内存在并发情况下较为稳定,G1 GC 无明显影响

数据库连接池大小为固定 4 个连接

代码场景(抢红包): 接口 A 写入一条记录+N 条(10)记录 接口 B 分别更新接口 A 的 N 条记录

现主要问题,高并发情况下(并发数 100 ,TPS 1500),RT99 只能做到 150ms ,并发数 200 ,TPS 1700 ,RT99 只能做到 200 左右,希望 RT99 压到 80ms 以内

现调整了以下 tomcat 主要参数

server:
  tomcat:
    threads:
      max: 200
      min-spare: 200
    processor-cache: 2000
    max-connections: 2000
    accept-count: 1

现在问题是无论如何调整后三个参数,RT99 都无法降下来,也尝试过线程数固定 100 ,pc150 ,mc150 ,ac500 ,RT 图相对稳定,但仍有一次较大的波动。

请问一下这种情况如何优化 RT99

2192 次点击
所在节点    程序员
8 条回复
pkwenda
2022-03-21 22:49:54 +08:00
既然看到了就给点半吊子的意见吧。。。
期望的 80ms 内没给并发指标啊,比如想要 tps 达到 1500 ?

docker 1C1G SpringBoot 项目,xmx 配置 2G 是什么意思

一共 1G 内存,jvm 用一些,内嵌 tomcat 用一些,1 个 vus 代表一个线程,代表至少 1M 的内存占用,tomcat 应该默认 nio 了。

vus 100 比 vus 200 快,100 对应 tps 600 多,200 对应 tps 1000 ,是不是说明压测的结论已经出来了:cpu 调度的能力在 100 - 200 之间,否则线程切换的效率,还不如 100 ,这样适当加 cpu 试试

抛开并发数,单说代码优化的话,可以观察几个角度:
1 、jdbc 层面有没有可能优化
2 、日志是否是异步(不要小看同步日志的耗时)
3 、一个 TPS 对应了 多少 QPS ,有没有可能优化。。

另外你的压测机性能行么。。性能不行可以试试 K6 。。影响因素太多了
zoharSoul
2022-03-21 23:29:34 +08:00
mysql 和 java 所在的服务互换一下

java 用那个 1c1g 的, mysql 用 2c4g 的 试试
night98
2022-03-21 23:31:08 +08:00
@pkwenda 补充一下,期望 RT99 80ms 内,tps1800 左右?

然后 1c1g 是 mysql 的配置,买的单独的服务,应用机是 2c4g ,只跑了这一个服务,配置了 2g 内存
按照您提供的意见,明天我调整到 4c4g 试试。看阿里云控制台 ecs cpu 峰值大概也才 70 左右,线程数估计是控制在 120-150 左右比较合适

jdbc 连接池用的 HikariCP ,配置是 4 个连接,orm 用的 mybatis plus ,初期调优的时候把接口 A 的批量插入优化了一下,有小部分的提升。

日志默认用的 springboot 的 logback ,打算把整体压到 80 再试试 log4j ,然后再试一下 log4j 全异步日志的性能差异,现在就是卡在 tomcat 线程池调优这块了。

TPS/QPS 基本是 1:1 ,接口 A,B 都主要是插入或者更新操作。

压测用的阿里的 PTS ,直接用他们的机器,单机封顶在 2000QPS ,这个可以调多点,不过试了下结果还是一样的,甚至延迟还高了一点。
night98
2022-03-21 23:32:38 +08:00
@zoharSoul 哈哈,这个可以试一下,不过看 mysql 监控 cpu 一直没打满,尝试增加数据库连接池线程数反而性能更低,所以一直想先压榨出应用极限性能
zoharSoul
2022-03-21 23:39:03 +08:00
@night98 #4 我的意思是性能瓶颈卡在数据库, 或者你看下链路追踪具体哪慢了, 针对性优化比较好解决.

万一是 sql 耗时占 70%, 你在这逮着 Tomcat 使劲调也没必要不是
night98
2022-03-22 00:03:33 +08:00
@zoharSoul 明天加个 skywalking 监控一下看看,现在用 jprofiler ,对性能影响比较大,有没有其他的推荐的?
fallingg
2022-03-22 00:35:56 +08:00
调小 tomcat 线程数,2c 没有必要开这么多线程
ericls
2022-03-22 00:38:21 +08:00
先 benchmark, profile 再说

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

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

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

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

© 2021 V2EX