• 请不要在回答技术问题时复制粘贴 AI 生成的内容
night98
V2EX  ›  程序员

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

  •  
  •   night98 · Mar 21, 2022 · 3190 views
    This topic created in 1545 days ago, the information mentioned may be changed or developed.

    应用服务器配置 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 replies    2022-03-22 00:38:21 +08:00
    pkwenda
        1
    pkwenda  
       Mar 21, 2022
    既然看到了就给点半吊子的意见吧。。。
    期望的 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  
       Mar 21, 2022
    mysql 和 java 所在的服务互换一下

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

    万一是 sql 耗时占 70%, 你在这逮着 Tomcat 使劲调也没必要不是
    night98
        6
    night98  
    OP
       Mar 22, 2022
    @zoharSoul 明天加个 skywalking 监控一下看看,现在用 jprofiler ,对性能影响比较大,有没有其他的推荐的?
    fallingg
        7
    fallingg  
       Mar 22, 2022 via iPhone
    调小 tomcat 线程数,2c 没有必要开这么多线程
    ericls
        8
    ericls  
       Mar 22, 2022 via iPhone
    先 benchmark, profile 再说
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2890 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 08:10 · PVG 16:10 · LAX 01:10 · JFK 04:10
    ♥ Do have faith in what you're doing.