前言
感谢:以下两个链接,让我解决了这个难点
- https://www.bilibili.com/video/BV1Vy4y177YB?p=9
- https://www.jianshu.com/p/bee721de277a
一、问题描述
按照报错信息:大致意思是没办法创建新的原生线程
二、问题跟踪
主要从linux的相关线程数、进程数等配置方面进行分析
- cat /proc/sys/kernel/threads-max #系统允许的最大线程数
- echo “65535” > /proc/sys/kernel/threads-max #修改最大线程数
- ulimit -u #查看用户最大进程数
- cat /proc/sys/kernel/pid_max #查看系统允许的最大进程数
- 一个进程有多个线程,所以按逻辑上面的问题,跟进程数无关
- 然后使用上面的逻辑,将最大线程数设置小一点,确实复现了那个问题
- 但是生产环境threads-max,20+万,按理来说不可能会超
- 生产环境user max processes 才1024
- 但是我将本机user max processes 也改成1024,发现也没问题,初步排除这个问题
总结:threads-max可以引起那个报错,但是生产这个值太大,按逻辑,不可能是这个参数引起
三、进一步跟踪
通过上面的两个链接,得出以下几个重点信息:
- user max processes 用户进程,主要使用来限制非root用户的
- 并且当如果是非root用户的时候,进程和线程的概念很模糊,也就是说我启动2000线程,就相当于2000进程,那如果我设置1024,在非root用户下启动,有可能造成上面的问题
四、具体实践
- 先将user max processes 改成800
大致的位置有这几个:/etc/security/limits.conf、/etc/security/limits.d/90-nproc.conf、/etc/security/limits.d/20-nproc.conf(我这边测试了,是在/etc/security/limits.conf,如果设置无效,其他2个位置也设置看看)
描述:
soft xxx : 代表警告的设定,可以超过这个设定值,但是超过后会有警告。
hard xxx : 代表严格的设定,不允许超过这个设定的值。
如:soft 设为1024,hard设为2048 ,则当你使用数在1~1024之间时可以随便使用,1024~2048时会出现警告信息,大于2048时,就会报错。
nproc : 是操作系统级别对每个用户创建的进程数的限制
nofile : 是每个进程可以打开的文件数的限制
配置如下(*代表所有用户,但是不包含root,root需要的话,就要单独配置):
* hard nproc 800
* soft nproc 800
pstree -p pid| wc -l
- 然后通过jmeter进行调用
- 调用到一半,直接报错,并且去查看进程数,直接不能使用相关命令了
- 然后按照同样的方式,使用root启动服务,user max processes不生效
总结
- 如果服务启动的时候,是使用一般用户,要将user max processes 设置大点,比如65535
- 在一般用户的情况下: user max processes =该用户下的进程数+该用户下的线程数
|