公司的压力测试环境,为了节省资源,一台虚拟机上跑了好多个java应用,jmeter加压,突然出现问题。
现象是不能开启新的ssh登录,提示 ssh_exchange_identification:
read: Connection reset by
peer,也不能控制台登录,root密码正确也不能进入。如果已经登录进去的session,如果不退出,还能正常操作。
因为是压力测试机器,所以可以随便重启,直接通过esxi控制台重置虚拟机电源后,可以登录,一切正常。
进入系统查看日志,发现日志中有多行类似如下信息:
automount[4483]: expire_proc: expire thread create for /misc failed
经过google发现两个问题可能与之相关:
1.autofs的一个bug,建议升级autofs到autofs-5.0.1-0.rc2.145之后版本,对于我们这个问题来说,不对症,因为autofs版本已经是最新的。
2.内核参数pid_max的值太小,以至于不能创建新的线程。
]# cat
/proc/sys/kernel/pid_max
32768
]# echo "1048576" >
/proc/sys/kernel/pid_max
修改大以后,故障解决,之后写入sysctl.conf中。
按照参考文档1文中说法,pid_max最大可以设置为2^22,接近400万。
读了该文,我们可以回答如下两个问题:
一台Linux主机上可以创建的最大线程数是多少?
一个用户进程最大可以创建多少个线程?
这两个问题其实是一个问题,回答是取决于下面三个内核参数中的最小值,(文章作者根据经验猜测,未经证实,本人也未去证实)
threads-max
pid-max,
nproc
其中:
threads-max影响的是所有用户的总的线程数,这个值只影响线程数(thread),不影响进程数(process)
nproc则是操作系统级别对每个用户创建的进程数的限制
在Linux下运行多线程时,每个线程的实现其实是一个轻量级的进程,对应的术语是:light weight
process(LWP)。
怎么知道一个用户创建了多少个进程呢,默认的ps是不显示全部进程的,需要‘-L'
才能看到所有的进程。
举例1:查看所有用户创建的进程数,使用命令:
ps h -Led -o user | sort | uniq -c | sort
-n
举例2:查看hfds用户创建的进程数,使用命令:
ps -o nlwp,pid,lwp,args -u hdfs | sort
-n
何时需要修改这个nproc呢
当日志出现以下情况中的一种时,需要考虑这个nproc:
1. Cannot create GC
thread. Out of system resources
2.
java.lang.OutOfMemoryError: unable to create new
native thread
如何修改:
1.需要先看linux操作系统内核版本,通过uname
-a查看内核版本,因为2.6版本的内核默认是在/etc/security/limits.d/90-nproc.conf里的配置会覆盖/etc/security/limits.conf的配置
[root@hadoop219 ~]# uname -a
Linux hadoop219 2.6.32-431.el6.x86_64 #1
SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64
GNU/Linux
2. vi
/etc/security/limits.d/90-nproc.conf
注释掉 * soft nproc 1024
3. vi
/etc/security/limits.conf
添加
* soft nproc
655350
4. 在控制台执行(修改这个不需要重启)
ulimit -u 655350
5.检查下是否生效,在控制台切到该用户下
ulimit -u
1.https://stevecao.wordpress.com/2016/12/31/processes-and-threads-in-linux/
2.https://support.hpe.com/hpsc/doc/public/display?docId=mmr_kc-0104204
3.http://blog.csdn.net/odailidong/article/details/50561257
4.http://blog.dbi-services.com/linux-how-to-monitor-the-nproc-limit-1/