单个JVM下支撑100w线程数

标签: jvm 100w 线程 | 发表时间:2015-09-18 11:51 | 作者:can_do
出处:http://www.iteye.com
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   
进行永久修改。

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [jvm 100w 线程] 推荐:

单个JVM下支撑100w线程数

- - Linux - 操作系统 - ITeye博客
3.Memory够大,512GB. II、测试工具:【DieLikeADog.java】. 1.ps -Lf |wc -l ==>查看某个进程中的线程数量. >>>主要查看-n,-u的值. 永久修改:将vm.max_map_count=2048000配置到/etc/sysctl.conf中,然后执行sysctl -p生效,重启os后也会持久.

JVM 内部运行线程介绍

- - 并发编程网 - ifeve.com
感谢同事 [觉梦]投递此稿. 最近抽时间把JVM运行过程中产生的一些线程进行了整理,主要是围绕着我们系统jstack生成的文件为参照依据.  前段时间因为系统代码问题,造成性能瓶颈,于是就dump了一份stack出来进行分析.  stack 里面线程非常多,排查起来需要一定的经验,所以,对它们有一定了解,可以提高排查问题的效率.

关于JVM(JDK),Tomcat,Linux的最大线程数问题

- - 孟飞阳的博客
一、JVM(JDK)最大线程数. JVM最大创建线程数量由JVM堆内存大小、线程的Stack内存大小、系统最大可创建线程数(Java线程的实现是基于底层系统的线程机制来实现的,Windows下_beginthreadex,Linux下pthread_create)三个方面影响. -Xmx  最大堆内存.

JVM性能调优监控工具专题二:VisualVM基本篇之监控JVM内存,CPU,线程

- - ITeye博客
        上一个专题中讲述了JVM中自带的各种性能测试的小工具:包括jps,jstatck,jmap,jhat,jsats,hprof.         这样会造成不必要的麻烦,难道就没有一个tool可以 包括如上所有的功能. 答案是有的,自从 JDK 6 Update 7以后,提供了一全新的性能检测工具:VisualVM,VisualVM对运行中的Java应用提供了可视化的信息展示, 它是很多工具的整合包,整合了JConsole,jstat,jinfo,jstack以及jmap.

帮你大致定位到现场导致LOAD飙升的JVM线程

- - Java - 编程语言 - ITeye博客
帮你大致定位到现场导致LOAD飙升的JVM线程. 大家都有过遇到线上程序LOAD突然狂飙的场景,要排查到为何狂飙,我们当务之急就是要找到导致CPU飙升的原因. 如果是进程级的应用,如Nginx、Apache等都还比较容易排查,但如果是JVM中的某个线程导致的,估计有人就要开始抓瞎了. 很多人都或多或少的知道有这么一个脚本,能帮你大致定位到现场导致LOAD飙升的JVM线程,脚本大概如下.

JVM研究

- - 开源软件 - ITeye博客
每天接客户的电话都是战战兢兢的,生怕再出什么幺蛾子了. 我想Java做的久一点的都有这样的经历,那这些问题的最终根结是在哪呢. JVM全称是Java Virtual Machine,Java虚拟机,也就是在计算机上再虚拟一个计算机,这和我们使用 VMWare不一样,那个虚拟的东西你是可以看到的,这个JVM你是看不到的,它存在内存中.

jvm调优

- - 互联网 - ITeye博客
printf "%x\n" 21742  找到耗时最长的进程. jstack pid | grep 54ee  定位某个类的方法. jstack 10535|grep -A 10 2a1d (最后十行). jmap 查询pid 内存线程. 附:TOP命令中需要关注的值:. (1)load average:此值反映了任务队列的平均长度;如果此值超过了CPU数量,则表示当前CPU数量不足以处理任务,负载过高.

学习JVM的References

- LightingMan - 淘宝JAVA中间件团队博客
本blog中列举了我学习JVM的references,会不断的更新,为了避免版权问题,就不在blog上提供references的下载了,感兴趣的同学可自行下载或购买,:). |— [ Hotspot GC论文 ]. |— [ 其他JVM GC ]. |— Linux内核源代码情景分析. |— Linux 内核中断内幕.

深入理解JVM

- 小伟 - ITeye论坛最新讨论
1   Java技术与Java虚拟机. 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API). 图1   Java四个方面的关系. 运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件).

jvm垃圾回收

- Cano - 淘宝共享数据平台 tbdata.org
在jvm中堆空间划分为三个代:年轻代(Young Generation)、年老代(Old Generation)和永久代(Permanent Generation). 年轻代和年老代是存储动态产生的对象. 永久带主要是存储的是java的类信息,包括解析得到的方法、属性、字段等等. 我们这里讨论的垃圾回收主要是针对年轻代和年老代.