Linux 中,系统参数是由 sysctl,或用/proc/sys/
虚拟文件系统来控制的,但在有 systemd 的情况下,又不完全是这样。
有时 systemd 会覆盖 sysctl 的设定,比如 ulimit。
网上搜 ulimit,大部分资料对 systemd 只字不提,只讲从 kernel,PAM 和 SHELL 这 3 个地方可以控制;
但如果用了 systemd,对它管理的服务单元,必须创建xxxx.servic.d/
目录,在其中保存.conf
,内容包括:
[Service]
LimitNOFILE=MMMMMM:NNNNNN
才行。
所以我的问题是:有没有啥资料可以把这 2 个冤家的关系讲清楚的?
首先,ulimit 不是 sysctl
你现在的认识是一种很经典的错误
pam_limits.so 和 shell 的 ulimit 命令,控制的是 shell 的 rlimit
而系统服务 *不应该* 在 shell 里启动,而应该是独立做好准备工作的
systemd 确实强,如果不摸索清楚就用,都知不到它到底是怎么控制的,容易掉坑,这也是部分人批评 systemd 过于复杂的原因,违背 Linux 的“ stupid ”原则。
systemd 控制的是 cgroup,不是整个系统的 ulimit
/etc/systemd/system.conf
/etc/systemd/user.conf
这是全局
你也可以直接在各个服务的 unit files 中添加参数
sysctl 是控制内核参数的,和下面的都没有关系。
systemd 是用来管理系统服务的(还有硬盘挂载、定时任务、会话管理等其他功能)
pam 是用来控制用户会话的,包括用户的资源限制,也就是这里的 ulimit 的,还有变量控制、密码认证等
systemd 并不会用到 pam 的 env、limits 等模块,所以平时用来控制资源的 /etc/security/limits.conf,控制环境变量的 /etc/environment 等文件,对于 systemd 的服务并不起作用
不过 systemd 会通过 pam_systemd.so 模块将 PAM 中的会话注册到 user.slice 中并进行相应的操作,
还有就是将会话中的进程放置到当前会话的 CGroup 控制组中,实现会话资源的统一管理