Gnu Queue: 让 Linux 集群变得简单

作者:W. G. Krebs

所以,您的组织最终决定将集群中的 Linux 工作站数量增加一倍。现在您的计算能力是以前的两倍,对吗?

错了。事情没那么简单。旧习惯难以改变,您的组织可能会继续尝试将大部分作业提交到旧计算机。或者,由于习惯了旧计算机的超负荷运行,您的用户会将大部分作业提交到新计算机,让旧计算机闲置。 让我们面对现实,登录到网络中的每台计算机以查看哪一台计算机的利用率最低,这实在是太麻烦了。更简单的方法是将作业发送到某个地方,然后继续完成一天剩下的工作,特别是如果这是一个快速而粗糙的作业,并且有很多计算机。 然而,结果是整体性能降低和资源浪费。

您需要的是一个简单的实用程序,用于自动将您的作业发送到利用率最低的机器。您可以安装像 NQS 这样的批处理系统——也许您已经安装了一个——但是检查您的电子邮件或运行特殊命令来查看您的快速而粗糙的作业是否已在某个批处理队列中完成运行是很烦人的。如果出现问题,您可能需要使用非标准命令或跟踪哪个远程机器正在执行您的作业,运行 ps 以了解其进程 ID,然后执行 kill。 调到新部门或从事新工作的用户经常发现他们需要重新学习一套复杂的非标准命令,因为他们的新组织使用的批处理系统与他们过去使用的不同。

您想要一些真正简单的东西,一些可以通过 shell 工作的东西,这样您就可以使用像 jobs 这样的命令检查您的作业状态,并允许 shell 在作业终止时通知您,就像您在本地机器上后台运行它一样。 您希望能够使用 bgfg 将作业发送到后台和前台,并使用 kill 杀死作业,就像作业在本地节点上运行一样。 这样,您可以使用您和您的用户已经知道如何使用的相同标准 shell 命令来控制远程作业。

进入 GNU Queue。GNU Queue 让 Linux 工作站集群变得容易。如果您已经知道如何控制在本地机器上运行的作业,那么您已经知道如何使用 GNU Queue 控制远程作业。您甚至不需要特殊权限即可在集群上安装和运行 GNU Queue——任何人都可以做到。一旦您发现使用 GNU Queue 集群 Linux 环境是多么令人难以置信的容易,您就会想知道为什么组织继续在相对难以集群的 Windows NT 环境上花费这么多钱。

快速配置常用软件以每次都外包出去

使用 GNU Queue,您只需编写一个简单的包装 shell 脚本,使软件应用程序每次都外包到网络

#!/bin/sh<\n>
exec queue -i -w -p
-- realbogobasicinterpreter $*

并将其命名为 “bogobasicinterpreter”,并将真正的 bogobasicinterpreter 重命名为 “realbogobasicinterpreter”。 当然,这假设您拥有集群的管理权限(安装和运行 GNU Queue 不是必需的)。 当有人运行 bogobasicinterpreter 时,GNU Queue 会被告知将作业外包到网络。

使用 GNU Queue 的另一种流行方法是设置别名。即使您没有集群的管理权限,也可以这样做。如果您正在使用 csh,请更改到您的主目录并将以下行添加到您的 .cshrc

alias q queue -i -w -p --

并运行命令 source .cshrc。然后,您只需在您想要外包的作业名称前键入 “q” 即可外包作业。

无论哪种方式,GNU Queue 都会完成所有繁重的工作,立即找到一台负载较轻的机器来运行作业。 然后,它在您的本地机器上启动一个代理作业,该作业 “假装” 是远程执行的作业,这样您就可以通过正常的 shell 命令在后台、前台和杀死远程运行的作业。 无需教其他用户新命令来与某个复杂的批处理系统交互——如果他们了解如何使用 UNIX shell 来控制本地作业,他们就了解如何使用 GNU Queue 来控制远程执行的作业。

高级功能

