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

请教一个可能是 Tomcat 相关的问题

  •  
  •   volantRookie · 135 天前 · 1219 次点击
    这是一个创建于 135 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先说下大概情况,环境使用的 openjdk1.8 ,使用 springboot 开发的一个业务程序,没有微服务框架,测试机和服务机同是内网机器,网络延迟很低。现象是服务器的内存占用在 40%左右,CPU 占用在 30%左右,用 jmeter 压测,线程数分别开到 100 、300 、500 ,吞吐量一直在 30 多一点,内存和 CPU 占用也没有提升。正常的现象不是应该随着并发的提升,资源占用越来越高吗,为什么这个吞吐量一直上不去,服务器资源还有很大空闲。补充一点,我把压测的那一个接口业务内容都注释了,是一个空方法,没有数据库和其他的业务操作。 已经排查过的问题: 1.首先改的是 Tomcat 配置,改了 maxThreads=10000 ,maxConnections=10000 ,acceptCount=-1 。 2.后来网上搜到说是可能是 nginx 、tomcat 的 keepalive 配置不匹配有关,这里没有用 nginx 。 3.用 jprofiler 看到的情况是,线程不停地在加,但是大量的线程进入了 timed waiting 状态,后来用 jstack 命令看这些线程,没有显示出服务里边具体的代码行号,显示的是

    • waiting on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject tomcat 的 taskQueue.poll 方法之后,后来用 netstat 去看有很多 tcp 连接在服务端口处于 timed waiting 状态

    感觉还是和 Tomcat 的配置有关,有没有懂这块的大佬,给个排查的思路,或者给个方向也行,谢谢啦

    13 条回复    2023-12-15 08:55:12 +08:00
    ikas
        1
    ikas  
       135 天前
    你改的线程数太大了,没有意义

    你要先估计你的业务方法大概的执行时间,然后再来估计最大并发

    比如你的业务相当小,里面就是一个简单的计算,那么这时候线程数配置到 cpu 内核数即可

    如果你的业务内是一个复杂的计算,相当耗时,那么就根据时间 倒推最大的线程数,逐层测试

    如果你的业务内又是网络连接等 io 操作,那么你要先优化这些,比如异步,加线程池,然后再来计算
    adoal
        2
    adoal  
       135 天前
    acceptCount 设置-1 是哪里的说法
    chendy
        3
    chendy  
       135 天前   ❤️ 1
    建议直接起个空 spring boot 项目,写一个空接口,直接对着 spring boot 的端口压
    然后再一点点把你们的东西加上来,看看是哪里的问题
    volantRookie
        4
    volantRookie  
    OP
       135 天前
    @chendy 好嘞,如果再找不到只能这样慢慢加了,Thanks♪(・ω・)ノ
    volantRookie
        5
    volantRookie  
    OP
       135 天前
    @adoal 等待队列的大小,为负数就是无限制,查到的是这么说的
    volantRookie
        6
    volantRookie  
    OP
       135 天前
    @ikas 请求的那个接口内容已经注释掉了,是一个空方法,按道理服务器压力主要来自请求的接收,就是想排除与业务有关的问题,所以感觉大概率是外部原因。Thanks♪(・ω・)ノ
    mango88
        7
    mango88  
       135 天前
    吞吐量上不去时候 有观察过 GC 情况吗 ?
    volantRookie
        8
    volantRookie  
    OP
       135 天前
    @mango88 GC 看到的波动没有很剧烈,对了,启动内存给的 8G ,实际只使用了 1G
    imokkkk
        9
    imokkkk  
       135 天前
    确实奇怪
    dumbbell5kg
        10
    dumbbell5kg  
       135 天前
    吞吐量一直在 30 多一点,是不是看错了?
    因为 waiting on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject 说明 tomcat 线程在等队列里产生任务,已经没任务执行了,怎么会还是 30 多
    dumbbell5kg
        11
    dumbbell5kg  
       135 天前   ❤️ 1
    来个 demo 项目,和压测操作步骤(带图),如果情况跟你说的一样,我有兴趣研究
    chaoschick
        12
    chaoschick  
       135 天前 via Android
    有没有可能是改 tomcat 线程数的那块配置没生效
    volantRookie
        13
    volantRookie  
    OP
       134 天前
    @chaoschick 我再试试
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2707 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 11:36 · PVG 19:36 · LAX 04:36 · JFK 07:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.