Linux-最大线程数和句柄数
最近有用户反馈登录CentOS 7系统后,执行任意命令,报错
bash: fork:retry: No child processes
bash: fork: Resource temporarily unavailable
看到这个怀疑是系统ulimit 限制导致的。
于是查看 /etc/security/limits.conf 和 /etc/security/limits.d/20-nproc.conf
#* soft core 0
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#@student - maxlogins 4
* soft nofile 327680
* hard nofile 327680
# End of file
在CentOS 7中,ulimit
的nproc
参数限制的是用户可创建的进程和线程的总数。这是因为在Linux内核中,线程是通过轻量级进程(LWP)实现的,每个线程会占用一个进程号(PID),因此会被计入nproc
的限制范围
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 4096
root soft nproc unlimited
发现系统默认除了root 用户默认最多的进程+线程总数最大是4096,所以是不是用户启动了过多进程或线程呢。
于是通过 top 以及 top -H 查看系统进程数 300+ 和线程数 4100+,发现top -H 发现用户启动了过多的线程,由此定位到了原因。
补充:排查用户占用的线程数可以通过如下命令获取
1. ps
#ps -U <username> -L | wc -l
2. top
#top -H