我每隔一段时间就会运行一项消耗时间和资源的任务 ( make
),该任务可以在任何一台服务器池上运行。
问题是,我不是唯一运行的用户make
,当两个或更多不知情的用户make
同时运行时,它需要很长时间,有时服务器甚至崩溃。因此我们决定,每当有人想要运行时make
,他或她必须首先ssh
进入其中一台服务器,确保make
其他用户(使用Linux)尚未在该服务器上运行w
,然后他或她才能启动make
。
在我尝试自动化选择服务器的过程中,我编写了一个简单的脚本,该脚本在服务器池上循环,ssh
进入每个服务器,并选择其中w
没有输出的第一个服务器make
,但这种方法是太天真了,因为它忽略了以下几点:
- 每台服务器都有不同的属性(例如,一台有 12 个 CPU,另一台有 80 个 CPU)
make
不是这些服务器运行的唯一任务w
仅显示已登录的用户进程ssh
,虽然大部分时间make
都在运行ssh
,但很可能有人正在make
从服务器本身运行。
我想更改选择服务器的标准,但不确定它应该是什么。
我在网上查找并找到了该top
命令,但同样,我不确定应该考虑什么。
例如,我考虑使用以下标准:$(top -bn 1 | grep 'Cpu\(s\)' | gawk '{print $2+$3+$4+$6+$7+$8}')
确定当前最不繁忙的服务器,但这忽略了服务器的属性。可能有一台更繁忙的服务器,拥有更多的 CPU。
答案1
您应该寻找分布式任务/作业调度程序、集群管理系统或云管理。其中很多已经存在; cas 在他的评论中指出了一些,谷歌还会发现更多。
我相信一旦部署了一个,你们都会更开心,而不必再担心一直踩到对方的脚趾。另外,您应该修复服务器,这样错误只会导致任务失败,而不是导致机器瘫痪。
如果您坚持构建自己的资源(我承认我已经做过这件事 - 尽管那是 15 年前的事),那么从广义上讲,任务会消耗几种不同类型的资源,您可能需要考虑您的任务占用哪些资源:
- 内存(RAM)[从你的运行速度非常慢或崩溃,我猜这对你的
make
任务来说是一个很大的任务] - 磁盘I/O带宽
- 每秒磁盘 I/O 操作数(查找)
- 磁盘空间
- 中央处理器时间
- GPU时间
- 网络带宽
您可以通过 来检查内存使用情况free
,通过 来检查磁盘 I/O iostat
,通过 来检查空间,通过(在 Linux 上)或, ,等free
检查 CPU 使用情况。cat /proc/loadavg
uptime
top
ps
但是,当然,检查当前数字有一个问题 - 也许您的make
工作首先需要花费几分钟时间执行一些简单的操作,然后启动需要数十亿 RAM 的庞大进程。这可能会发生:
- Alice 运行脚本来启动“make”任务。
- 脚本检查 serverA,发现它有大量可用 RAM,CPU 使用率低,在 serverA 上启动任务。
- 不久之后,Bob 运行脚本来启动其他一些 RAM 密集型任务。
- Alice的任务还没有进入资源密集阶段。因此,当脚本检查 serverA 时,它仍然有大量可用 RAM。也在 serverA 上启动 Bob 的任务。
- Bob 的任务耗尽了 serverA 上的大部分可用 RAM
- Alice 的任务终于进入了 RAM 密集型部分,但现在没有可用的 RAM。呃-哦! ServerA 被打死。
是的,上面的内容来自于编写一个的经验(尽管对于我使用我的来说,这是 CPU 时间)。