一台Java服务器跑多少个线程,性能最佳呢?

点击蓝色“小哈学Java”关注我哟

加个“星标”,第一时间获取小哈推送的文章哦!


640?wx_fmt=jpeg

本文系转载,作者:京东/王新栋

一台Java服务器能跑多少个线程?这个问题来自一次线上报警如下图,超过了我们的配置阈值。

640?wx_fmt=png

图:京东自研UMP监控分析

打出jstack文件,通过IBM Thread and Monitor Dump Analyzer for Java工具查看如下:

640?wx_fmt=png

图:IBM Thread and Monitor Dump Analyzer for Java

共计1661个线程,和监控数据得出的吻合。但这个数量应该是大了,我们都知道线程多了,就会有线程切换,带来性能开销。

当时就想到一台Java服务器到底可以跑多少个线程呢?跟什么有关系?现整理如下。

每个线程都有一个线程栈空间通过-Xss设置,查了一下我们服务器的关于jvm内存的配置

1
2
3
-Xms4096m
-Xmx4096m
-XX:MaxPermSize=1024m

只有这三个,并没有-Xss 和-XX:ThreadStackSize的配置,因此是走的默认值。

640?wx_fmt=png

图:JVM的默认栈大小

可以通过如下命令打印输出默认值的大小,命令:

1
jinfo -flag ThreadStackSize

例如:

1
2
[root@host-192-168-202-229 ~] #jinfo -flag ThreadStackSize 1807
-XX:ThreadStackSize=1024

不考虑系统限制,可以通过如下公式计算,得出最大线程数量。

线程数量 =(机器本身可用内存 - JVM分配的堆内存)/ Xss的值,比如我们的容器本身大小是8G,堆大小是4096M,-Xss默认值,可以得出最大线程数量:4096个。

根据计算公式,得出如下结论:

  • 结论1:jvm堆越大,系统创建的线程数量越小。

  • 结论2:当-Xss的值越小,可生成线程数量越多。

我们知道操作系统分配给每个进程的内存大小是有限制的,比如32位的Windows是2G。因此操作系统对一个进程下的线程数量是有限制的,不能无限的增多。经验值:3000-5000左右(我没有验证)。

刚才说的是不考虑系统限制的情况,那如果考虑系统限制呢,主要跟以下几个参数有关系:

  • /proc/sys/kernel/pid_max 增大,线程数量增大,pid_max有最高值,超过之后不再改变,而且32,64位也不一样

  • /proc/sys/kernel/thread-max 系统可以生成最大线程数量

  • max_user_process(ulimit -u)centos系统上才有,没有具体研究

  • /proc/sys/vm/max_map_count 增大,数量增多

线程是非常宝贵的资源,我们要严格控制线程的数量,像上面我们的截图情况,显然线程数量过多。这个是跟我们自己配置了fixed大小的线程池有关系。京东有自己的rpc框架jsf,里面可以针对每个服务端口设置线程大小。

640?

更多推荐内容

↓↓↓

干货 | 关于 Mybatis 缓存,面试官都未必知道的这么详细

黑科技!集成 IM 即时通讯聊天室能这么简单?

惊了!7 行代码优雅地实现 Excel 文件导出功能?

技术经理:求求你,别再乱改数据库连接池的大小了!

如何通过 IntelliJ IDEA 来提升 Java8 Stream 的编码效率

如果你喜欢本文

请长按二维码,关注小哈学Java

640?wx_fmt=jpeg

转发朋友圈,是对我最大的支持。

点个“在看”, 小哈就写的更得劲了

↓↓↓↓

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值