我所知系统将服务之间的依赖关系存储在单元文件中。我需要知道 systemd 在启动时的行为:
它是否从特定路径加载单元文件并在每次启动时重新计算依赖项?
或者它将这个依赖关系图存储在某个文件中并在启动时加载该文件?
在(2)情况下,我认为可以通过某些命令重新计算依赖关系图,例如在 sysctl add 上。
正如我从消息来源看到的那样,它是(1)。但似乎这对性能有不好的影响。为什么(2)没有实施?我错了吗?谢谢。
答案1
systemd 中的依赖关系图仅保存在内存中。加载单元或其属性没有(二进制)磁盘缓存。
但似乎这对性能有不好的影响。
systemctl daemon-reload
每次发出或调用等效项时,都会完全重新读取单元文件,并且完全重新计算依赖关系图总线方式( org.freedesktop.systemd1.Reload()
) 是同步的。正如您从该命令的执行时间中看到的那样,这种重新计算不会以任何方式影响性能。
答案2
它从两个特定路径加载所有单元文件(通常/usr/lib/systemd/系统和/etc/systemd/系统)。
在 systemd 中计算依赖关系非常快。它定义了一个主要目标,例如 multi-user.target,它在其他目标(例如 basic.target)之后运行,但同时需要一些实际上是 multi-user.target.wants 目录中的符号链接的单元。
弄清楚单元的执行顺序应该只需要几毫秒,因此不需要为此拥有某种缓存。