出于性能原因,我需要运行一个应用程序的多个实例,固定到CPU,在不同的端口上侦听。 一个HAProxy TCP负载均衡器位于它们前面,用于分配stream量。
这样做是为了防止任何线程上下文切换,并强制执行无共享devise(因此不需要应用程序中的任何types的锁,假设它是单线程的)。
所以这意味着在一个有64个CPU的服务器上,我可能会将HAProxy固定到CPU 0,然后将我的应用程序的63个实例分别固定到独立的CPU(1-63)。
显然,在启动,重启,关机等方面的pipe理相当复杂。
我想知道是否有任何方法可以使用systemd来处理这个复杂的问题。
我知道,如果我将HAProxy定义为一个单元,然后声明它需要与其他应用程序交谈,它可以解决启动问题,例如
Require=app1,app2,.....,app63
我可以
systemctl start myhaproxy
它会首先启动它需要的63个实例(假设在应用程序安装过程中,每个实例都被定义为一个单独的systemd单元)。
但是,我想知道是否有反正我也可以得到这个也适用于重新启动和关机。
所以如果我这样做:
systemctl stop myhaproxy
我希望它会自动closures应用程序的63个实例。
如果我这样做
systemctl restart myhaproxy
那么我希望它在重新启动自己之前首先重新启动Require中列出的所有服务。
那可能吗? 还是超出了系统提供的范围?
我建议你创建一个目标 (例如app-all.target
),所有你的应用程序单元都会有WantedBy=app-all.target
依赖关系。 这将确保如果您启动目标,它将启动您的所有应用程序单元。 但是,这不适用于停止和重新启动。 为此,您需要为每个应用程序单元添加PartOf=app-all.target
依赖项。
另外,我建议你为你的应用程序创建一个模板单元,然后创建它的63个实例 – 这将使管理更容易(只有一个配置文件63符号链接到它)。 这里是关于模板和systemd的一般教程 。
从man systemd.unit
(缩写):
WantedBy =
当systemctl enable安装此单元时,将在每个列出的单元的.wants /或.requires /目录中创建一个符号链接。 主要结果是当列表中的单元启动时,当前单元将启动。
PartOf =
配置与Requires =类似的依赖关系,但仅限于停止和重新启动单位。 当systemd停止或重新启动这里列出的单位时,动作传播到这个单位。 请注意,这是单向依赖关系 – 对此单位的更改不会影响列出的单位。