V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
night98
V2EX  ›  程序员

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

  •  
  •   night98 · 2022-03-21 21:57:54 +08:00 · 2310 次点击
    这是一个创建于 971 天前的主题,其中的信息可能已经有所发展或是发生改变。

    应用服务器配置 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

    8 条回复    2022-03-22 00:38:21 +08:00
    pkwenda
        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 。。影响因素太多了
    zoharSoul
        2
    zoharSoul  
       2022-03-21 23:29:34 +08:00
    mysql 和 java 所在的服务互换一下

    java 用那个 1c1g 的, mysql 用 2c4g 的 试试
    night98
        3
    night98  
    OP
       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
        4
    night98  
    OP
       2022-03-21 23:32:38 +08:00
    @zoharSoul 哈哈,这个可以试一下,不过看 mysql 监控 cpu 一直没打满,尝试增加数据库连接池线程数反而性能更低,所以一直想先压榨出应用极限性能
    zoharSoul
        5
    zoharSoul  
       2022-03-21 23:39:03 +08:00
    @night98 #4 我的意思是性能瓶颈卡在数据库, 或者你看下链路追踪具体哪慢了, 针对性优化比较好解决.

    万一是 sql 耗时占 70%, 你在这逮着 Tomcat 使劲调也没必要不是
    night98
        6
    night98  
    OP
       2022-03-22 00:03:33 +08:00
    @zoharSoul 明天加个 skywalking 监控一下看看,现在用 jprofiler ,对性能影响比较大,有没有其他的推荐的?
    fallingg
        7
    fallingg  
       2022-03-22 00:35:56 +08:00 via iPhone
    调小 tomcat 线程数,2c 没有必要开这么多线程
    ericls
        8
    ericls  
       2022-03-22 00:38:21 +08:00 via iPhone
    先 benchmark, profile 再说
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1092 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:32 · PVG 07:32 · LAX 15:32 · JFK 18:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.