systemd可以自动重启/停止依赖服务吗?

Jac*_*icz 2 linux multithreading real-time system-dependent systemd

出于性能原因,我需要运行应用程序的多个实例,固定到CPU,监听不同的端口.HAProxy TCP负载均衡器位于它们前面以分配流量.

这样做是为了防止任何线程上下文切换并强制执行无共享设计(因此在应用程序中不需要任何类型的锁,假设它是单线程的).

这意味着在具有64个CPU的服务器上,我可能将HAProxy固定到CPU 0,然后将我的应用程序的63个实例分别固定到单独的CPU(1-63).

显然,在启动,重启,关闭等方面进行管理非常复杂.

我想知道是否有任何方法可以使用systemd为我处理这种复杂性.

我知道,如果我将HAProxy定义为一个单元然后声明它需要与之交谈的其他应用程序,它可以解决启动问题,例如

Require=app1,app2,.....,app63
Run Code Online (Sandbox Code Playgroud)

我可以

 systemctl start myhaproxy
Run Code Online (Sandbox Code Playgroud)

它首先会启动它需要的63个实例(假设它们在应用程序安装期间被定义为一个单独的系统单元).

但是,我想知道是否还有我可以让它也适用于重启和关机.

所以,如果我这样做:

systemctl stop myhaproxy
Run Code Online (Sandbox Code Playgroud)

我希望它自动关闭它所谈到的应用程序的所有63个实例.

如果我这样做

systemctl restart myhaproxy
Run Code Online (Sandbox Code Playgroud)

然后我希望它首先重新启动Require中列出的所有服务,然后再重新启动它自己.

那可能吗?或者这超出了systemd可以提供的范围?

Mar*_*555 5

我建议你创建一个目标(app-all.target例如),你的所有应用程序单元都将WantedBy=app-all.target依赖它.这将确保如果您启动目标,它将启动所有应用程序单元.但是,这不适用于停止和重新启动.为此,您需要PartOf=app-all.target为每个应用程序单元添加依赖项.

此外,我建议您为您的应用程序创建一个模板单元,然后创建63个实例 - 它将使管理更容易(只有1个配置文件,其中包含63个符号链接).这是一个关于模板和systemd 的教程.

从man systemd.unit(缩短):

WantedBy =

当systemctl enable安装此单元时,将在每个列出的单元的.wants /或.requires /目录中创建符号链接.主要结果是当列出的单元启动时将启动当前单元.

PartOf =

配置类似于Requires =的依赖项,但仅限于停止和重新启动单元.当systemd停止或重新启动此处列出的单元时,操作将传播到此单元.请注意,这是单向依赖关系 - 对此单位的更改不会影响列出的单位.