您目前处于:笔记
2017-07-17
|
一台Java服务器能跑多少个线程?这个问题来自一次线上报警如下图,超过了我们的配置阈值。 图:京东自研UMP监控分析 打出jstack文件,通过IBM Thread and Monitor Dump Analyzer for Java工具查看如下: 图:IBM Thread and Monitor Dump Analyzer for Java 共计1661个线程,和监控数据得出的吻合。但这个数量应该是大了,我们都知道线程多了,就会有线程切换,带来性能开销。 当时就想到一台Java服务器到底可以跑多少个线程呢?跟什么有关系?现整理如下。 每个线程都有一个线程栈空间通过-Xss设置,查了一下我们服务器的关于jvm内存的配置 -Xms4096m -Xmx4096m -XX:MaxPermSize=1024m 只有这三个,并没有-Xss 和-XX:ThreadStackSize的配置,因此是走的默认值。 图:JVM的默认栈大小 可以通过如下命令打印输出默认值的大小,命令: jinfo -flag ThreadStackSize 例如: [root@host-192-168-202-229 ~]#jinfo -flag ThreadStackSize 1807 -XX:ThreadStackSize=1024 不考虑系统限制,可以通过如下公式计算,得出最大线程数量。 线程数量 =(机器本身可用内存 - JVM分配的堆内存)/ Xss的值,比如我们的容器本身大小是8G,堆大小是4096M,-Xss默认值,可以得出最大线程数量:4096个。 根据计算公式,得出如下结论:
我们知道操作系统分配给每个进程的内存大小是有限制的,比如32位的Windows是2G。因此操作系统对一个进程下的线程数量是有限制的,不能无限的增多。经验值:3000-5000左右(我没有验证)。 刚才说的是不考虑系统限制的情况,那如果考虑系统限制呢,主要跟以下几个参数有关系:
线程是非常宝贵的资源,我们要严格控制线程的数量,像上面我们的截图情况,显然线程数量过多。这个是跟我们自己配置了fixed大小的线程池有关系。京东有自己的rpc框架jsf,里面可以针对每个服务端口设置线程大小。 转载请并标注: “本文转载自 linkedkeeper.com (文/王新栋)” ©著作权归作者所有 |