单个JVM下支撑100w线程数

来源:互联网 发布:浙大基础医学院 知乎 编辑:程序博客网 时间:2024/05/29 08:02

转载自:
http://blog.csdn.net/xiaolang85/article/details/74322277
http://blog.csdn.net/tiger0709/article/details/74296720
http://jzhihui.iteye.com/blog/1271122

I、创建的线程数的计算公式:

(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads

MaxProcessMemory 指的是一个进程的最大内存
JVMMemory JVM内存
ReservedOsMemory 保留的操作系统内存
ThreadStackSize 线程栈的大小

II、系统限制:

1.系统可以生成的最大线程数量 ==> /proc/sys/kernel/threads-max
2.系统可以生成的最大pid数量 ==> /proc/sys/kernel/pid_max
3.系统允许单用户创建的最大进程数量 ==> ulimit -amax user processes 这个参数的值
4.一个进程在VMAs(虚拟内存区域)拥有最大数量 ==>/proc/sys/vm/max_map_count,VMA是一个连续的虚拟地址空间,当进程创建一个内存映像文件时VMA的地址空间就会增加,当达到max_map_count了就是返回out of memory errors
5.一个进程可打开的最大文件数 ==> ulimit -aopen files 这个参数

III、参数调整

1.threads-max:直接修改 /proc/sys/kernel/threads-max,例如echo 10000 > /proc/sys/kernel/threads-max
2.pid_max:同上,直接修改 /proc/sys/kernel/pid_max
3.max user processes:
最大用户进程数需要在两个配置文件/etc/security/limits.conf/etc/security/limits.d/90-nproc.conf同时修改。
实际上,仅对nproc参数修改90-nproc.conf即可。

max user processes              (-u) 1024/etc/security/limits.conf/etc/security/limits.d/90-nproc.conf*       soft    nproc           10240*       hard    nproc           10240

4.max_map_count:

永久修改:将vm.max_map_count=2048000配置到/etc/sysctl.conf中,然后执行sysctl -p生效,重启os后也会持久。也可以:sysctl -w vm.max_map_count=2048000。也可以直接修改/proc/sys/vm/max_map_count

注意:在其他资源可用的前提下,单个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映射数量。

5.文件描述符:通过【ulimit -a】查看。
/etc/security/limits.conf中添加如下配置:

* soft nofile 1048576* hard nofile 1048576

当soft和hard相同时,也可以用一条指令,如下:

* - nofile 1048576

III、Tip

检查命令: cat /proc/<pid>/limits

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

查看进程的线程数:pstree -p pid| wc -l或则ps -Lf pid | wc -l

IV、归纳

影响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 进行永久修改。


如果考虑JVM能支撑的最大tcp连接数,如MQ中,则也考虑thread,fd和tcp等。需要调整网络参数:可以通过grep ipv4 /etc/sysctl.conf查看。
/etc/sysctl.conf中添加如下配置:

fs.file-max = 1048576net.ipv4.ip_local_port_range = 1024 65535net.ipv4.tcp_mem = 786432 2097152 3145728net.ipv4.tcp_rmem = 4096 4096 16777216net.ipv4.tcp_wmem = 4096 4096 16777216net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1
原创粉丝点击