做项目时发现一个问题,通过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的资源限制,如何配置呢?
有两种方法: