应用服务器配置 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
1
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 。。影响因素太多了 |
2
zoharSoul 2022-03-21 23:29:34 +08:00
mysql 和 java 所在的服务互换一下
java 用那个 1c1g 的, mysql 用 2c4g 的 试试 |
3
night98 OP @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 ,这个可以调多点,不过试了下结果还是一样的,甚至延迟还高了一点。 |
4
night98 OP @zoharSoul 哈哈,这个可以试一下,不过看 mysql 监控 cpu 一直没打满,尝试增加数据库连接池线程数反而性能更低,所以一直想先压榨出应用极限性能
|
5
zoharSoul 2022-03-21 23:39:03 +08:00
|
6
night98 OP @zoharSoul 明天加个 skywalking 监控一下看看,现在用 jprofiler ,对性能影响比较大,有没有其他的推荐的?
|
7
fallingg 2022-03-22 00:35:56 +08:00 via iPhone
调小 tomcat 线程数,2c 没有必要开这么多线程
|
8
ericls 2022-03-22 00:38:21 +08:00 via iPhone
先 benchmark, profile 再说
|