平台人生
作者平台人生·2016-12-13 09:12
软件开发工程师·平台人生

关于nproc设置的小陷阱

字数 1696阅读 4555评论 0赞 1

作者:张青珊
文章来自微信公众号平台人生


环境:
RedHat 6.3
test1用户$HOME/.bash_profile中配置ulimit -u 10240
/etc/security/limits.conf中没有test1用户相关nproc配置
/etc/security/limits.d/90-nproc.conf 中默认配置为*soft nproc 1024

问题:
test1用户下应用进程运行正常,通过ps -u test1-L | wc -l统计用户线程数为1671
用户test1无法通过ssh正常登陆
通过root用户su到test1用户时报错如下
su: cannot set user id: Resource temporarily unavailable

决议:
1)增加/etc/security/limits.d/90-nproc.conf中默认用户的nproc限制,修改为*soft nproc 10240
2)或在/etc/security/limits.conf中增加test1用户的nproc设置,即增加test1 soft nproc 10240

根源:
用户登陆失败是因为用户的执行线程数超过了/etc/security/limits.conf中配置的nproc资源限制,而在RHEL6中,如果/etc/security/limits.conf中没有用户的nproc设置则使用/etc/security/limits.d/90-nproc.conf中的默认值。

分析:
在此案例中/etc/security/limits.d/90-nproc.conf中配置默认值为1024,而用户test1的$HOME/.bash_profile中配置ulimit-u 10240,在用户test1的执行线程数没有超过1024时,用户可以正常登陆,并且在登录后执行bash相关变量配置,即ulimit-u 10240。这样,test1用户的应用进程可以正常运行,且在/proc/$PID/limits中也可以看到用户进程加载的Max processes为10240,通过ps -u test1 -L | wc -l可以发现,用户的执行线程数达1671,已超过1024的默认限制。
而在上述场景下,当再有用户登陆(或su切换)时,经过PAM模块后会加载系统默认的ulimit限制,并读取/etc/security/limits.conf和/etc/security/limits.d下的用户ulimit配置,此时会根据默认配置初始化test1的nproc为1024,而执行到切换用户有效uid时,就会因nproc资源受限而报错,导致切换用户(ssh登陆)失败。
29723 14:24:55.563998 setgid(510) = 0 <0.000010>
29723 14:24:55.564039 setuid(501) = -1 EAGAIN (Resource temporarily unavailable) <0.000011>

另外在RHEL6中,对于nproc参数的设置,当/etc/security/limits.d/90-nproc.conf与/etc/security/limits.conf文件中配置内容冲突时,将以/etc/security/limits.d/90-nproc.conf文件的配置优先生效。如:/etc/security/limits.d/90-nproc.conf中配置 soft nproc 1024 ,而在/etc/security/limits.conf中配置 soft nproc 10240,那么实际生效的用户nproc设置为1024,而不是10240。但若/etc/security/limits.d/90-nproc.conf中配置*soft nproc 1024,而/etc/security/limits.conf中配置test1 soft nproc 10240 ,这种情况下test1用户的nproc为10240

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

本文隶属于专栏

作者其他文章

X社区推广