单个JVM下支撑100w线程数

I、环境要求:
1.64bit Linux
2.64bit JDK
3.Memory够大,512GB
4.cpu:64 processors

II、测试工具:【DieLikeADog.java
java -server -Xmx6G -Xms6G -Xmn600M -Xss228K -XX:PermSize=50M -XX:MaxPermSize=50M -XX:+DisableExplicitGC DieLikeADog

III、检查配置:
1.ps -Lf <pid> |wc -l ==>查看某个进程中的线程数量
2.ulimit -a==>
>>>主要查看-n,-u的值
3.cat /proc/sys/vm/max_map_count
永久修改:将vm.max_map_count=2048000配置到/etc/sysctl.conf中,然后执行sysctl -p生效,重启os后也会持久。
也可以:【sysctl -w vm.max_map_count=2048000】

注意:在其他资源可用的前提下,单个JVM能开启的最大线程数是/proc/sys/vm/max_map_count的设置数的一半。

小结:如果要达到单个JVM开启100w以上的线程数,需要配置vm.max_map_count=2048000或者以上。
因为默认vm.max_map_count=65530,因此缺省配置下,单个jvm能开启的最大线程数为其一半,即3w左右,大概32k的量

实际中,可以通过命令【cat /proc/<pid>/maps |wc -l】来监控,当前进程使用到的vm映射数量。
4.最大用户进程数:需要在两个配置文件/etc/security/limits.conf和/etc/security/limits.d/90-nproc.conf同时修改

实际上,仅对nproc参数修改90-nproc.conf即可。

//////////begin////////
max user processes              (-u) 1024
/etc/security/limits.conf
/etc/security/limits.d/90-nproc.conf
*       soft    nproc           10240
*       hard    nproc           10240
//////////end//////////
5.文件描述符:通过【ulimit -a】查看
  //////////begin//////  
在/etc/security/limits.conf中添加如下配置:

*    soft nofile 1048576
     *    hard nofile 1048576
  //////////end////////
  当soft和hard相同时,也可以用一条指令,如下:
  ////////begin/////
  *  - nofile 1048576
  ////////end///////
6.调整网络参数:可以通过【grep ipv4 /etc/sysctl.conf】查看
在/etc/sysctl.conf中添加如下配置:
//////////begin/////////
fs.file-max = 1048576
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_mem = 786432 2097152 3145728
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
//////////end////////
IV、【总结】如果只考虑单个jvm在本机能开的最大线程数,考虑1234步即可,如果考虑JVM能支撑的最大tcp连接数,如MQ中,
        则也考虑thread,fd和tcp等,所以需要涉及123456步。
V、Tip:
>>>检查命令
# cat /proc/<pid>/limits
Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            209715200            209715200            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             204800               204800               processes
Max open files            1048576              1048576              files     
Max locked memory         10485760             10485760             bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       4133863              4133863              signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us

>>>注意:Linux下每个进程的运行时限制结果都可以在目录/proc/<pid>下查看。

>>>参考:http://www.redhat.com/magazine/001nov04/features/vm/

VI、【归纳】
影响Java线程数量的因素===>
Java虚拟机本身:-Xms,-Xmx,-Xss;
系统限制:
/proc/sys/kernel/pid_max, ==>81920==>对应到/etc/sysctl.conf为==>kernel.pid_max=81920
/proc/sys/kernel/thread-max,==>对应到/etc/sysctl.conf为==>kernel.thread-max=8192000
max_user_process(ulimit -u)
/proc/sys/vm/max_map_count ==>对应到/etc/sysctl.conf为vm.max_map_mount=2048000

需要在/etc/sysctl.conf添加
==>kernel.pid_max=819200    
进行永久修改。

时间: 2024-10-08 14:06:02

单个JVM下支撑100w线程数的相关文章

Jvm支持的最大线程数

摘自 http://blog.csdn.net/xyls12345/article/details/26482387 JVM最大线程数 (2012-07-04 23:20:15) 转载▼ 标签: jvm 最大线程数 it 分类: java分布式总结 摘自:http://sesame.iteye.com/blog/622670 工作中碰到过这个问题好几次了,觉得有必要总结一下,所以有了这篇文章,这篇文章分为三个部分:认识问题.分析问题.解决问题. 一.认识问题: 首先我们通过下面这个 测试程序 来

