这两项基本都是由于线程过多导致的,分别来看下,
一、Resource temporarily unavailable
普通用户的ulimit中对于max user processes默认是1024,可以通过ulimit -a中的max user processes来确认,但是这个值是包含线程数的,
[support@ipcpu ~]$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 63715
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
root 账号下 ulimit -u 出现的max user processes 的值默认是 # cat /proc/sys/kernel/threads-max(默认值是内存页数的1/4)的值/2,即系统总进程线程数的一半。
普通账号下 ulimit -u 出现的max user processes的值 默认是 /etc/security/limits.d/20-nproc.conf(centos6 是90-nproc.conf) 文件中的配置值,默认1024。
检查线程和进程数量
[support@ipcpu~]$ ps h -efT |grep support |wc -l
1035
解决办法
[root@ipcpu ~]# vim /etc/security/limits.d/90-nproc.conf
* soft nproc 655350
root soft nproc unlimited
二、Cannot allocate memory
和上面不一样,这个报错基本是由pid_max设置不足引起的,我的系统默认是32768,同样的这个数值也包含线程的数量
[root@ipcpu ~]# cat /proc/sys/kernel/pid_max
32768
查看用户线程和进程数量
ps h -efT |grep support |wc -l
解决办法
# vim /etc/sysctl.conf
kernel.pid_max = 65536
总结下线程数量相关的参数
内存
ulimit
/proc/sys/kernel/threads-max
/proc/sys/kernel/pid_max
/proc/sys/vm/max_map_count
systemd中的DefaultTasksMax
systemd中的limit设置
参考资料
https://www.cnblogs.com/pangguoping/p/5792075.html
https://blog.csdn.net/u013673976/article/details/51788566
https://mccxj.github.io/blog/20171230_os-thread-limit.html
http://smilejay.com/2016/06/centos-7-systemd-conf-limits/
附件
附Python多线程测试脚本,产生很多线程
import threading
import time
def haha():
while True:
print('ok')
time.sleep(60)
for x in range(2400):
print(x)
t=threading.Thread(target=haha)
t.start()
转载请注明:IPCPU-网络之路 » resource temporarily unavailable和Cannot allocate memory