最新消息:

resource temporarily unavailable和Cannot allocate memory

IT技术 ipcpu 4795浏览

这两项基本都是由于线程过多导致的,分别来看下,

一、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