systemd可以自动重启/停止相关服务吗?

时间:2016-06-30 01:39:15

标签: linux multithreading real-time systemd system-dependent

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

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

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

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

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

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

Require=app1,app2,.....,app63

我能做到

 systemctl start myhaproxy

它将首先启动它需要的63个实例(假设在应用程序安装期间每个实例都被定义为一个单独的systemd单元)。

但是,我想知道无论如何我都可以将其用于重启和关机。

所以,如果我这样做:

systemctl stop myhaproxy

我希望它能自动关闭与之对话的应用程序的所有63个实例。

如果我这样做

systemctl restart myhaproxy

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

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

1 个答案:

答案 0 :(得分:5)

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

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

来自man systemd.unit(缩短):

  

<强> WantedBy =

     

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

     

<强> PartOf =

     

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