当然,GNU Queue 支持许多附加功能。 它支持传统的批处理模式,其中输出可以选择通过电子邮件返回。 1.20.1 及更高版本现在对各种作业迁移模式具有 alpha 支持,这使管理员可以允许正在运行的作业实际从一台机器移动到另一台机器,以便在整个集群中保持恒定的负载。 更重要的是,GNU Queue 允许管理员限制可以运行的作业类型的数量(例如,允许在任何节点上运行不超过五个 bogobasicinterpreter 作业)或在机器负载过大时阻止某些作业运行。 例如,如果负载平均值超过 5,则无法启动 bogobasicinterpreter; 如果节点上的负载平均值超过 7,则正在运行的解释器将被挂起。 也可以限制某些作业可以运行的时间(周六不运行 bogobasicinterpreter)或定期检查自定义脚本的返回值以确定是否可以运行程序。 但是,您可能永远不需要这些高级功能。

获取和安装 GNU Queue:快速浏览

这一切听起来都很棒,您说。 我如何获取和安装 GNU Queue? 您可以从其网站 http://www.gnuqueue.org/ 下载 GNU Queue 的最新版本。 它是 SourceForge 上的一个参与项目,您可以找到各种讨论论坛、支持论坛和错误跟踪数据库。 从网站下载程序,解压缩,然后运行

 ./configure<\n>
 make install

从顶层目录。在集群中的每台机器上运行 make install 并使用 queued -D & 启动守护程序。

有关使用 queue 命令将作业外包到网络的快速参考,请访问 GNU Queue 主页。 这就是全部内容!

安装 GNU Queue 的详细说明

在集群上安装 GNU Queue 之前,您必须做出一个决定,该决定基本上取决于您是否在集群上具有 root(管理)权限。 如果您有,您可能希望以一种使站点上的所有用户都可以使用的方式安装 GNU Queue。 这是 --enable-root 选项。 另一方面,如果您只是集群上的普通 Jane 或 Joe,或者想在不放弃权限的情况下了解一下是怎么回事,您可以作为普通用户安装 GNU Queue,这是默认的安装模式。

是的,普通用户可以在您的集群上将 GNU Queue 安装为批处理系统! 但是,如果另一个用户想要运行 GNU Queue,他将不得不更改源代码中的端口号,以确保没有人正在运行 GNU Queue。 这就是为什么如果您希望很多用户想要在您的集群上运行 GNU Queue,最好让系统管理员安装 GNU Queue(使用 configure 脚本的 --enable-root 选项)。

