做项目时发现一个问题,通过ulimit -n查看系统限制的单个进程最大句柄数是65535,但是在自己的程序中发现远远达不到这个限制就已经报错了:too many open files。到底是因为一瞬间程序本身确实用掉了这么大的句柄,还是有其他什么原因呢?
解决问题前,先学习了一个查看指定进程资源限制的命令:cat /proc/<pid>/limits
可以发现,系统层面的控制对我的进程来说并不生效。
在我的环境中,是通过 /etc/security/limits.conf中添加了以下两行:
为什么不生效呢? 仔细看limits.conf这个文件的开头:
发现了吧?limits.conf这里的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。而我的程序正好封装成service了!!
对于systemd service的资源限制,如何配置呢?
有两种方法:
1、单个service的配置。比如我在自己封装的.service文件中添加了一行:
添加后重新加载就行了 (systemctl daemon-reload)
2、全局的配置(这个没有尝试过)
修改/etc/systemd/system.conf或者/etc/systemd/user.conf。这两个文件中有DefaultLimitNOFILE这个配置项。
system.conf 是系统实例使用的,user.conf用户实例使用的。一般的sevice,使用system.conf中的配置即可。修改后需要重启系统。