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

3
出于性能考虑,我需要运行多个应用程序实例,将它们固定到CPU上,并监听不同的端口。一个HAProxy TCP负载均衡器位于它们的前面,以分发流量。
这样做是为了防止任何线程上下文切换,并强制执行共享无内容设计(因此在应用程序内部不需要任何锁,假设它是单线程的)。
这意味着在具有64个CPU的服务器上,我可以将HAProxy固定到CPU 0,然后将每个应用程序实例固定到单独的CPU(1-63)。
显然,从启动、重启、关闭等方面来管理这些都非常复杂。
我想知道是否有任何办法可以使用systemd为我处理这种复杂性。
我知道如果将HAProxy定义为一个单元,并声明它需要与之通信的其他应用程序,它就可以解决启动问题,例如:
Require=app1,app2,.....,app63

我可以做到

 systemctl start myhaproxy

如果每个实例都在应用安装期间定义为单独的systemd单元,那么它将首先启动所需的63个实例。

然而,我想知道是否有任何方式可以让它在重启和关机时也起作用。

因此,如果我执行:

systemctl stop myhaproxy

我希望它能自动关闭与其通信的所有63个应用程序实例。
如果我这样做
systemctl restart myhaproxy

我希望它在最后重新启动自己之前,能够先重新启动Require中列出的所有服务。

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


“这样做是为了防止任何线程上下文切换。” 如果您在具有64个CPU的机器上运行64个实例,那么操作系统的其余部分会在哪里运行呢?那就会发生线程上下文切换!而且,如果应用实例不依赖于haproxy,为什么要在haproxy停止时停止它们呢?也许您想定义一些伪目标来代替。 - undefined
1个回答

7
我建议你创建一个"目标"(例如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停止或重新启动这里所列出的单元时,操作将传播到该单元。请注意,这是一种单向依赖关系——对该单元的更改不会影响所列出的单元。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接