Linux最大线程数限制及当前线程数查询
1、总结系统限制有4个因素:
cat /proc/sys/kernel/pid_max #查系统支持的最大线程数,一般会很大,相当于理论值
sysctl -w kernel.pid_max=655350 #修改pid最大值
echo 100000 > /proc/sys/kernel/pid_max #修改pid最大值,这两种方式都可以
cat /proc/sys/kernel/threads-max 默认值
echo 100000 > /proc/sys/kernel/threads-max
max_user_process(ulimit -u) #系统限制某用户下最多可以运行多少进程或线程
cat /proc/sys/vm/max_map_count #该值除以2即为最大线程数,
echo 131072 > /proc/sys/vm/max_map_count
硬件内存大小
2、Java虚拟机本身限制:
-Xms #intial java heap size
-Xmx #maximum java heap size
-Xss #the stack size for each thread
3、查询当前某程序的线程或进程数
pstree -p ps -e | grep java | awk '{print $1}'
| wc -l
或
pstree -p 3660 | wc -l
4、查询当前整个系统已用的线程或进程数
pstree -p | wc -l
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
手册中说:m Show threads after processes
这样可以查看一个进程起的线程数。
问题:
too many open files
too many open files(打开的文件过多)是Linux系统中常见的错误,从字面意思上看就是说程序打开的文件数过多,不过这里的files不单是文件的意思,也包括打开的通讯链接(比如socket),正在监听的端口等等,所以有时候也可以叫做句柄(handle),这个错误通常也可以叫做句柄数超出系统限制。
命令ulimit -a
查看 open files数量
使用命令lsof -p 进程id可以查看单个进程所有打开的文件详情,使用命令lsof -p 进程id | wc -l可以统计进程打开了多少文件:
以裸启动的tomcat为例,可以看到它目前打开了108个文件数,如果文件数过多使用lsof -p 进程id命令无法完全查看的话,可以使用lsof -p 进程id > openfiles.log将执行结果内容输出到日志文件中查看。
解决方法
ulimit -n 2048
这样就可以把当前用户的最大允许打开文件数量设置为2048了,但这种设置方法在重启后会还原为默认值。
修改系统配置文件
vim /etc/security/limits.conf
#在最后加入
- soft nofile 4096
- hard nofile 4096