[ Java ] 提高 tomcat 的工作线程最高数量 能不能提高吞吐量? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Kraken
V2EX    Java

[ Java ] 提高 tomcat 的工作线程最高数量 能不能提高吞吐量?

  •  
  •   Kraken
    KrakenMing 2019-01-23 11:12:15 +08:00 5564 次点击
    这是一个创建于 2533 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在搞服务器优化,对于 tomcat 有很多的疑问。现在 tomcat 使用 nio,之前工作线程线程池最大数量是默认的 200,最近我在想考虑要不要把线程池最大数量提升一些,但是 cpu 实际上能同时运行的也就那么多线程吧?增加工作线程的数量是不是不能提高吞吐量反而会增加 cpu 切换线程的压力?

    请大神们指点,另外想找些小伙伴(不只 java,还想找一些服务器运维的大神带飞)一起交流,有 q 群什么的可以发一下哦

    27 条回复    2019-02-22 21:29:02 +08:00
    gz911122
        1
    gz911122  
       2019-01-23 11:36:36 +08:00
    服务器配置跟得上的话可以提高一些
    DovaKeen
        2
    DovaKeen  
       2019-01-23 11:41:45 +08:00   1
    这应该有一个大概的函数关系吧,刚开始的时候提升线程数会增加吞吐量,到达极点以后再增加线程数会导致上下文切换带来的开销过大,反而降低吞吐量。所以如果能做一个实验的话,也许可以拟合出来这个关系?
    AngryPanda
        3
    AngryPanda  
       2019-01-23 11:50:36 +08:00
    需要基准测试
    gabon
        4
    gabon  
       2019-01-23 11:56:44 +08:00 via Android
    先找性能瓶颈啊,IO 密集还是 CPU 密集型的。CPU 密集的再怎么加线程也没用
    qilishasha
        5
    qilishasha  
       2019-01-23 12:02:10 +08:00
    你就是改到 10000 也行,能用到 200 的业务不是单服务器能玩的,不要浪费钱在单服务器上了
    liuxey
        6
    liuxey  
       2019-01-23 12:07:04 +08:00
    如果是 CPU 密集型,加了没用,如果是 IO 密集型,增加线程后数据库堵的更慌,所以也没用,要找点问题的点然后去解决。
    luozic
        7
    luozic  
       201901-23 13:06:52 +08:00 via iPhone
    木桶原理,找到系统瓶颈
    Kraken
        8
    Kraken  
    OP
       2019-01-23 13:30:42 +08:00
    @DovaKeen #2 确实是应该有一个函数关系 只不过我想弄清楚每一步的原理,好能更准确的找出那个最优值

    @AngryPanda #3 不太懂 我一直在中小公司呆着 我上网查查

    @gabon
    @qilishasha
    @liuxey
    #4,#5,#6 是 IO 密集型 现在基础知识缺失较多 不太好找瓶颈在哪里 公司也没有大牛支持 很烦
    qiyuey
        9
    qiyuey  
       2019-01-23 13:35:40 +08:00
    压测一下
    neoblackcap
        10
    neoblackcap  
       2019-01-23 13:57:15 +08:00 via iPhone
    @Kraken 假如你什么都不清楚,那么你应该先用对应的工具进行 profiling,而不是瞎调参数。我记得 Oracle JDK 里面是有可以远程 profiling 的工具,你找找吧。或者自己分流程步骤打日志,定位热点,这样才好改
    micean
        11
    micean  
       2019-01-23 14:01:16 +08:00
    如果瓶颈是有更多的线程阻塞在等待数据库 IO,那么增加线程是有用的,直到上下文切换的代价大于此等待 IO 的代价

    但是一般从经验上来看,单实例 200 线程足矣
    jicg
        12
    jicg  
       2019-01-23 14:04:31 +08:00 via iPhone
    这就是 java 头疼之处,tomcat 的优化,很折腾人,弃坑吧,学 golang
    Kraken
        13
    Kraken  
    OP
       2019-01-23 14:11:09 +08:00
    @jicg 哈哈哈 弃坑还行
    Kraken
        14
    Kraken  
    OP
       2019-01-23 14:12:11 +08:00
    @micean 为啥啊? 如果有更多的线程阻塞在等数据库 IO 那加线程不是更多线程等待数据库了吗?
    DovaKeen
        15
    DovaKeen  
       2019-01-23 14:25:19 +08:00
    @Kraken 这个函数我觉得有很多因机器和场景而异的变量,大概是可以测出来一个特定场景的值,但是不能得到一个普适的函数的吧…
    Kraken
        16
    Kraken  
    OP
       2019-01-23 14:29:23 +08:00
    @DovaKeen #15 嗯 有道理 果然还是应该先压测什么的 掌握系统目前的各项性能指标
    lihongjie0209
        17
    lihongjie0209  
       2019-01-23 14:37:11 +08:00
    @jicg 你觉得用了 go 就不需要了解优化了?
    Kraken
        18
    Kraken  
    OP
       2019-01-23 14:40:29 +08:00
    @lihongjie0209 #17 哈哈哈 不可能的 无论什么语言都是需要优化的 就算是前端 也需要针对客户端优化 毕竟资源是有限的 技术才是硬道理啊!
    quickma
        19
    quickma  
       2019-01-23 15:03:45 +08:00
    micean
        20
    micean  
       2019-01-23 15:13:12 +08:00
    @Kraken
    我说的是假设外部条件有余的情况,只就这一个 tomcat 来说。
    比方说,高铁多增加几个检票口,排队的旅客肯定能更快地过检,也就增加了吞吐量。
    NB40B938mff85mtq
        21
    NB40B938mff85mtq  
       2019-01-23 16:18:35 +08:00
    调一下 JVM 初始化堆的大小啊。。。立竿见影
    Kraken
        22
    Kraken  
    OP
       2019-01-23 17:26:18 +08:00
    @micean #20 没太明白 如果不换 cpu 那 cpu 的核心数和线程数是固定的啊 那假如我现在线程池的数量已经大于核心线程数量了 那再提高线程池的数量不应该是增加了同时调度线程的数量 相应的 每个线程执行的时间也变长了吗? 因为有很多时间分配给其他线程了

    @Gempty #21 早就已经调过啦 现在 3 分钟一次 full gc 我觉得还行
    NB40B938mff85mtq
        23
    NB40B938mff85mtq  
       2019-01-23 17:32:17 +08:00
    @Kraken 优化下线程~~~maxThreads、SpareThreads、acceptCount
    Kraken
        24
    Kraken  
    OP
       2019-01-23 17:38:01 +08:00
    @Gempty #23 优化了 maxThreads 从默认的 200 提到了 1000 但是之后没有什么爆款活动了,服务器压力一直不大,想通过理论知识想清楚这样到底能不能提升性能。因为 cpu 是 8 核 16 线程,那理论上无论在哪个瞬间,同时执行的线程数量都只有 16 个才对吧。提高线程数量,只是同时调度的线程数量变多了,那相应的每个线程的处理时间也变得更长,这样还会增加 cpu 切换线程的压力。我个人觉得逻辑应该是这样的。

    还有一点就是不知道 fd 用不用调高上限,现在几乎一半的人回答用!另一半人回答不用!还有人说默认的 1024fd 效率是最好的,如果调高 fd 处理效率会降低。我也不知道哪些是对的。

    果然还是应该自己掌握压测软件,多调多压……
    micean
        25
    micean  
       2019-01-23 19:19:06 +08:00
    @Kraken 上下文切换带来的损失远小于一次数据库操作
    gz911122
        26
    gz911122  
       2019-01-24 10:08:53 +08:00
    @Kraken
    因为如果瓶颈在 io 的话,很多线程是在无谓的等待 io 返回,这时候增加线程数可以增加同时接客的数量。
    reliefe
        27
    reliefe  
       2019-02-22 21:29:02 +08:00
    @gz911122 +1
    提高线程数能不能提高吞吐量,得看项目本身了。对 IO 密集型的来说通常是提高的,对 CPU 密集的来说用处就不大了,因为线程数可能根本没用完。
    所以第一先观测线程使用的情况,简单的方式直接 `netstat -na | grep ESTAB | grep 8080 | wc -l`,如果线程数里现在配置的还远,就没必要动线程数。
    第二观测吞吐量,要知道现在的每秒 /每分钟能处理多少请求。然后调整线程数再观察吞吐量数据。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1033 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 18:41 PVG 02:41 LAX 10:41 JFK 13:41
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86