转发自: http://blog.chinaunix.net/uid-20662820-id-5690021.html
1、发现问题出在alloc_pid失败,分析内核代码,这个受限于kernel.pid_max参数
2、单个线程的mmap个数限制,受限于vm.max_map_count参数。
3、还有一个参数 kernel.threads-max限制
4、内存限制
dup_task_struct-->alloc_task_struct_node/alloc_thread_info_node/arch_dup_task_struct-->kmme_cache_alloc_node(slub.c)-->slab_alloc_node-->
“CONFIG_MEMCG_KMEM” //这里也是一个坑,docker这种基于cgroup的也会影响,可能会因为分配给slub的内存不够用出现线程限制
具体函数:
alloc_pages---->__memcg_kmem_newpage_charge-->memcg_charge_kmem-->__res_counter_charge-->res_counter_charge_locked
5、虚拟内存限制
总结
/proc/sys/kernel/pid_max #操作系统线程数限制
/proc/sys/kernel/thread-max #操作系统线程数
max_user_process(ulimit -u) #系统限制某用户下最多可以运行多少进程或线程
/proc/sys/vm/max_map_count #单进程mmap的限制会影响当个进程可创建的线程数
/sys/fs/cgroup/memory/${cgroup}/memory.kmem #单个docker 内核内存的限制,可以影响task_struct等slab节点的申请,间接影响可创建的线程数