问题
今天早上线上环境报too many open files, 应该是文件打开数限制小了,同事截图是65536,我登上机器去看的时候却是1024,查看/etc/security/limits.conf文件没有配置该用户的限制数。
\
奇了怪了, 马上告诉同事,同事说没问题啊,是65535,去他工位上看,发现确实是65536,但是操作是从root用户切换到应用用户看的,而我是直接用应用用户登录的。 所以判断出应该是用户切换查看的ulimit有问题,让同事退出用应用用户登录查看确实是1024。
复现
- root用户登录测试机器,依次执行
ulimit -n,cat /etc/security/limits.conf
可以看到只配置了tidb用户的文件打开数限制
- 依次执行
su - test1ulimit -n,su - tidb ulimit -n查看发现tidb的配置是生效的
- root用户执行
ulimit -n 10240再依次查看root,test1,tidb用户的值
可以看到test1用户查看到的ulimit值和root用户修改的结果一致,而tidb则不受影响。
- /etc/security/limits.conf中添加test1用户的限制
- 再执行步骤3
可以看到test1用户查看值不再收到影响
- 在root、test1、test2用户均未配置的情况下来回横跳,可以看到会收到其他用户修改的影响,并且应用用户只能修改为比root用户小的值
- 结论:没有在/etc/security/limits.conf中添加用户打开文件数限制的情况下,用户看到的ulimit -n值会取当前会话的值,但实际是默认值1024。
结论
没有在/etc/security/limits.conf中添加用户打开文件数限制的情况下,切换用户看到的ulimit -n值是取第一个用户读取到的值,某个用户修改值后其他用户看到的也是该用户最近修改的值,但实际是默认值1024。所以最好在/etc/security/limits.conf配置各用户的限制数。
原因:
不清楚,猜测应该是用户第一次登录时会去取 /etc/security/limits.conf中的值,并保存到当前会话中,如果没有取到并且当前会话没有缓存值则使用默认值,否则使用当前会话的值。
\