systemd:重启多个服务时踩踏效应的解决方案?

systemd:重启多个服务时踩踏效应的解决方案?

我的systemd目标是提供大约 100 个儿童服务。如果我重新启动单个子服务,它会在几秒钟内启动。

但是,如果我立即重新启动所有 100 个子服务,则所有 CPU 核心都会受到猛烈冲击,负载会上升到 50,并且服务会保持离线状态 30 秒或更长时间,因为所有子服务都会争夺 CPU 资源来启动。

解决此问题的一种解决方案是编写滚动重新启动脚本:找到所有子服务并一一重新启动它们,中间间隔三秒。这使得所有的孩子都能快速出现,但随着新的孩子服务的添加,速度会越来越慢。

还有其他方法可以防止 systemd 的踩踏效应吗?我认为,也许正确的 CPU 限制可能会阻止任何一个子进程使用 CPU,从而使服务能够高效地重新启动,而无需大量停机或人为暂停。

另外,我不想使用 systemd 设置依赖链:所有子服务当前共享相同的 systemd 模板。

答案1

我尝试CPUWeight=80向我的模板服务添加指令,但似乎没有什么区别。有效的方法是创建一个big-restartall.service调用简单的 bash 脚本,其中包含简单的滚动重新启动的逻辑。就我而言,我发现每个服务之间的一秒暂停足以避免踩踏影响,从而在过程中保持启动时间和低负载。

# Restart the children of "big.target". 
for service in $(systemctl list-dependencies --plain big.target | grep -v target); {
  systemctl restart $service;
  # Give those processes a chance to start-- avoid a stampede effect.
  sleep 1;
}

相关内容