一旦您从网上下载了 GNU Queue,首先要做的是使用 tar 命令解压缩它。 在 Linux 下,这只是 tar xzf filename,其中 filename 是文件的名称(使用 gzip 压缩并具有 .tar.gz 或 .tgz 文件扩展名)。 在其他系统上,这有点复杂,因为默认安装的 tar 不是 GNU tar 并且不支持 z 解压缩选项。 您需要显式运行 gunzip 解压缩程序:gunzip filename.tar.gztar xf filename.tar,其中 filename.tar.gz 是您从网络获得的具有 .tar.gz 扩展名的文件。 (精明的用户可能想使用 zcat filename.tar.gz|tar tf - 技巧,但这假设您系统上安装的 zcat 程序可以处理 GNU 压缩文件。 gunzip 是 GNU gzip 包的一部分;您可以从 ftp://ftp.gnu.org/ 获取它。

所以您已经解压缩了发行版,并且您正位于发行版的顶层目录中。 现在怎么办? 好吧,如果您是普通的 Jane 或 Joe,您可以通过在集群中的每台机器上运行 ./configure,然后运行 make install 将程序安装到发行版目录中。 然后,在集群中的每台机器上使用 queued -D & 启动守护程序。 如果您想要更多详细信息(或者您是系统管理员),请继续阅读。

普通用户的安装

运行 ./configure。 如果您在不是超级用户而是普通用户的系统上安装它,configure 会将 makefile 设置为将 GNU Queue 安装到当前目录中。 queue 将进入 ./bin;queued 守护程序将进入 ./sbin;./com/queue 将是共享的假脱机目录;主机访问控制列表文件将进入 ./share;queued pid 文件将进入 ./var。 如果您希望将内容安装到其他位置,请运行 ./configure --prefix=dir,其中 dir 是您希望安装内容的顶层目录。

超级用户的系统范围安装

默认的 ./configure 选项是将 GNU Queue 安装在本地目录中,仅供单个用户使用。 系统管理员应改为运行命令 ./configure --enable-root。 使用 --enable-root 选项安装时,configure 会将 makefile 设置为将 GNU Queue 安装在 /usr/local 前缀下。 queue 将进入 /usr/local/bin;queued 守护程序将进入 /usr/local/sbin;/usr/local/com/queue 将是共享的假脱机目录;主机访问控制列表文件将进入 /usr/local/share;queued pid 文件将进入 /usr/local/var。 如果您希望将内容安装到其他位置,请运行以下命令

./configure --enable-root<\n>
--prefix=dir

其中 dir 是您希望安装内容的顶层目录。

./configure 接受许多您可能希望了解的其他选项,包括用于更改各种目录路径的选项。 ./configure --help 提供了它们的完整列表。 以下是一些示例,--bindir 指定 queue 的安装位置;--sbindir 指定 queued 的安装位置;--localstatedir 说明假脱机目录和 queued pid 文件的安装位置;--datadir 列出主机访问控制文件的安装位置。 如果 ./configure 无法优雅地失败,请确保安装了 lex。 GNU flex 是 lex 的一个实现,可从 FSF 获取,https://gnu.ac.cn/

现在,运行 make 来编译程序。 如果您的 make 抱怨 Makefile 中存在语法错误,您需要运行 GNU Make,希望它已经安装在您的机器上(可能为 gmakegnumake),但如果不是,您可以从 FSF https://gnu.ac.cn/ 获取它。

如果一切顺利,make install 会将程序安装到您使用 ./configure 指定的目录中。 将创建缺失的目录。 如果主机访问控制列表中尚不存在运行 make install 的节点的主机名,则会将其添加到主机访问控制列表中。

现在,尝试运行 Queue。 在本地机器上启动 ./queued -D &。 (如果您在节点上执行了 make install,则主机名应该已经存在于主机访问控制列表文件中。)

示例和选项

这里有一些简单的例子

> queue -i -w -n -- hostname<\n>
> queue -i -r -n -- hostname

对于更复杂的示例,请尝试使用 Control-Zfg 挂起和恢复它

> queue -i -w -p -- emacs -nw
如果此示例在 localhost 上有效,您将需要将其他主机添加到 share(或 --datadir)中的主机访问控制列表,并在这些主机上启动 queued。

这一行

> queue -i -w -p -h hostname -- emacs
-nw

将在主机名上运行 Emacs。 如果没有 -h 参数,它将在访问控制列表文件中最佳或负载最轻的主机上运行作业。 还有一个 -H hostname 选项,它使主机名成为首选,但如果主机名不可用,作业将在其他主机上运行。

此时,您可能想知道 queue 的其他一些选项的作用是什么。 ./queue --help 提供了 Queue 的选项列表。 “--” 将 GNU Queue 选项与要传递给要运行的命令的选项分开。 -i 代表 immediate(立即);它将要运行的作业放在 “now” 批处理队列中。 -w 调用代理作业系统,而不是 -r,后者导致输出通过电子邮件返回给用户(传统批处理模式)。 -n 关闭虚拟终端支持。 大多数用户可能只会使用 -i -w -p(完全虚拟终端支持,用于像 Emacs 这样的交互式作业)和 -i w -n(无虚拟终端支持,用于非交互式作业)。

有关 GNU Queue 用于主机选择的协议的更多详细信息,请参阅在线手册和在线 Internet 草案协议,网址为 http://www.gnuqueue.org/

使用假脱机目录隔离作业

您还可以创建其他队列以与 -q-d spooldir 选项一起使用。 它们可以用于为不同类别的作业指定不同的排队行为。 每个 spooldir 都必须具有与之关联的配置文件。 配置文件确定在该 spooldir 中运行的作业的排队行为。 有关更多详细信息,请参阅在线手册。

微调集群性能

这就是全部内容! 当然,为了使 GNU Queue 能够良好地工作,集群中的节点之间需要某种文件共享(例如,NFS,网络文件系统)。 如果您具有相同的主目录,无论您登录哪台机器,您的系统管理员都以某种方式配置了您的主目录以在所有集群节点之间共享。 您需要确保在集群节点之间共享(即,相同)足够的文件系统,以便您的程序在运行时不会感到困惑。 通常,您会希望系统临时目录(/tmp 和 /usr/tmp)是非共享的,但其他所有内容(可能除了包含内核映像和基本命令的根文件系统)都是共享的。 因为这种配置在 UNIX 和 Linux 集群中非常常见,所以我们在此假设情况就是如此,但事实并非一定如此;因此,如果您对文件如何在您的网络集群中共享有疑问,请咨询您的系统管理员。

文档和邮件列表

有关 GNU Queue 的文档也可以从网站上获取,包括关于 GNU Queue 用于外包作业的协议的 Internet 草案。 当您在那里时,您可能需要注册三个邮件列表之一(queue-announce、queue-developers 和 queue-support),以便您可以了解新功能的发布情况并与其他 GNU Queue 用户互动。 在撰写本文时,queue-developers 是迄今为止最活跃的列表,其中热烈讨论了 GNU Queue 的许多功能的改进以及建议移植到新平台。 您可以从 queue-support 邮件列表中获得关于您遇到的任何问题的建议。

CVS 仓库:加入开发者社区

主页上提到的另一个 SourceForge 功能是 GNU Queue 的 CVS 仓库。 感兴趣的读者可以通过解压缩 GNU Queue 发行版并在顶层目录中运行命令 cvs update 来获取最新的预发布开发代码,其中包含开发人员添加的最新功能(和错误)。 如果您正在积极更改 GNU Queue,您可以申请 CVS 目录的写入权限,并通过 cvs ci 命令立即发布您的更改。 如果您可以让其他开发人员对您的工作感兴趣(当然,通过 queue-developers 邮件列表),您可以通过 cvs、ci 和 cvs update 的重复循环在您自己之间来回传递代码更改。 所有这一切都假设您已安装 cvs,这是许多 Linux 发行版的默认设置。

代码不是感兴趣的读者为 GNU Queue 做出贡献的唯一方式。 有许多方法可以为 SourceForge 上的 GNU Queue 工作做出贡献。 在 SourceForge 上登录后,项目管理员之一可以为您提供文档树的编辑权限、讨论论坛的版主权限或站点错误跟踪和补丁数据库部分的管理权限。

获取帮助

如果您遇到此处未解释的安装问题,您可能希望查看支持论坛和支持邮件列表,这些列表可在 GNU Queue 的主页 https://gnu.ac.cn/software/gnu-queue/ 上找到。 错误应报告给 bug-queue@gnu.org。

外包那个作业!

所以请记住:下次您有快速而粗糙的作业要运行时,不要浪费时间和资源。 使用 GNU Queue 外包那个作业!

Gnu Queue: Linux Clustering Made Easy
W. G. Krebs 是耶鲁大学分子生物物理学和生物化学专业的博士候选人,他在那里研究基于网络的生物数据库。 他担任系统程序员的时间更长,使用的语言也更多,超出他愿意讲述的范围。 他的广泛兴趣包括政治经济学、古典音乐和民间音乐以及中国围棋;他欢迎您通过 wkrebs@gnu.org 或邮寄至 Linux Journal 发表您的评论。
加载 Disqus 评论