如何限制 UpStart 可以同时启动或重生的实例数量

Posted

技术标签:

【中文标题】如何限制 UpStart 可以同时启动或重生的实例数量【英文标题】:How to limit the number of instances UpStart can simultaneously start or respawn 【发布时间】:2015-05-13 20:36:04 【问题描述】:

我有一个 UpStart 服务作业,其中有许多 (~100) 个实例需要启动。它们中的每一个都是资源密集型进程,在启动期间会执行大量磁盘读取/写入。当它们全部同时启动或重生时,它们会由于过多的磁盘读/写请求而引起麻烦。

我需要一种方法来限制 UpStart 尝试同时启动或重生的实例数量。例如,有没有办法让 UpStart 推迟启动另一个实例,直到另一个实例的启动或重生开始后 30 秒?

【问题讨论】:

如果你的工作是一个 shell 脚本,你可以插入一个随机的暂停,这样当 10 个同时开始时,它们每个暂停不同的秒数并间隔自己 - 或者你可以在进行密集启动时让所有作业锁定某个文件。但这是一个与暴发户无关的shell脚本解决方案。 你能展示一个暴发户脚本吗?他们都一样吗? 我觉得@Paul 提到的lock 方法很酷。但这需要更改应用程序代码本身(顺便说一句,它不是 shell 脚本。它是一个完整编译的应用程序)。令人惊讶的是,UpStart 没有一些内置功能来自动保存和排队服务实例 (?)。 【参考方案1】:

您可以使用顺序启动它们

start on started otherUpstartService

【讨论】:

UpStart 何时将服务视为“启动”?进程一启动?如果它太早,它可能无助于及时分散负载。如果为时已晚,可能会耽误太多时间。【参考方案2】:

您可以使用pre-start 或post-stop 在每个作业后暂停。例如post-stop exec sleep 5

【讨论】:

如果它们在启动时都休眠相同的时间,那么问题仍然存在。有没有办法让睡眠时间随机? 您可以执行post-stop exec sleep $(( ( RANDOM % 10 ) + 1 )) 之类的操作来获得 1 到 10 秒之间的睡眠。只需将 10 更改为任何其他整数即可获得更大的范围

以上是关于如何限制 UpStart 可以同时启动或重生的实例数量的主要内容,如果未能解决你的问题,请参考以下文章

c# 限制同时启动多个实例程序运行

Gunicorn 和 Django 与 Upstart 和 Nginx

我的世界怎么设置一个人的重生点?

进程重新生成时,Upstart 脚本不执行预启动脚本

Systemd

如何按名称限制运行 Celery 任务的最大数量