JVM可支持的最大线程数(转)

摘自:http://sesame.iteye.com/blog/622670 工作中碰到过这个问题好几次了,觉得有必要总结一下,所以有了这篇文章,这篇文章分为三个部分:认识问题.分析问题.解决问题. 一.认识问题: 首先我们通过下面这个 测试程序 来认识这个问题:运行的环境 (有必要说明一下,不同环境会有不同的结果):32位 Windows XP,Sun JDK 1.6.0_18, eclipse 3.4,测试程序: import java.util.concurrent.CountDownLa

单个进程中最大线程数探索

[转载自http://blog.csdn.net/yohoph/article/details/48372805] windows 操作系统中允许的最大线程数. =========================================================================== 默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个

聊下并发和Tomcat线程数(错误更正)

本文前半部分结论存在严重错误,请看最后2015-1-20更新部分. 最近一直在解决线上一个问题,表现是: Tomcat每到凌晨会有一个高峰,峰值的并发达到了3000以上,最后的结果是Tomcat线程池满了,日志看很多请求超过了1s. 服务器性能很好,Tomcat版本是7.0.54,配置如下: <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="3000&q

180724-统计JVM进程中线程数两种方式小记

I. 统计进程中的线程数 相关系列博文推荐: 180711-JVM定位分析CPU性能消耗 180704-JDK常用监控参数 jvm调优的工具介绍 1. proc查询 /proc 目录以可读文本文件形式输出,提供现有进程和系统硬件相关的信息如 CPU.中断.内存.磁盘等等 查看状态命令 cat /proc/进程号/status 其中对应的线程数为 Threads: 367 这一行 另外一种方式就是直接查看 /proc/进程号/task 下的目录,每个线程对应一个目录,目录名为对应的线程ID ls

思考:网络性能优化:网络 -- cpu -- 线程数 -- 单个任务耗时 --- qps --- 并发

思考:网络性能优化:网络 -- cpu -- 线程数 -- 单个任务耗时 --- qps --- 并发如果没有理清楚上述概念和它们之间的关系,那么优化会毫无章法:线程越多,利用上的线程越多,cpu的idle会约低,只到cpu低得不能再低,一般情况下,可以可劲用(idle为10%你遇到过吗?),但是要注意你的下游能否能扛得住你转嫁给他们的并发压力呢:单个任务处理越快,qps和并发会越高:两个线程的并发一定是一个线程的两倍,10个线程的并发一定是2个线程的5倍:qps是一秒处理的任务数,这个换算逻辑

Linux下查看操作系统信息、内存情况及cpu信息:cpu个数、核心数、线程数

文章转载:http://blog.snsgou.com/post-793.html 1.查看物理CPU的个数 [[email protected] ~]# cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l1 2.查看逻辑CPU的个数 [[email protected] ~]# cat /proc/cpuinfo |grep "processor"|wc -l4 3.查看CPU是几核(即,核心数) [[em

C++编写代码查看CPU个数,单个CPU核数,单个CPU线程数

CPU个数:这里指物理上的CPU个数,即在dos界面中,输入systeminfo时,显示信息中的处理器个数 CPU核数:这里指CPU核心数,即在dos界面中,输入wmic后,在键入CPU get * 时所显示的NumberOfCores CPU线程数:这里指在dos界面中,输入wmic后,在键入CPU get * 时所显示的NumberOfLogicalProcessors 通常情况下,我们的CPU说的是几核,如双核,四核等,指的就是核心,而现在有种技术是超线程技术,此技术即为一个核心,两个线程

linux下查看线程数的几种方法

1. cat /proc/${pid}/status 2.pstree -p ${pid} 3.top -p ${pid} 再按H   或者直接输入 top -bH -d 3 -p  ${pid} top -H手册中说:-H : Threads toggle加上这个选项启动top,top一行显示一个线程.否则,它一行显示一个进程. 4.ps xH手册中说:H Show threads as if they were processes这样可以查看所有存在的线程. 5.ps -mp <PID>手