修订历史 | ||
---|---|---|
修订版 v1.0.3 | 2004 年 6 月 18 日 | |
小修复 | ||
修订版 v1.0.2 | 2003 年 7 月 29 日 | |
RPM 构建 | ||
修订版 v1.0.1 | 2003 年 7 月 19 日 | |
重大更新 | ||
修订版 v1.0 | 2003 年 7 月 9 日 | |
小更新 | ||
修订版 v1.0 | 2003 年 5 月 11 日 | |
终于 | ||
修订版 v1.0 RC 1 | 2003 年 5 月 7 日 | |
重大清理 | ||
修订版 v0.95 | 2003 年 4 月 4 日 | |
用 PlumpOS 替换 ClumpOS | ||
修订版 v0.94 | 2003 年 2 月 25 日 | |
Mirko Caserta 的补丁 | ||
修订版 v0.93 | 2003 年 2 月 16 日 | |
额外功能和修复 | ||
修订版 v0.92 | 2003 年 1 月 21 日 | |
修订版 v0.91 | 2002 年 9 月 27 日 | |
修订版 v0.90 | 2002 年 9 月 3 日 | |
修订版 v0.71 | 2002 年 8 月 26 日 | |
Spleling Fexis | ||
修订版 v0.70 | 2002 年 8 月 22 日 | |
删除空部分,用 openMosixView 替换 Mosixview | ||
修订版 v0.50 | 2002 年 7 月 6 日 | |
第一个 openMosix HOWTO | ||
修订版 v0.20 | 2002 年 7 月 5 日 | |
最新的 Mosix HOWTO(目前为止) | ||
修订版 v0.17 | 2002 年 6 月 28 日 | |
修订版 v0.15 | 2002 年 3 月 13 日 | |
修订版 v0.13 | 2002 年 2 月 18 日 | |
修订版 ALPHA 0.03 | 2001 年 10 月 9 日 | |
起初有 Mosix,然后出现了 openMosix,在我看来这是一个更有趣的项目。不仅从技术角度来看,而且还因为更正确的许可证。我决定将本 HOWTO 的重点放在 openMosix 而不是 Mosix 上,这主要是基于 openMosix 拥有更大的用户群这一事实。(Moshe Bar 表示,大约 97% 的旧 Mosix 社区已切换到 openMosix。)(20020705) 鉴于上述情况,许多信息可能对 Mosix 和 openMosix 的用户都有价值。我决定拆分 HOWTO。Mosix HOWTO 的最新版本,包含关于 Mosix 和 OpenMosix 的信息将是 0.20 我打算专注于 openMosix HOWTO,但不会忽略 Mosix 用户。更多信息请访问 http://howto.ipng.be/Mosix-HOWTO/
本文档简要描述了 openMosix,这是一种将 GNU/Linux 计算机网络变成计算机集群的软件包。在此过程中,给出了一些并行处理的背景知识,以及对专门利用 openMosix 功能的程序的简要介绍。HOWTO 扩展了文档,因为它提供了更多的背景信息,并讨论了各种发行版本的怪癖。
自从创建本 HOWTO 以来,Mosix 团队的一些人创建了 openMosix(稍后会详细介绍),最初本 HOWTO 讨论了 openMosix 和 Mosix。尽管许多信息可能对 Mosix 和 openMosix 的用户都有价值。我决定拆分 HOWTO。Mosix HOWTO 的最新版本,包含关于 Mosix 和 OpenMosix 的信息将是 0.20,可以在 http://howto.ipng.be/Mosix-HOWTO/Mosix-HOWTO/ 上找到。
当 Scot Stevenson 正在寻找人接手这项工作时,Kris Buytaert 参与了这项工作:那是 2002 年 2 月。虽然最初我们讨论了 Mosix 和 openMosix,但现在这个版本的 HOWTO 主要关注 openMosix。请注意,文档经常仍然提到 Mosix,但应该理解为 openMosix。
您会注意到,一些标题不如它们应该的那样严肃。Scot 计划以稍微轻松的风格编写 HOWTO,因为世界(甚至是以打嗝的企鹅作为吉祥物的那部分世界)充满了致命的技术文献。因此,某些部分仍然有这些评论。
使用本文档中的信息,风险自负。我对本文档的内容不承担潜在责任。使用本文档的概念、示例和/或其他内容完全由您自行承担风险。
所有版权归其各自所有者所有,除非另有说明。在本文档中使用术语不应被视为影响任何商标或服务标志的有效性。openMosix 的版权归 Moshe Bar 所有。(c) Mosix 的版权归 Amnon Barak 所有。(c) Linux 是 Linus Torvalds 的注册商标。openMosix 已根据自由软件基金会发布的 GNU 通用公共许可证第 2 版获得许可。
特定产品或品牌的命名不应被视为认可。
强烈建议您在进行重大安装之前备份您的系统,并定期备份。
版权所有 (c) 2002 Kris Buytaert 和 Scot W. Stevenson。本文档可以根据自由软件基金会发布的 GNU 自由文档许可证 1.1 版或任何更高版本的条款分发;没有不变章节,没有封面文本,也没有封底文本。许可证的副本包含在题为“GNU 自由文档许可证”的附录中。
本文档的官方新版本可以在 Linux 文档项目 的网页上找到。草稿和 Beta 版本将在 howto.ipng.be 的相应子文件夹中提供。本文档的更改通常将在 openMosix 邮件列表中讨论。有关详细信息,请参阅 openMosix。
大多数时候,您的计算机都很无聊。启动一个像 xload 或 top 这样的程序来监控您的系统使用情况,您可能会发现您的处理器负载甚至没有达到 1.0 标记。如果您有两台或多台计算机,则在任何给定时间,很可能至少其中一台计算机什么也不做。不幸的是,当您真正需要 CPU 功率时——在 C++ 编译期间,或编码 Ogg Vorbis 音乐文件时——您需要大量的 CPU 功率一次。集群背后的想法是将这些负载分散到所有可用的计算机上,利用其他机器上的空闲资源。
集群的基本单元是单台计算机,也称为“节点”。集群可以通过添加更多机器来扩展规模——它们可以“扩展”。整个集群的功能将随着单个计算机的速度和它们的连接速度的提高而变得更加强大。此外,集群的操作系统必须根据不断变化的条件,最好地利用可用的硬件。如果集群由不同的硬件类型(“异构”集群)组成,如果集群的配置不可预测地变化(机器加入和离开集群),并且负载无法提前预测,这将变得更具挑战性。
基本上有 3 种类型的集群,故障转移、负载均衡和高性能计算,最常用的可能是故障转移集群和负载均衡集群。
故障转移集群 由 2 台或多台网络连接的计算机组成,2 台主机之间具有单独的心跳连接。2 台机器之间的心跳连接用于监控所有服务是否仍在运行:一旦一台机器上的服务崩溃,其他机器将尝试接管。
对于负载均衡集群,概念是当收到例如 Web 服务器的请求时,集群会检查哪台机器最不繁忙,然后将请求发送到该机器。实际上,大多数时候负载均衡集群也是故障转移集群,但具有额外的负载均衡功能,并且通常具有更多节点。
集群的最后一种变体是高性能计算集群:机器经过特殊配置,可以为需要极致性能的数据中心提供他们所需的功能。Beowulfs 的开发专门为研究机构提供他们所需的计算速度。这类集群也具有一些负载均衡功能;他们尝试将不同的进程分散到更多的机器上,以提高性能。但在这种情况下,主要归结为进程被并行化,并且可以单独运行的例程将被分散在不同的机器上,而不是必须等到它们一个接一个地完成。
负载均衡和故障转移集群最常见的已知示例是 Web 场、数据库或防火墙。人们希望他们的服务具有 99.99999% 的正常运行时间,互联网 24/24 7/7/ 365/365 全天候开放,不像过去办公室关门时您可以关闭服务器。
需要 CPU 周期的人通常可以负担得起安排其环境的停机时间,只要他们可以在需要时使用机器的最大功率。
传统上,超级计算机仅由少数精选的供应商构建:需要此类机器性能的公司或组织必须拥有巨额预算才能购买超级计算机。许多大学自己负担不起超级计算机的成本,因此他们正在研究其他替代方案。当人们第一次尝试将不同的作业分散到更多计算机上,然后收集回这些作业产生的数据时,集群的概念就诞生了。随着更便宜和更常见的硬件可供所有人使用,在最初几年,只有梦想才能获得与真正的超级计算机相似的结果,但随着 PC 平台的进一步发展,超级计算机与多台个人计算机集群之间的性能差距变得越来越小。
有不同的并行处理方法:(N)UMA、DSM、PVM 和 MPI 都是不同类型的并行处理方案。其中一些在硬件中实现,另一些在软件中实现,另一些则两者兼而有之。
(N)UMA((非)统一内存访问),例如,机器可以共享访问内存,它们可以在其中执行代码。在 Linux 内核中,有一个 NUMA 实现,它改变了不同内存区域的内存访问时间。然后,内核的任务是使用最接近其正在使用的 CPU 的内存。
DSM 又名分布式共享内存,已在软件和硬件中实现,其概念是为物理分布式内存提供一个抽象层。
当人们谈论基于 GNU/Linux 的 Beowulfs 时,PVM 和 MPI 是最常用的工具。
MPI 代表消息传递接口。它是消息传递库的开放标准规范。MPICH 是 MPI 最常用的实现之一。除了 MPICH 之外,您还可以找到 LAM,它是 MPI 的另一个实现,基于库的免费参考实现。
PVM 或并行虚拟机是 MPI 的另一个同类产品,它也经常被用作创建 Beowulf 的工具。PVM 存在于用户空间中,因此不需要特殊的内核修改:基本上,每个具有足够权限的用户都可以运行 PVM。
openMosix 软件包将运行 GNU/Linux 的联网计算机变成一个集群。它可以自动平衡集群不同节点之间的负载,并且节点可以加入或离开正在运行的集群,而不会中断服务。负载根据节点的连接和 CPU 速度在节点之间分散。
由于 openMosix 是内核的一部分,并且与 Linux 保持完全兼容性,因此用户的程序、文件和其他资源都将像以前一样工作,而无需进行任何进一步的更改。普通用户不会注意到 Linux 系统和 openMosix 系统之间的区别。对她来说,整个集群将像一个(快速的)GNU/Linux 系统一样运行。
openMosix 是一个 Linux 内核补丁,它为 IA32 兼容平台提供与标准 Linux 的完全兼容性。内部负载均衡算法透明地将进程迁移到其他集群成员。优点是节点之间更好的负载共享。集群本身会尝试随时优化利用率(当然,系统管理员可以在运行时通过手动配置来影响自动负载均衡)。
这种透明的进程迁移功能使整个集群看起来像一个大型 SMP 系统,其处理器数量与可用的集群节点一样多(当然,对于双/四核系统等 X 处理器系统,数量乘以 X)。openMosix 还为 HPC 应用程序提供了一个强大的优化文件系统 (oMFS),与 NFS 不同,它提供了缓存、时间戳和链接一致性。
传闻说 Mosix 来自 Moshe Unix。最初,Mosix 是作为在 BSD/OS 3.0 上运行的应用程序开始的。
Announcing MO6 for BSD/OS 3.0 Oren Laadan (orenl@cs.huji.ac.il) Tue, 9 Sep 1997 19:50:12 +0300 (IDT) Hi: We are pleased to announce the availability of MO6 Version 3.0 Release 1.04 (beta-4) - compatible with BSD/OS 3.0, patch level K300-001 through M300-029. MO6 is a 6 processor version of the MOSIX multicomputer enhancements of BSD/OS for a PC Cluster. If you have 2 to 6 PC's connected by a LAN, you can experience truly multi-computing environment by using the MO6 enhancements. The MO6 Distribution -------------------- MO6 is available either in "source" or "binary" distribution. It is installed as a patch to BSD/OS, using an interactive installation script. MO6 is available at http://www.cnds.jhu.edu/mirrors/mosix/ or at our site: http://www.cs.huji.ac.il/mosix/ Main highlights of the current release: -------------------------------------- - Memory ushering (depletion prevention) by process migration. - Improved installation procedure. - Enhanced migration control. - Improved administration tools. - More user utilities. - More documentation and new man pages. - Dynamic configurations. Please send feedback and comments to mosix@cs.huji.ac.il. ------------------- |
openMosix 是对您在 mosix.org 上找到的任何内容的补充,并且充分赞赏和尊重 Barak 教授在杰出的 Mosix 项目中的领导地位。
Moshe Bar 多年来一直参与 Mosix 项目 (www.mosix.com),并且是 Mosix 项目的联合项目经理和商业 Mosix 公司的总经理。
在对 Mosix 的商业未来持有不同意见之后,他创立了一家新的集群公司 - Qlusters, Inc. - Barak 教授决定暂时不参与这项风险投资(尽管他确实认真考虑过加入),并与投资者进行了长期谈判。看来 Mosix 不再作为 GPL 项目公开支持。由于那里存在大量用户群(全球约 1000 个安装),Moshe Bar 决定以新名称 openMosix 并在完整的 GPL2 许可下继续 Mosix 项目的开发和支持。openMosix 中来自旧 Mosix 项目的任何代码的版权归 Amnon Barak 所有,2002 年所有新代码的版权归 Moshe Bar 所有,2002 年。
未来的 openMosix 版本的架构可能会(并且将会)发生重大变化。关于自动配置、节点发现和新的用户空间工具的新概念正在 openMosix 邮件列表中讨论。大多数新功能已经实现,而其中一些功能(例如 DSM(分布式共享内存))在我撰写本文时(2003 年 3 月)仍在开发中。
为了实现标准化和未来的兼容性,proc 接口已从 /proc/mosix 更改为 /proc/hpc,/etc/mosix.map 已更改为 /etc/hpc.map。最近,配置文件的标准已设置为位于 /etc/openmosix.map 中(实际上这是 /etc/init.d/openmosix 脚本将查找的第一个配置文件)。适用于 openMosix 的改编的命令行用户空间工具已在项目的网页上提供。
openmosix.map 配置文件可以替换为节点自动发现系统,该系统称为 omdiscd(openMosix 自动发现守护程序),我们稍后将对此进行讨论。
openMosix 得到了世界各地各种有能力的人员(参见 openmosix.sourceforge.net)的共同支持。该项目的主要目标是为各种 HPC 应用程序创建一个标准化的集群环境。
openMosix 在 http://openMosix.sourceforge.net 还有一个项目网页,其中包含 CVS 树和面向开发人员和用户的邮件列表。
像大多数活跃的开源程序一样,openMosix 的变化速度往往超过追随者保持文档更新的能力。
当我在 2003 年 2 月撰写本文时,openMosix 2.4.20 和 openMosix Userland Tools v0.2.4 已发布,包括新的自动发现工具。
有关最新的开发状态,请查看 openMosix 网站
openMosix 集群可以采用各种形式。为了演示这一点,让我们假设您是一名学生,与一位富有的计算机科学专业的家伙合租一间宿舍,您们已将计算机连接起来形成一个 openMosix 集群。让我们还假设您目前正在将 CD 中的音乐文件转换为 Ogg Vorbis 以供个人使用,这在您的国家/地区是合法的。您的室友正在做一个 C++ 项目,他说这将带来世界和平。然而,就在此时此刻,他正在浴室里做一些不可描述的事情,他的电脑处于空闲状态。
因此,当您启动像 bladeenc 这样的程序将巴赫的 .... 从 .wav 转换为 .ogg 格式时,您机器上的 openMosix 例程会比较两个节点上的负载,并决定如果将该进程从您的 Pentium-233 发送到他的 Athlon XP,事情会更快。这种情况会自动发生:您只需像在独立机器上一样键入或单击命令。您注意到的只是,当您启动另外两个编码运行时,事情会快得多,并且响应时间不会下降。
现在当您仍在输入 .... 时,您的室友回来了,嘟囔着一些关于自助餐厅食物中的红辣椒的事情。他继续他的测试,使用一个名为“pmake”的程序,这是一个针对并行执行优化的“make”版本。无论他在做什么,它都会占用如此多的 CPU 时间,以至于 openMosix 甚至开始将子进程发送到您的机器以平衡负载。
这种设置称为 *单池*:所有计算机都用作单个集群。这样做的好处/坏处是您的计算机是池的一部分:您的东西将在其他计算机上运行,但他们的东西也将在您的计算机上运行。
使用 openMosix,您可以在一台机器上启动一个进程,并发现它实际上在集群中的另一台机器上运行。每个进程都有自己的唯一宿主节点 (UHN),它在其中创建。
迁移意味着进程被拆分为 2 个部分,用户部分和系统部分。用户部分将被移动到远程节点,而系统部分将保留在 UHN 上。这个系统部分有时被称为代理进程:这个进程负责解析大多数系统调用。
openMosix 负责这两个进程之间的通信。
为了支持 openMosix,Major Chai Mee Joon 正在为 OM 用户提供免费试用帐户,以访问他的在线 openMosix 集群服务,用户可以使用该服务来测试和实验 openMosix。
这种在线 openMosix 集群服务的可用性将帮助新用户克服最初的 openMosix 配置问题,并为正在开发或移植其应用程序的 openMosix 用户提供更高的计算能力。
请发送电子邮件至<om@majorlinux.com>以获取试用帐户。
表 2-1. openMosix 的优点
无需额外的软件包。 |
无需对您的应用程序进行代码更改。 |
安装/配置简单。 |
在基于 Red-Hat 的系统/发行版上,安装 openMosix 就像键入以下内容一样简单:# rpm -Uvh openMosix*.rpm |
DSM 即将发布(2003 年 3 月下旬)。 |
与 openAFS 良好集成。 |
正在进行向 IA-64 以及 AMD-64 的移植。 |
自普通 MFS 以来,oMFS 已得到很大改进。 |
它是一个集群平台,其上有超过 10 种产品:openMosixView、openMosixWebView、openMosixApplet、RxLinux、PlumpOS、K12LTSP、LTSP 和许多其他产品。 |
openMosix 是用户自己开发的产品,因此从定义上来说更贴近用户。 |
节点自动发现/故障转移守护程序已通过多播消息传递在用户空间工具中实现。 |
具有多个接口的主机的别名。 |
基本路由可用(在不需要真正多播路由的罕见情况下)。 |
集群掩码允许指定给定进程可以迁移到哪些节点。 |
安装基本集群至少需要 2 台网络连接的机器,可以使用两张网卡之间的交叉电缆,也可以使用交换机或集线器(交换机比集线器好得多,而且只贵几美元)。当然,您的网卡速度越快,您的集群就越容易获得更好的性能。
如今,快速以太网 (100 Mbps) 已成为标准;在一台机器中安装多个端口并不困难,但请确保通过其他物理网络连接它们,以便获得您想要的速度。千兆以太网现在每天都在变得更便宜,但我建议您在实际使用多张 100Mbit 网卡测试您的设置并注意到您确实需要额外的网络容量之前,不要急于去商店花钱。除了安装千兆网卡外,您可能还想尝试将不同的 100Mbit 网卡绑定在一起。在 本文 中讨论了 Firewire,它可以找到更便宜的替代方案。
设置大型集群需要进行一些思考:您打算将机器放在哪里?我希望不是放在桌子下的某个地方或办公室的中间!如果您只是想进行一些小型测试,那还可以,但如果您计划部署 N 节点集群,则必须确保容纳这些机器的环境能够做到这一点。
我指的是准备一个或多个 19 英寸机架来容纳机器,配置适当的网络拓扑,可以是直连、单连接,甚至是所有节点之间 1 对 1 的交叉连接网络。您还需要确保有足够的电力来支持如此多的机器,您的空调系统支持负载,并且在电源故障的情况下,您的 UPS 可以干净地关闭所有必需的系统。您可能需要投资 KVM(键盘、视频、鼠标)切换器,以便于访问机器的控制台。
但即使您没有足够数量的节点来证明这种投资是合理的,也要确保您可以随时轻松访问不同的节点,您永远不知道什么时候必须更换 CPU 风扇或出现故障的机器的硬盘。如果这意味着您必须卸下一堆机器才能到达最底层的机器,从而关闭您的集群,那么您就麻烦了。
我们计划使用的系统将需要您选择的基本 Linux 安装:Red Hat、SuSe、Debian、Gentoo 或任何其他发行版:具体是哪个发行版并不重要。重要的是内核至少达到 2.4 级别,并且您的网卡配置正确;除此之外,您还需要健康的交换空间。
当涉及到使用服务器池和一组(个人)工作站配置 openMosix 集群时,您有不同的选择,这些选择各有优缺点。
在单池配置中,所有服务器和工作站都用作单个集群:每台机器都是集群的一部分,并且可以将进程迁移到彼此现有的节点。这当然使您的工作站成为池的一部分。
在称为服务器池的环境中,服务器是集群的一部分,而工作站不是集群的一部分,它们甚至没有 openMosix 内核。如果您想在集群上运行应用程序,您需要专门登录到这些服务器。但是,您的工作站也将保持干净,并且不会有远程进程迁移到它。
第三种替代方案称为自适应池配置:这里服务器是共享的,而工作站加入或离开集群。想象一下您的工作站白天供您自己使用,但是,一旦您在晚上注销,脚本会告诉工作站加入集群并开始处理数字。这样,您的机器在您不需要时就会被使用。如果您再次需要机器的资源,只需运行 openmosix stop 脚本,您的进程将远离集群,反之亦然。
实际上,这意味着您将通过使用 mosctl 更改机器的角色。
本章介绍如何在不同的发行版上安装 openMosix。这不会是所有可能组合的详尽列表。但是,在整章中,您应该找到足够的信息来在您的环境中安装 openMosix。
关于使用 openMosix 安装多台机器的技术将在接下来的章节中讨论。
首先,您必须了解 openMosix 由内核补丁和一些用户空间工具组成。内核补丁是使内核能够与网络上其他启用 openMosix 的机器通信所必需的。如果您以二进制包(例如 rpm 文件)的形式下载 openMosix,您甚至不需要关心内核补丁,因为内核已经过修补和编译,并为您提供了最常见的默认选项和模块。
为了有效使用启用 openMosix 的内核,需要用户空间工具。它们用于启动/停止迁移守护进程、openMosix 文件系统、将作业迁移到特定节点以及其他通常借助我们老朋友:命令行界面完成的任务。关于二进制包:与内核补丁的情况相同,用户空间工具也是如此:如果您安装 rpm,则无需担心编译或配置任何内容;只需让它们安装并运行。就是这样。真的 :)
一旦您进入下载页面(我们将在稍后讨论),您需要获取两个不同的部分:内核和用户空间工具。您可以下载两个二进制包,也可以获取内核补丁和用户空间工具的源代码。内核补丁通常以以下方案命名:openMosix-x.y.z-w,其中 x.y.z 是应该应用补丁的 vanilla Linux 内核的版本,w 是该特定内核版本的补丁修订号。对于预编译的内核二进制文件,请参阅您在下载页面中找到的 README-openMosix-kernel.txt 文件。该文件还包含有关手动编译内核的最新信息。
关于用户空间工具:您将在名为 openmosix-tools 的软件包中找到它们。我们互换使用术语用户空间工具、userspace-tools 和 openmosix-tools。有关预编译二进制文件和手动编译工具的最新信息也包含在 README-openmosix-tools.txt 文件中。请注意,自 openmosix-tools 的 0.3 版本以来,openmosix.map 文件已被弃用,强烈建议使用自动发现守护进程,因为它往往会让您的生活更轻松。
您可以从 http://sourceforge.net/project/showfiles.php?group_id=46729 下载最新版本的 openMosix。您可以选择为 UP 或 SMP 编译的二进制文件(甚至是 rpm),也可以下载源代码。您将需要内核补丁或二进制文件以及用户空间工具。或者,您可以获取 CVS 版本
cvs -d:pserver:anonymous@cvs.openmosix.sourceforge.net:/cvsroot/openmosix login cvs -z3 -d:pserver:anonymous@cvs.openmosix.sourceforge.net:/cvsroot/openmosix co linux-openmosix cvs -z3 -d:pserver:anonymous@cvs.openmosix.sourceforge.net:/cvsroot/openmosix co userspace-tools |
始终使用来自 https://linuxkernel.org.cn/ 的纯 vanilla 内核源代码来编译 openMosix 内核!请尽量使用离您较近的镜像下载内核,并始终尝试下载您已拥有的最新内核源代码的补丁,而不是下载整个源代码。Linux 社区将非常感谢这样做,并且会大大增加您的极客声誉 ;-) 请务必使用正确的 openMosix 补丁,具体取决于内核版本。在我写这篇文章时,最新的 2.4 内核是 2.4.20,因此您应该下载 openMosix-2.4.20-x.gz 补丁,其中“x”代表补丁修订号(即:修订号越大,它就越新)。不要使用任何 Linux 发行版附带的内核:它行不通。这些内核源代码被发行版制作者大量修补,因此,将 openMosix 补丁应用于这样的内核肯定会失败!我经历过,相信我 ;-)
下载实际版本的 openMosix 补丁,并将其移动到您的内核源代码目录中(例如 /usr/src/linux-2.4.20)。如果您的内核源代码目录不是“/usr/src/linux-[version_number]”,则至少需要创建到“/usr/src/linux-[version_number]”的符号链接。假设您是 root 用户,并且已将 gzipped 补丁文件下载到您的主目录中,请使用(猜猜是什么?)patch 实用程序应用补丁
mv /root/openMosix-2.4.20-2.gz /usr/src/linux-2.4.20 cd /usr/src/linux-2.4.20 zcat openMosix-2.4.20-2.gz | patch -Np1 |
mv /root/openMosix-2.4.20-2.gz /usr/src/linux-2.4.20 cd /usr/src/linux-2.4.20 gunzip openMosix-2.4.20-2.gz cat openMosix-2.4.20-2 | patch -Np1 |
mv /root/openMosix-2.4.20-2.gz /usr/src/linux-2.4.20 cd /usr/src/linux-2.4.20 gunzip openMosix-2.4.20-2.gz patch -Np1 < openMosix-2.4.20-2 |
... CONFIG_MOSIX=y # CONFIG_MOSIX_TOPOLOGY is not set CONFIG_MOSIX_UDB=y # CONFIG_MOSIX_DEBUG is not set # CONFIG_MOSIX_CHEAT_MIGSELF is not set CONFIG_MOSIX_WEEEEEEEEE=y CONFIG_MOSIX_DIAG=y CONFIG_MOSIX_SECUREPORTS=y CONFIG_MOSIX_DISCLOSURE=3 CONFIG_QKERNEL_EXT=y CONFIG_MOSIX_DFSA=y CONFIG_MOSIX_FS=y CONFIG_MOSIX_PIPE_EXCEPTIONS=y CONFIG_QOS_JID=y ... |
make config | menuconfig | xconfig |
现在使用以下命令编译它
make dep bzImage modules modules_install |
重新启动后,您的 openMosix 集群节点就启动了!
在启动 openMosix 之前,必须有一个 /etc/openmosix.map 配置文件,该文件在每个节点上必须相同。
现在的标准是 /etc/openmosix.map,/etc/mosix.map 和 /etc/hpc.map 是旧标准,但工具的 CVS 版本是向后兼容的,并按顺序查找 /etc/openmosix.map、/etc/mosix.map 和 /etc/hpc.map。
openmosix.map 文件包含三个空格分隔的字段
openMosix-Node_ID IP-Address(or hostname) Range-size |
1 node1 1 2 node2 1 3 node3 1 4 node4 1 |
1 192.168.1.1 1 2 192.168.1.2 1 3 192.168.1.3 1 4 192.168.1.4 1 |
1 192.168.1.1 4 |
如果一个节点有多个网络接口,可以使用 range-size 字段中的 ALIAS 选项进行配置(相当于将 range-size 设置为 0),例如
1 192.168.1.1 1 2 192.168.1.2 1 3 192.168.1.3 1 4 192.168.1.4 1 4 192.168.10.10 ALIAS |
始终确保在集群的每个节点上运行相同的 openMosix 版本和配置!
在每个节点上使用 “setpe” 实用程序启动 openMosix
setpe -w -f /etc/openmosix.map |
或者,您可以获取 “openmosix” 脚本,该脚本可以在 userspace-tools 的 scripts 目录中找到,将其复制到 /etc/init.d 目录,chmod 0755 它,然后以 root 身份使用以下命令
/etc/init.d/openmosix stop /etc/init.d/openmosix start /etc/init.d/openmosix restart |
安装现已完成:集群已启动并运行 :)
首先,必须在内核配置中启用 CONFIG_MOSIX_FS 选项。如果当前内核在编译时未启用此选项,则需要重新编译并启用此选项。
此外,集群节点文件系统上的 UID(用户 ID)和 GID(组 ID)必须相同。您可能希望使用 openldap 来完成此操作。内核中的 CONFIG_MOSIX_DFSA 选项是可选的,但如果应使用 DFSA,则当然是必需的。要在集群上挂载 oMFS,每个节点的 /etc/fstab 中都必须有一个额外的 fstab 条目。
为了启用 DFSA
mfs_mnt /mfs mfs dfsa=1 0 0 |
mfs_mnt /mfs mfs dfsa=0 0 0 |
[device_name] [mount_point] mfs defaults 0 0 |
借助一些符号链接,所有集群节点都可以访问相同的数据,例如 node1 上的 /work
on node2 : ln -s /mfs/1/work /work on node3 : ln -s /mfs/1/work /work on node3 : ln -s /mfs/1/work /work ... |
以下特殊文件从 oMFS 中排除
/proc 目录
不是常规文件、目录或符号链接的特殊文件(例如 /dev/hda1)
创建像这样的链接
ln -s /mfs/1/mfs/1/usr |
ln -s /mfs/1/mfs/3/usr |
以下系统调用在未将迁移进程(在其主(远程)节点上执行此调用)返回其主节点的情况下得到支持
read, readv, write, writev, readahead, lseek, llseek, open, creat, close, dup, dup2, fcntl/fcntl64, getdents, getdents64, old_readdir, fsync, fdatasync, chdir, fchdir, getcwd, stat, stat64, newstat, lstat, lstat64, newlstat, fstat, fstat64, newfstat, access, truncate, truncate64, ftruncate, ftruncate64, chmod, chown, chown16, lchown, lchown16, fchmod, fchown, fchown16, utime, utimes, symlink, readlink, mkdir, rmdir, link, unlink, rename
以下是在 DFSA 挂载的文件系统上系统调用可能无法工作的情况
集群节点上不同的 mfs/dfsa 配置
如果第二个文件指针是非 DFSA,则 dup2
如果父目录是非 DFSA,则 chdir/fchdir
离开 DFSA 文件系统的路径名
当执行系统调用的进程正在被跟踪时
如果执行系统调用的进程有待处理的请求
除了 /mfs/1/ /mfs/2/ 等文件外,您还将找到一些其他目录。
表 4-1. 其他目录
/mfs/here | 您的进程当前运行的节点 |
/mfs/home | 您的主节点 |
/mfs/magic | “creat” 系统调用(或带有 “O_CREAT” 选项的 “open”)使用的当前节点 - 否则,上次成功创建 oMFS 魔术文件的节点(这对于创建临时文件,然后立即取消链接它们非常有用) |
/mfs/lastexec | 进程上次发出成功的 “execve” 系统调用的节点。 |
/mfs/selected | 您通过进程本身或其祖先之一(在 fork 此进程之前)选择的节点,将数字写入 “/proc/self/selected”。 |
请注意,这些魔术文件都是“每个进程”的。也就是说,它们的内容取决于哪个进程打开它们。
关于 openMFS 的最后一点说明是,有些版本在您在这些文件系统上运行 “df” 时会返回错误的结果。如果您突然在这些系统上拥有大约 1.3 TB 的可用空间,请不要感到惊讶。
如果您运行的是 RedHat 7.2、7.3 或 8.0 版本,这可能是您有史以来最简单的 *Mosix 安装。从 sourceforge 中选择合适的 openMosix RPM。它们有预编译的内核(在我写这篇文章时是 2.4.20),可以无缝工作:我已经在多台机器上测试过它们,包括带有 PCMCIA 卡的笔记本电脑和带有 SCSI 磁盘的服务器。如果您是 grub 用户,内核 rpm 甚至会修改您的 grub.conf。因此,您所要做的就是安装 2 个 RPM
rpm -Uvh openmosix-kernel-2.4.20-openmosix2.i686.rpm openmosix-tools-0.2.4-1.i386.rpm |
[root@oscar0 root]# more /etc/openmosix.map # openMosix CONFIGURATION # =================== # # Each line should contain 3 fields, mapping IP addresses to openMosix node-numbers: # 1) first openMosix node-number in range. # 2) IP address of the above node (or node-name from /etc/hosts). # 3) number of nodes in this range. # # Example: 10 machines with IP 192.168.1.50 - 192.168.1.59 # 1 192.168.1.50 10 # # openMosix-# IP number-of-nodes # ============================ 1 192.168.10.220 1 2 192.168.10.78 1 3 192.168.10.84 1 |
大多数 RedHat 安装都需要额外修复一件事。您经常会收到以下错误
[root@inspon root]# /etc/init.d/openmosix start Initializing openMosix... setpe: the supplied table is well-formatted, but my IP address (127.0.0.1) is not there! |
127.0.0.1 omosix1.localhost.org localhost |
192.168.10.78 omosix1.localhost.org 127.0.0.1 localhost |
[root@inspon root]# /etc/init.d/openmosix start Initializing openMosix... [root@inspon root]# /etc/init.d/openmosix status This is openMosix node #2 Network protocol: 2 (AF_INET) openMosix range 1-1 begins at 192.168.10.220 openMosix range 2-2 begins at inspon.localhost.be openMosix range 3-3 begins at 192.168.10.84 Total configured: 3 |
如果您想使用更前沿的补丁,您可以随时选择 src rpm 并在其上运行 rpmbuild --rebuild。这将为您安装源代码并创建一个初始配置文件。从那里,您可以进一步将补丁应用于 openMosix
有关如何构建您自己的 openMosix RPM 的教程可以在附录中找到。
随着新的 RedHat 版本的发布,它们可能会开箱即用得到支持,因此,请随时给作者留言,并帮助他保持此信息的更新。
虽然 RPM 是在基于 RedHat 的环境中构建的,但您可以在其他基于 RPM 的系统上使用它们中的大多数。
但是,Suse 将 /sbin/mk_initrd 作为指向 /sbin/mkinitrd 的链接,这使得 release 20-2 之前的 rpms 失败。较新版本应该对此进行了修复。
可以按照以下描述轻松地以 “Debian 方式” 安装 openMosix。
第一步是从网络下载软件包。由于 openMosix 补丁软件包在我写这篇文章时尚未提供 2.4.20 版本,因此我不得不使用 2.4.19 内核。由于我们正在使用 Debian 设置,因此我们需要:http://packages.debian.org/unstable/net/openmosix.html, http://packages.debian.org/unstable/net/kernel-patch-openmosix.html, http://packages.debian.org/unstable/misc/kernel-package.html, http://packages.debian.org/unstable/devel/kernel-source-2.4.19.html。您也可以使用 apt-get install 它们 ;)。
下一步是使内核支持 openMosix。
基本上,要遵循的步骤是
cd /usr/src apt-get install kernel-source-2.4.19 kernel-package \ openmosix kernel-patch-openmosix tar vxjf kernel-source-2.4.19.tar.bz2 ln -s /usr/src/kernel-source-2.4.19 /usr/src/linux cd /usr/src/linux ../kernel-patches/i386/apply/openmosix make menuconfig make-kpkg kernel_image modules_image cd .. dpkg -i kernel-image-*-openmosix-*.deb |
在使用此内核和配置的 /etc/openmosix.map 重新启动后,您应该拥有一个 openMosix 机器集群,这些机器相互通信并执行进程迁移。
您可以通过运行以下小脚本来测试
awk 'BEGIN {for(i=0;i<10000;i++)for(j=0;j<10000;j++);}' |
我们还在 Debian 机器上设置了 openMosixView
apt-get install openmosixview |
openMosixView 为您提供了一个友好的界面,显示不同机器的负载,并让您能够手动迁移进程。
有关 openMosixView 的详细讨论可以在本文档的其他地方找到。
自动发现守护进程 (omdiscd) 提供了一种自动配置 openMosix 集群的方法,从而消除了对 /etc/mosix.map 或类似手动配置的需求。自动发现使用多播数据包通知其他节点它是一个 openMosix 节点。这样,向您的 mosix 集群添加额外的节点意味着您只需在您的机器上启动 omdiscd,它就会加入集群。
但是,有一些小的要求,与任何 openMosix 集群一样,您需要正确配置网络。主要是路由。如果没有默认路由,您必须使用 -i 选项为 omdiscd 指定一个接口。否则,omdiscd 将退出并显示类似如下的错误。
Aug 31 20:41:49 localhost omdiscd[1290]: Unable to determine address of default interface. This may happen because there is no default route configured. Without a default route, an interface must be: Network is unreachable Aug 31 20:41:49 localhost omdiscd[1290]: Unable to initialize network. Exiting. |
[root@localhost log]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 eth0 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo 0.0.0.0 10.0.0.99 0.0.0.0 UG 0 0 0 eth0 |
omdiscd |
Sep 2 10:00:49 oscar0 kernel: openMosix configuration changed: This is openMosix #2780 (of 6 configured) Sep 2 10:00:49 oscar0 kernel: openMosix #2780 is at IP address 192.168.10.220 Sep 2 10:00:49 oscar0 kernel: openMosix #2638 is at IP address 192.168.10.78 Sep 2 10:00:49 oscar0 kernel: openMosix #2646 is at IP address 192.168.10.86 Sep 2 10:00:49 oscar0 kernel: openMosix #2627 is at IP address 192.168.10.67 Sep 2 10:00:49 oscar0 kernel: openMosix #2634 is at IP address 192.168.10.74 |
omdiscd 还有一些其他选项可以使用。您可以将 omdiscd 作为守护进程(默认)运行,也可以在前台运行,其中输出转到屏幕(标准输出)omdiscd -n。可以使用 -i 选项指定接口。
现在让我们简要了解一下另一个工具,它是 showmap。此工具将向您显示新自动生成的 openMosix 地图。
[root@oscar0 root]# showmap My Node-Id: 0x0adc Base Node-Id Address Count ------------ ---------------- ----- 0x0adc 192.168.10.220 1 0x0a4e 192.168.10.78 1 0x0a56 192.168.10.86 1 0x0a43 192.168.10.67 1 0x0a4a 192.168.10.74 1 |
自动发现还有一些此处未列出的其他功能,例如用于具有多个网络的集群的路由机制。更多详细信息可以在用户空间工具源代码树中的 README 和 DESIGN 文件中找到。
较新版本的 openMosix rc 脚本将首先验证是否存在 /etc/openmosix.map 文件或类似文件,然后再尝试使用自动配置。
如果您从源代码编译自动发现,您需要对 openmosix.c 进行小的修改。第一行之一将是
#define ALPHA |
% make clean % make |
但是,有时自动发现无法按您期望的方式工作,例如,节点可能看不到来自其他节点的多播流量。这种情况发生在某些 PCMCIA 以太网驱动程序上。一种解决方案是将接口置于混杂模式和/或多播模式,如下详述
Aug 31 20:45:58 localhost kernel: openMosix configuration changed: This is openMosix #98 (of 1 configured) Aug 31 20:45:58 localhost kernel: openMosix #98 is at IP address 10.0.0.98Aug 31 20:45:58 localhost omdiscd[1627]: Notified kernel to activate openMosix Aug 31 20:45:58 localhost kernel: Received an unauthorized information request from 10.0.0.99 |
ifconfig ethx promisc or ifconfig ethx multicast |
tcpdump -i eth0 ether multicast |
在某些 Layer 3 交换机上,可能需要其他配置。一位 openMosix 用户发现,在他的 Switch Summit48Si (Extreme Networks) 上,他必须运行
disable ipmcforwarding (to deactivate the routing of multicast paquets) disable igmp snooping |
Aug 31 22:14:43 inspon omdiscd[1422]: Simulated notification to activate openMosix [root@inspon root]# showmap My Node-Id: 0x0063 Base Node-Id Address Count ------------ ---------------- ----- 0x0063 10.0.0.99 1 [root@inspon root]# /etc/init.d/openmosix status OpenMosix is currently disabled [root@inspon root]# |
#define ALPHA |
我还注意到自动发现不适用于基于 FireWire 的网卡。
PlumpOS 是一个基于 CD 的 GNU/Linux/openMosix 迷你发行版,旨在允许用户快速或临时地向 openMosix 集群添加节点;在我 2003 年 3 月写这篇文章时,版本(release 6.9 RC1)是一个 16.7M ISO 下载。
本章是 Peter Willis 对 Jean-David Marrow(他是 Clump/OS 的作者和 PlumpOS 的灵感来源 - 向 Jean-David 致敬,感谢他在已消失的 Clump/OS 上的出色工作)贡献的非常相似的章节的快速修改。
首先,设置您机器的 BIOS 以使其从 CD 启动。查看您主板的手册,了解如何设置此项。启动后,您将收到一个提示,使用特定内核启动 PlumpOS;已为您提供多个内核,但您也可以选择提供您自己的内核 + 模块。这将在后面的 “入门” 部分中解释。启动菜单应告诉您所有可用的内核供您使用;只需键入其中一个的名称(以及可选的一些内核参数)并按回车/Enter 键。
在启动时,PlumpOS 将自动探测网卡,如果检测到任何网卡,它将尝试通过 DHCP 配置它们。如果成功,它将在收到 DHCP 租约的每个接口上启动 omdiscd。目前,这仅在具有 1 个网卡的 PC 中进行了测试,因此 YMMV。
它对我自己有效,但可能对您无效;如果您遇到困难,请在您调查问题后,尽可能多地通过电子邮件发送有关您系统的信息给我。(查看 sourceforge 主页上的 PlumpOS 邮件列表,注册并发布您的问题,并尽可能提供详细信息。openMosix-general 和 openMosix-devel 列表不是用于 PlumpOS 问题,它们用于 openMosix 特定问题,如果您无法区分,只需将其发送到 PlumpOS 列表或我的联系电子邮件)。
由于 PlumpOS 的目的是向集群添加节点,因此假定您已经有一个正在运行的 openMosix 集群 - 或者可能只有一个 openMosix 节点 - 您将从中启动作业。集群中的所有机器都必须符合以下要求
PlumpOS 机器 (586+ CPU)
可启动的 CD-ROM 驱动器
网卡
介于 32M 和 128M 的 RAM。由于在编写本文时 openMosix 内核中的一些怪异之处,简单地传递 ramdisk 的大小不起作用,因此必须实际使用为特定大小预先制作的 ramdisk。在 PlumpOS 镜像中应该有几个可用的 ramdisk,它们可以放置在实际 cdrom ISO 的 disks 根目录中(如果您的目录在 PlumpOS 软件包目录中,则为 rootdisk/disks/)。
主机器 (GNU/Linux/openMosix 内核(与您在子/从 PlumpOS 机器上启动的所有 PlumpOS 内核的版本相同))
网络环境(运行 DHCP 服务器(如果您不运行或不想运行 DHCP,您仍然可以手动配置您的系统:只需转到每台 PlumpOS 机器,并使用提供的网络工具输入您想要的配置信息。强烈建议使用 DHCP,并且从长远来看,它将大大简化您的生活。)
以下网络模块存在于大多数(如果不是全部)提供的内核模块 tarball 中(在 /kernels/KERNELNAME/modules.tgz 中),尽管并非所有模块都支持自动探测;如果您在此列表中看不到对您的网卡的支持,则 PlumpOS 将不适用于您。
3c501.o, 3c503.o, 3c505.o, 3c507.o, 3c509.o, 3c515.o, 3c59x.o, 8139cp.o, 8139too.o, 82596.o, ac3200.o, acenic.o, aironet4500_card.o, aironet4500_core.o, aironet4500_proc.o, arlan-proc.o, arlan.o, at1700.o, bsd_comp.o, cs89x0.o, de4x5.o, depca.o, dgrs.o, dl2k.o, dmfe.o, dummy.o, e100/e100.o, e1000/e1000.o, e2100.o, eepro.o, eepro100.o, eexpress.o, epic100.o, eth16i.o, ewrk3.o, fealnx.o, hamachi.o, hp-plus.o, hp.o, hp100.o, lance.o, lp486e.o, mii.o, natsemi.o, ne.o, ne2k-pci.o, ni5010.o, ni52.o, ni65.o, ns83820.o, pcmcia, pcnet32.o, ppp_async.o, ppp_deflate.o, ppp_generic.o, ppp_synctty.o, pppoe.o, pppox.o, sis900.o, sk98lin/sk98lin.o, slhc.o, smc-ultra.o, smc9194.o, starfire.o, strip.o, sundance.o, sungem.o, sunhme.o, tc35815.o, tg3.o, tlan.o, tokenring/{3c359.o abyss.o ibmtr.o lanstreamer.o olympic.o smctr.o tms380tr.o tmsisa.o tmspci.o}, tulip/tulip.o, via-rhine.o, wavelan.o, wd.o, winbond-840.o, wireless/{airo.o airo_cs.o hermes.o orinoco.o orinoco_cs.o orinoco_pci.o orinoco_plx.o}, yellowfin.o
另请注意,PlumpOS 可能无法在笔记本电脑上运行:它肯定不支持 PCMCIA 卡(尚未),并且如果您的机器包含多个连接的以太网适配器,则可能无法正确配置 openMosix。这是配置脚本的临时限制,应在未来的版本中解决。
您可以根据 GPL 条款,从任何 PlumpOS 镜像下载最新的 PlumpOS 软件包,不提供任何形式的保证。下载后,解压缩存档
$ tar -xvzf plumpos-6.9-rc1.tar.gz |
首先,让我们熟悉这里的目录结构。应该有 3 个目录
rootdisk,其中包含要创建的 iso 的布局;
scripts,其中包含用于帮助创建 iso 的小程序;
final,其中将包含由整个过程生成的 ISO。
如果您打算将自己的内核与 PlumpOS 一起使用,则必须遵循几个步骤才能使其正确启动。首先,您必须在 rootdisk/kernels/ 目录中创建一个新目录,该目录将采用旧的且经常被指责的 DoS 8.3 字符格式,并且仅包含字母和数字(以及单个 '.')。在该目录中,您应该放置一个名为 bzImage 的文件,这是您的内核,以及一个名为 modules.tgz 的文件,这是您的内核模块的 gzipped tarball(具有 lib/modules/ 的相对路径,以便可以从根目录中提取)。(可选)您还可以为您的内核提供 System.map 和 config 文件。完成此操作后,您可以简单地运行 install 程序,它将检测并安装您的内核,以便与生成的 ISO 一起使用。
现在,假设您要包含第三方附加软件包。这非常简单:创建一个 gzipped tarball,其中包含您要包含在软件包中的所有文件(相对于 “/”),并将这些软件包放入 rootdisk/packages/ 目录中。然后编辑文件 rootdisk/packages/list,并添加软件包可以位于的 ramdisk 上相对于 / 的路径(换句话说,对于名为 “openssl.tar.gz” 的软件包,将行 “/cdrom/packages/openssl.tar.gz” 添加到文件 rootdisk/packages/list)。(可选)您可以使用诸如 “cdrom:openssl.tar.gz” 之类的行,它将自动在 cdrom 的 packages 目录中搜索软件包 “openssl.tar.gz”。在未来的版本中,这将对 nfs 和启动软盘等功能有用,所以现在不用担心它 ;)
在撰写本文时(2003 年 5 月),DSH 的最新版本可从 http://www.netfort.gr.jp/~dancer/software/downloads/ 获得。有关该软件包的更多信息,请访问 http://www.netfort.gr.jp/~dancer/software/dsh.html。可供下载的最新版本是 0.23.6。您将需要 libdshconfig-0.20.8.tar.gz 和 dsh-0.23.5.tar.gz。首先安装 libdshconfig
./configure make make install |
假设我们有一个包含几个节点的小型集群。为了简化操作,我们希望只键入一次命令,但使其在每个节点上执行。然后,您必须在 $HOME/.dsh/group/clusterwname 中创建一个文件,其中列出您的集群的 IP。例如。
[root@inspon root]# cat .dsh/group/mosix 192.168.10.220 192.168.10.84 |
[root@inspon root]# dsh -r ssh -g mosix ls 192.168.10.84: anaconda-ks.cfg 192.168.10.84: id_rsa.pub 192.168.10.84: install.log 192.168.10.84: install.log.syslog 192.168.10.84: openmosix-kernel-2.4.17-openmosix1.i686.rpm 192.168.10.84: openmosix-tools-0.2.0-1.i386.rpm 192.168.10.220: anaconda-ks.cfg 192.168.10.220: id_dsa.pub 192.168.10.220: id_rsa.pub 192.168.10.220: openmosix-kernel-2.4.17-openmosix1.i686.rpm 192.168.10.220: openmosix-tools-0.2.0-1.i386.rpm 192.168.10.220: oscar-1.2.1rh72 192.168.10.220: oscar-1.2.1rh72.tar.gz |
[root@inspon root]# dsh -r ssh -g mosix "uname -a" 192.168.10.84: Linux omosix2.office.be.stone-it.com 2.4.17-openmosix1 #1 Wed May 29 14:32:28 CEST 2002 i686 unknown 192.168.10.220: Linux oscar0 2.4.17-openmosix1 #1 Wed May 29 14:32:28 CEST 2002 i686 unknown |
[root@inspon root]# dsh -r ssh -g mosix -c -- uname -a 192.168.10.220: Linux oscar0 2.4.17-openmosix1 #1 Wed May 29 14:32:28 CEST 2002 i686 unknown 192.168.10.84: Linux omosix2.office.be.stone-it.com 2.4.17-openmosix1 #1 Wed May 29 14:32:28 CEST 2002 i686 unknown |
openMosix 为 HPC 应用程序提供了进程迁移的优势。管理员可以使用 openMosix-user-space-tools 或 /proc/hpc 接口配置和调整 openMosix 集群,现在将详细描述 /proc/hpc 接口。
在 openMosix 2.4.16 版本之前,/proc 接口名为 /proc/mosix!在 openMosix 2.4.17 版本之前,它名为 /proc/hpc。
/proc/hpc/admin 目录中的平面文件中的值表示集群的当前配置。管理员也可以将自己的值写入这些文件,以在运行时更改配置,例如
表 8-1. 更改 /proc/hpc 参数
echo 1 > /proc/hpc/admin/block | 阻止远程进程的到达 |
echo 1 > /proc/hpc/admin/bring | 将所有迁移的进程带回家 |
...
表 8-2. /proc/hpc/admin/
(二进制文件) | config | 主配置文件(由 setpe 实用程序写入) |
(平面文件) | block | 允许/禁止远程进程的到达 |
bring | 将所有迁移的进程带回家 | |
dfsalinks | 当前符号 dfsa 链接的列表 | |
expel | 将访客进程送回家 | |
gateways | 网关的最大数量 | |
lstay | 本地进程应保留 | |
mospe | 包含 openMosix 节点 ID | |
nomfs | 禁用/启用 MFS | |
overheads | 用于调优 | |
quiet | 停止收集负载均衡信息 | |
decay-interval | 收集有关负载均衡的信息的间隔 | |
slow-decay | 默认 975 | |
fast-decay | 默认 926 | |
speed | 相对于 PIII/1GHz 的速度) | |
stay | 启用/禁用自动进程迁移 |
表 8-3. 将 1 写入以下文件 /proc/hpc/decay/
clear | 清除衰减统计信息 |
cpujob | 告诉 openMosix 该进程是 CPU 密集型的 |
iojob | 告诉 openMosix 该进程是 IO 密集型的 |
slow | 告诉 openMosix 缓慢衰减其统计信息 |
fast | 告诉 openMosix 快速衰减其统计信息 |
表 8-4. 有关其他节点的信息
/proc/hpc/nodes/[openMosix_ID]/CPUs | 节点有多少个 CPU |
/proc/hpc/nodes/[openMosix_ID]/load | 此节点的 openMosix 负载 |
/proc/hpc/nodes/[openMosix_ID]/mem | openMosix 认为的可用内存 |
/proc/hpc/nodes/[openMosix_ID]/rmem | Linux 认为的可用内存 |
/proc/hpc/nodes/[openMosix_ID]/speed | 节点相对于 PIII/1GHz 的速度 |
/proc/hpc/nodes/[openMosix_ID]/status | 节点的状态 |
/proc/hpc/nodes/[openMosix_ID]/tmem | 可用内存 |
/proc/hpc/nodes/[openMosix_ID]/util | 节点的利用率 |
表 8-5. 有关本地进程的其他信息
/proc/[PID]/cantmove | 进程无法迁移的原因 |
/proc/[PID]/goto | 进程应迁移到哪个节点 |
/proc/[PID]/lock | 进程是否锁定到其主节点 |
/proc/[PID]/nmigs | 进程迁移了多少次 |
/proc/[PID]/where | 进程当前正在哪个节点上计算 |
/proc/[PID]/migrate | 与 goto 远程进程相同 |
/proc/hpc/remote/from | 进程的主节点 |
/proc/hpc/remote/identity | 有关进程的其他信息 |
/proc/hpc/remote/statm | 进程的内存统计信息 |
/proc/hpc/remote/stats | 进程的 CPU 统计信息 |
以下工具为 openMosix 集群提供简单的管理。
migrate -send a migrate request to a process syntax: migrate [PID] [openMosix_ID] |
mon -is a ncurses-based terminal monitor several informations about the current status are displayed in bar-charts |
mosctl -is the openMosix main configuration utility syntax: mosctl [stay|nostay] [lstay|nolstay] [block|noblock] [quiet|noquiet] [nomfs|mfs] [expel|bring] [gettune|getyard|getdecay] mosctl whois [openMosix_ID|IP-address|hostname] mosctl [getload|getspeed|status|isup|getmem|getfree|getutil] [openMosix_ID] mosctl setyard [Processor-Type|openMosix_ID||this] mosctl setspeed interger-value mosctl setdecay interval [slow fast] |
表 8-6. 更详细的
stay | no automatic process migration |
nostay | automatic process migration (default) |
lstay | 本地进程应保留 |
nolstay | 本地进程可以迁移 |
block | 阻止访客进程到达 |
noblock | 允许访客进程到达 |
quiet | 禁用负载均衡信息的收集 |
noquiet | 启用负载均衡信息的收集 |
nomfs | 禁用 MFS |
mfs | 启用 MFS |
expel | 发送走访客进程 |
bring | 将所有迁移的进程带回家 |
gettune | 显示当前的开销参数 |
getyard | 显示当前使用的 Yardstick 值 |
getdecay | 显示当前的衰减参数 |
whois | 解析集群的 openMosix-ID、IP 地址和主机名 |
getload | 显示 (openMosix-) 负载 |
getspeed | 显示 (openMosix-) 速度 |
status | 显示当前状态和配置 |
isup | 节点是否启动 (openMosix 类型的 ping) |
getmem | 显示逻辑空闲内存 |
getfree | 显示物理空闲内存 |
getutil | 显示利用率 |
setyard | 设置新的 Yardstick 值 |
setspeed | 设置新的 (openMosix-) 速度值 |
setdecay | 设置新的衰减间隔 |
mosrun -run a special configured command on a chosen node syntax: mosrun [-h|openMosix_ID| list_of_openMosix_IDs] command [arguments] |
mosrun 命令可以使用更多命令行选项执行。为了简化操作,有几个预配置的运行脚本,用于使用特殊的 (openMosix) 配置执行作业。
表 8-7. mosrun 的额外选项
nomig | 运行一个命令,其进程不会迁移 |
runhome | 执行锁定到其宿主节点的命令 |
runon | 运行一个命令,该命令将被直接迁移并锁定到一个节点 |
cpujob | 告知 openMosix 集群这是一个 CPU 密集型进程 |
iojob | 告知 openMosix 集群这是一个 IO 密集型进程 |
nodecay | 执行一个命令,并告知集群不要刷新负载均衡统计信息 |
slowdecay | 执行一个命令,并使用慢衰减间隔收集负载均衡统计信息 |
fastdecay | 执行一个命令,并使用快衰减间隔收集负载均衡统计信息 |
setpe -manual node configuration utility syntax: setpe -w -f [hpc_map] setpe -r [-f [hpc_map]] setpe -off -w reads the openMosix configuration from a file (typically /etc/hpc.map) -r writes the current openMosix configuration to a file (typically /etc/hpc.map) -off turns the current openMosix configuration off |
tune openMosix calibration and optimizations utility. (for further informations review the tune-man page) |
除了 /proc 接口和命令行 openMosix 实用程序(它们使用 /proc 接口)之外,还有一个修补过的 "ps" 和 "top" 可用(它们被称为 "mps" 和 "mtop"),它们还在列中显示 openMosix 节点 ID。这对于找出特定进程当前正在哪个节点上计算非常有用。
这实际上总结了命令行工具,但请查看 openMosixview,它是一个用于最常见管理任务的 GUI,将在以后的章节中讨论。
(作者:Moshe Bar)
一些人要求在 openMosix 中添加一个功能,该功能允许指定给定的进程及其子进程可以迁移到哪些节点,以及不能迁移到哪些节点。
Simone Ettore 刚刚向 CVS 提交了一个新的补丁,它允许你做到这一点。
以下是其工作原理
/proc/[pid]/migfilter 启用/禁用迁移过滤功能。
/proc/[pid]/mignodes 是节点的位列表。节点的位位置计算为 2^(PE-1)。PE 是节点号。
/proc/[pid]/migpolicy 是过滤策略:0=DENY:进程可以在所有节点中迁移,除非 mignodes 上的相对位为 1;1=ALLOW:进程可以在 mignodes 上的相对位为 1 的所有节点中迁移。
我们很快将发布一个简单的用户态工具来设置节点掩码,但我希望你们能在我们将其作为 openMosix 2.4.20-3 发布之前尽快试用它。
尽管 openMosix 架构本身不需要主节点,但您可能希望拥有一个头节点,您可以在其中启动进程,这可能是一个多宿主节点,用户可以从中登录到您的集群。您希望配置您的机器以使进程迁移出去
您必须欺骗节点,使其认为它是周围最慢的节点,最好将其所有进程迁移到更快的节点。
您必须使用以下命令使其 “变慢”:
mosctl setspeed [n] |
mosctl getspeed |
编者评论:需要使用 openMosix 版本进行检查
以 root 身份登录到普通终端。输入
setpe -r |
setpe -w -f /etc/mosix.map |
cat /proc/$$/lock |
echo 0 > /proc/$$/lock |
init 1 |
/etc/init.d/network start /etc/init.d/mosix start echo 1 > /proc/mosix/admin/quiet |
/etc/init.d/pcmcia start |
贡献者:Evan Hisey
通道绑定实际上非常容易。这可能解释了为什么关于这个主题的文档很少。绑定网络对于应用程序来说就像一个普通网络。子网上的所有机器都必须以相同的方式绑定。绑定和非绑定机器彼此之间不能很好地通信。
通道绑定至少需要两个物理子网,但可以更多(目前我有一个三绑定集群)。要启用绑定,您需要将通道绑定内核代码编译到内核中或作为模块 (bonding.o) 编译,从 2.4.x 开始,它是内核的标准选项。网卡的设置与正常情况相同,但您仅使用 'ifconfig' 初始化绑定的第一张卡。“ifenslave” 用于初始化绑定连接中的其余卡。“ifenslave” 可以位于 linux/Documentation/network/ 目录中。它需要编译,因为它是一个 .c 文件。使用的基本格式是
ifenslave <master> <slave1> <slave2> ... |
openMosixview 是 Mosixview 的下一个版本和完全重写版本。它是一个用于 openMosix 集群的集群管理 GUI,欢迎所有人下载和使用它(风险和责任自负)。openMosixview 套件包含 5 个有用的应用程序,用于监视和管理 openMosix 集群。
openMosixview 主要的监视+管理应用程序 |
openMosixprocs 用于管理进程的进程框 |
openMosixcollector 收集守护程序,记录集群+节点信息 |
openMosixanalyzer 用于分析 openMosixcollector 收集的数据 |
openMosixhistory 集群的进程历史记录 |
所有部分都可以从主应用程序窗口访问。只需单击几下鼠标即可执行最常用的 openMosix 命令。高级执行对话框有助于在集群上启动应用程序。“优先级滑块” 简化了每个节点的手动和自动负载均衡。openMosixview 现在已适应 openMosix 自动发现,并从 openMosix /proc 接口获取所有配置值。
openMosixview 完全专为 openMosix 集群设计。Mosixview 网站(和所有镜像站点)将保持不变,但所有进一步的开发将继续在位于新域名 www.openmosixview.com 的 openMosixview 上进行
如果您有:问题、想要的功能、安装过程中遇到的问题、意见、经验交流等,请随时给我、Matt Rechenburg 发送邮件,或订阅 openMosix/Mosixview 邮件列表并发送邮件至 openMosix/Mosixview 邮件列表
更改:(与 Mosixview 1.1 相比) openMosixview 是 Mosixview 的完全重写版本,从头开始编写!它具有相同的功能,但 openMosixview 源代码的所有部分都发生了根本性的变化。它已在不断变化的集群拓扑结构(openMosix 自动发现的要求)下进行了测试。所有 “错误” 部分都已删除或重写,现在它(应该;)运行得更加稳定。
适应了 openMosix 自动发现 |
不再使用 /etc/mosix.map 或任何集群映射文件 |
移除了(有错误的)映射文件解析器 |
将所有部分/函数/方法重写为更清晰的 c++ 接口 |
修复了显示中的一些较小错误 |
用 openMosixanalyzer 替换了 MosixMem+Load |
... 更多更改 |
要求
QT 库 |
root 权限! |
到所有集群节点的 rlogin 和 rsh(或 ssh)无需密码。openMosix 用户态工具 mosctl、migrate、runon、iojob、cpujob ...(从 www.openmosix.org 网站下载它们) |
关于 openMosixview 的文档 每个软件包中都包含关于 openMosixview 的完整 HTML 文档。您可以在 openMosixview 安装目录中找到文档的起始页:openmosixview/openmosixview/docs/en/index.html
RPM 软件包的安装目录位于:/usr/local/openmosixview
下载最新版本的 openMosixview rpm 软件包。然后只需执行,例如
rpm -i openmosixview-1.4.rpm |
rpm -e openmosixview |
下载最新版本的 openMosixview,解压缩并解 tar 源代码,并将 tarball 复制到例如 /usr/local/。
gunzip openmosixview-1.4.tar.gz tar -xvf openmosixview-1.4.tar |
将 QTDIR 变量设置为您的实际 QT 发行版,例如
export QTDIR=/usr/lib/qt-2.3.0 (for bash) or setenv QTDIR /usr/lib/qt-2.3.0 (for csh) |
(来自在不同 linux 发行版上编译 openMosixview/Mosixview 的测试人员,再次感谢)创建指向您的 QT-2.3.x 安装的链接 /usr/lib/qt,例如,如果 QT-2.3.x 安装在 /usr/local/qt-2.3.0 中
ln -s /usr/local/qt-2.3.0 /usr/lib/qt |
export QTDIR=/usr/lib/qt (for bash) or setenv QTDIR /usr/lib/qt (for csh) |
./configure make |
cp openmosixview/openmosixview /usr/bin cp openmosixviewproc/openmosixviewprocs/mosixviewprocs /usr/bin cp openmosixcollector/openmosixcollector/openmosixcollector /usr/bin cp openmosixanalyzer/openmosixanalyzer/openmosixanalyzer /usr/bin cp openmosixhistory/openmosixhistory/openmosixhistory /usr/bin |
cp openmosixcollector/openmosixcollector.init /etc/init.d/openmosixcollector or cp openmosixcollector/openmosixcollector.init /etc/rc.d/init.d/openmosixcollector |
rcp openmosixprocs/openmosixprocs your_node:/usr/bin/openmosixprocs |
openmosixview |
这是主应用程序窗口的图片。功能将在下面解释。
openMosixview 为每个集群成员显示一行,其中包含一个指示灯、一个按钮、一个滑块、一个 lcd 数字、两个进度条和一些标签。左侧的指示灯显示 openMosix-Id 和集群节点的状态。红色表示关闭,绿色表示可用。
如果您单击显示一个节点 IP 地址的按钮,将弹出一个配置对话框。它显示用于执行最常用的 “mosctl” 命令的按钮。(稍后在本 HOWTO 中描述) 使用 “速度滑块”,您可以为每个主机设置 openMosix 速度。当前速度由 lcd 数字显示。
您可以通过更改这些值来影响整个集群的负载均衡。openMosix 集群中的进程更容易迁移到 openMosix 速度更高的节点,而不是速度较低的节点。当然,您可以设置的速度不是物理速度,而是 openMosix “认为” 节点具有的速度。例如,集群节点上一个 CPU 密集型作业,其速度设置为整个集群的最低值,将寻找更好的处理器来运行并轻松迁移出去。
中间的进度条提供了每个集群成员负载的概览。它以百分比显示,因此它并不完全代表写入文件 /proc/hpc/nodes/x/load(由 openMosix)的负载,但它应该提供一个概览。
下一个进度条用于节点的已用内存。它显示主机上可用内存的百分比形式的当前已用内存(右侧的标签显示可用内存)。您的集群拥有多少个 CPU 写在右侧的框中。主窗口的第一行包含一个用于 “所有节点” 的配置按钮。您可以通过此选项类似地配置集群中的所有节点。
负载均衡效果如何由左上角的进度条显示。100% 非常好,表示所有节点的负载几乎相同。
使用收集器和分析器菜单来管理 openMosixcollector 并打开 openMosixanalyzer。openMosixview 应用程序套件的这两个部分对于长期了解集群的概览非常有用。
如果单击 “集群节点” 按钮,将弹出此对话框。
现在可以轻松更改每个主机的 openMosix 配置。所有命令都将通过 “rsh” 或 “ssh” 在远程主机上执行(即使在本地节点上也是如此),因此 “root” 必须 “rsh”(或 “ssh”)到集群中的每个主机,而无需提示输入密码(在 Beowulf 文档或本页的 HOWTO 中很好地描述了如何配置它)。
命令是
automigration on/off quiet yes/no bring/lstay yes/no exspel yes/no openMosix start/stop |
如果您从远程工作站登录到您的集群,请在 “远程进程框” 下面的编辑框中插入您的本地主机名。然后 openMosixprocs 将显示在您的工作站上,而不是您登录的集群成员上。(您可能需要在您的工作站上设置 “xhost +clusternode”)。组合框中有一个历史记录,因此您只需编写一次主机名。
如果您想在集群上启动作业,“高级执行” 对话框可能会对您有所帮助。
使用 “运行程序” 按钮(文件打开图标)选择要启动的程序,您可以通过此执行对话框指定作业的启动方式和位置。有几个选项需要解释。
此进程框对于管理在集群上运行的进程非常有用。
进程列表概述了正在运行的位置。第二列显示每个进程的 openMosix 节点 ID。0 表示本地,所有其他值都是远程节点。迁移的进程标记为绿色图标,不可移动的进程有一个锁。
通过双击列表中的进程,将弹出迁移器窗口,用于管理例如迁移进程。还有一些选项可以迁移远程进程、向其发送 SIGSTOP 和 SIGCONT 或 “renice”。
如果您单击 “从远程管理进程” 按钮,将弹出一个新窗口(远程进程窗口),显示当前迁移到此主机的进程。
如果单击进程框中的进程,将弹出此对话框。
openMosixview 迁移器窗口显示您的 openMosix 集群中的所有节点。此窗口用于管理一个进程(带有附加状态信息)。通过双击列表中的主机,进程将迁移到此主机。片刻之后,托管进程的进程图标将变为绿色,这意味着它正在远程运行。
“宿主” 按钮将进程发送到其宿主节点。“最佳” 按钮将进程发送到集群中最佳可用节点。此迁移受负载、速度、CPU 以及 openMosix 对每个节点的 “想法” 的影响。它可能会迁移到具有最多 CPU 和/或最佳速度的主机。使用 “杀死” 按钮,您可以立即杀死该进程。
要暂停程序,只需单击 “SIGSTOP” 按钮,要继续,请单击 “SIGCONT” 按钮。使用下面的 renice 滑块,您可以重新调整当前托管进程的优先级(-20 表示非常快,0 表示正常,20 表示非常慢)
openMosixcollector 是一个守护程序,应该/可以启动在一个集群成员上。它将每个节点的 openMosix 负载记录到目录 /tmp/openmosixcollector/*。这些历史记录日志文件由 openMosixanalyzer(如下所述)分析,可以提供集群中负载、内存和进程的持续概览。有一个主日志文件名为 /tmp/openmosixcollector/cluster。除此之外,此目录中还有其他文件,数据将写入其中。
在启动时,openMosixcollector 将其 PID(进程 ID)写入 /var/run/openMosixcollector.pid
openMosixcollector 守护程序每 12 小时重启一次,并将当前历史记录保存到 /tmp/openmosixcollector[date]/*。这些备份是自动完成的,但您也可以手动触发此操作。
有一个选项可以将检查点写入历史记录。如果您使用 openMosixanalyzer 分析历史记录日志文件,这些检查点将以蓝色垂直线图形化标记。例如,您可以在集群上启动作业时设置一个检查点,并在结束时设置另一个检查点。
以下是可能的命令行参数的说明
openmosixcollector -d //starts the collector as a daemon openmosixcollector -k //stops the collector openmosixcollector -n //writes a checkpoint to the history openmosixcollector -r //saves the current history and starts a new one openmosixcollector //print out a short help |
您可以使用 /etc/init.d 或 /etc/rc.d/init.d 中的 init 脚本启动此守护程序。您只需创建一个指向其中一个运行级别的符号链接即可实现自动启动。
如何分析创建的日志文件在 openMosixanalyzer 部分中描述。
此图片显示了 openMosixanalyzer 中的图形化负载概览(单击放大)
使用 openMosixanalyzer,您可以获得集群的持续 openMosix 历史记录。openMosixcollector 创建的历史记录日志文件以图形方式显示,以便您可以长期了解集群上发生的事情和正在发生的事情。openMosixanalyzer 可以分析当前的 “在线” 日志文件,但您也可以通过文件菜单打开 openMosixcollector 历史记录日志的旧备份。日志文件位于 /tmp/openmosixcollector/*(备份位于 /tmp/openmosixcollector[date]/*),您只需打开主历史记录文件 “cluster” 即可查看旧的负载信息。(备份目录中日志文件的 [date] 是历史记录保存的日期) 开始时间显示在顶部,您可以在 openMosixanalyzer 中获得全天视图 (12 小时)。
如果您使用 openMosixanalyzer 查看 “在线” 日志文件(当前历史记录),您可以启用 “刷新” 复选框,视图将自动刷新。
负载线通常是黑色的。如果负载增加到 >75,则线条将绘制为红色。这些值是 openMosix 信息。openMosixanalyzer 从文件 /proc/hpc/nodes/[openMosix ID]/* 获取这些信息
每个节点的 “查找” 按钮都会计算几个有用的统计值。单击它将打开一个小的新窗口,您可以在其中获得平均负载和内存值,以及有关特定节点或整个集群的更多静态和动态信息。
此图片显示了 openMosixanalyzer 中的图形化内存概览
使用 openMosixanalyzer 中的内存概览,您可以获得类似于负载概览的持续内存历史记录。openMosixcollector 创建的历史记录日志文件以图形方式显示,以便您可以长期了解集群上发生的事情和正在发生的事情。它可以分析当前的 “在线” 日志文件,但您也可以通过文件菜单打开 openMosixcollector 历史记录日志的旧备份。
显示的值是 openMosix 信息。openMosixanalyzer 从文件获取这些信息
/proc/hpc/nodes/[openMosix-ID]/mem. /proc/hpc/nodes/[openMosix-ID]/rmem. /proc/hpc/nodes/[openMosix-ID]/tmem. |
如果 openMosixcollector 将检查点写入内存历史记录,它们将显示为蓝色垂直线。
显示过去的进程列表
openMosixhistory 详细概述了哪个进程在哪个节点上运行。openMosixcollector 保存启动收集器的主机上的进程列表,您可以使用 openMosixhistory 浏览此日志数据。您可以通过 openMosixhistory 中的时间滑块轻松更改浏览时间。
openMosixhistory 可以分析当前的 “在线” 日志文件,但您也可以通过文件菜单打开 openMosixcollector 历史记录日志的旧备份。
日志文件位于 /tmp/openmosixcollector/*(备份位于 /tmp/openmosixcollector[date]/*),您只需打开主历史记录文件 “cluster” 即可查看旧的负载信息。(备份目录中日志文件的 [date] 是历史记录保存的日期) 开始时间显示在左上角,您可以在 openMosixhistory 中获得 12 小时的视图。
首先,需要 QT >= 2.3.x。必须将 QTDIR 环境变量设置为您的 QT 安装目录,就像 INSTALL 文件中很好地描述的那样。在版本 < 0.6 中,您可以执行 “make clean” 并删除两个文件:/openmosixview/Makefile /openmosixview/config.cache 并尝试再次编译,因为我总是将二进制文件和目标文件留在旧版本中。如果您有任何其他问题,请将其发布到 openMosixview 邮件列表(或直接发送给我)。
是的,在 0.7 版本之前,有内置的 SSH 支持。您必须能够 ssh 到集群中的每个节点而无需密码(就像使用 RSH 一样,这是必需的)
不要使用 & 在后台派生 openMosixview(例如 openMosixview &)。也许您无法以 root 用户身份 rsh/ssh(取决于您要使用的内容)到每个节点而无需密码?以 root 身份尝试 “rsh hostname”。您不应被提示输入密码,但很快就会获得登录 shell。(如果您使用 SSH,请以 root 身份尝试 “ssh hostname”。) 您必须是集群上的 root 用户,因为这是 openMosixview 执行的管理命令需要 root 权限的唯一方法。openMosixview 默认使用 “rsh”!如果您只在集群上安装了 “ssh”,请编辑(或创建)文件 /root/.openMosixview 并在其中放入 “1111”。这是 openMosixview 的主配置文件,最后一个 “1” 代表 “使用 ssh 而不是 rsh”。这将导致 openMosixview 即使在首次启动时也使用 “ssh”。
openMosixview 客户端通过 rsh(或 ssh,您可以使用复选框配置)在远程主机上执行。它必须安装在每个节点的 /usr/bin/ 中。如果您使用 RSH,请尝试:“xhost +hostname” “rsh hostname /usr/bin/openMosixview_client -display your_local_host_name:0.0” 或者如果您使用 SSH,请尝试:“xhost +hostname” “ssh hostname /usr/bin/openMosixview_client -display your_local_host_name:0.0” 如果这有效,它也将在 openMosixview 中工作。openMosixview 崩溃并出现 “段错误”!也许您仍然使用旧版本的 openMosixview/Mosixview?在 mosix.map 解析器中(在 openMosixview 中已完全删除!!)(openMosixview 1.2 和 Mosixview > 1.0 版本是稳定的)
(本 HowTo 适用于 SSH2) 您每天都可以在报纸上看到您应该使用 SSH 而不是 RSH 的原因,因为另一个脚本小子黑客攻击了一个不安全的系统/网络。因此,SSH 始终是一个不错的选择。
freedom x security = constant (from a security newsgroup) |
首先,远程站点需要运行安全的 shell 守护程序。如果尚未安装,请安装它!(rpm -i [来自您的 linux 发行版 CD 的 sshd_rpm_packeage_from_your_linux_distribution_cd])如果它尚未运行,请使用以下命令启动它
/etc/init.d/ssh start |
ssh-keygen |
/root/.ssh/identity //your private key and /root/.ssh/identity.pub //your public key |
如果您现在 ssh 到此远程主机,您将被提示输入您的公钥密码。输入正确的密码应该会让您登录。
现在有什么优势呢???密码通常比普通密码长得多!
您可以使用 ssh-agent 获得的优势。它在 ssh 登录期间管理密码。
ssh-agent |
echo $SSH_AUTH_SOCK and echo $SSH_AGENT_PID |
SSH_AUTH_SOCK=/tmp/ssh-XXYqbMRe/agent.1065 export SSH_AUTH_SOCK SSH_AGENT_PID=1066 export SSH_AGENT_PID |
setenv SSH_AUTH_SOCK /tmp/ssh-XXYqbMRe/agent.1065 setenv SSH_AGENT_PID 1066 |
您只需使用 ssh-add 命令将您的公钥添加到 ssh-agent。
ssh-add |
您可以(应该)在您的登录配置文件中添加 ssh-agent 和 ssh-add 命令,例如
eval `ssh-agent` ssh-add |
openMosixview 有一个菜单项可以切换 openMosixview 使用 rsh/ssh。只需启用此项,您甚至可以在不安全的网络环境中使用 openMosixview。您还应该保存此配置(在 0.7 版本中添加了在 openMosixview 中保存当前配置的可能性),因为它会使用 rsh 或 ssh 从 slave 获取初始数据(就像您配置的那样)。
如果您选择的服务未正确安装,openMosixview 将无法工作!(例如,如果您无法在不提示输入密码的情况下 rsh 到 slave,则您无法将 openMosixview 与 RSH 一起使用;如果您无法在不提示输入密码的情况下 ssh 到 slave,则您无法将 openMosixview 与 SSH 一起使用)
openMosixApplet 让您可以观看 openMosix 集群的实时负载。它由一个本地守护程序组成,该守护程序侦听来自 applet 的连接。该 applet 使用 chart2D 提供良好的外观感觉。
openMosixWebView - 生成用于监控 openMosix 集群的 Web 图表。 openMosixWebView 是一个 PHP 脚本,用于通过 WEB 监控 openMosix 集群。它使用 openMosixview 的 openMosixCollector 日志。立即下载最新版本 openmosixwebview-0.2.12.tar.gz (2003 年 2 月 16 日)
查看 openMosixWebView 屏幕截图和运行 :-) 在 GNU General Public License (GPL) 下发布。请参阅 README 和 FAQ 文件。
帮助 进程 XYZ 不会迁移。 Moshe Bar 在下面解释了为什么某些进程会迁移,而某些进程不会。但在此之前,您可以随时查看 /proc/$pid/,那里通常有一个 cantmove 文件,它会告诉您为什么某个进程无法迁移。
进程也可能被锁定。您可以使用以下命令检查进程是否被锁定
cat /proc/$PID/lock |
现在听听 Moshe 本人对此主题的看法。
通常人们使用相同的内核,但在不同的发行版上,例如 RedHat 和 Debian 的混合环境,来自不同发行版的 rc 脚本倾向于以不同的方式启动 openmosix。一些实现完全修改 /etc/inittab 以使用以下命令启动所有守护程序(及其子进程)
mosrun -h |
好的,如果启动次数多于本地 CPU 的数量,这个简单的程序应该始终迁移。因此,对于一个 2 路 SMP 系统,如果集群中的其他节点至少具有与本地节点相同的速度,则启动此程序 3 次将开始迁移
int main() { unsigned int i; while (1) { i++; } return 0; } |
这个内容如下的示例程序永远不会迁移
#include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> ... key_t key; /* key to be passed to shmget() */ int shmflg; /* shmflg to be passed to shmget() */ int shmid; /* return value from shmget() */ int size; /* size to be passed to shmget() */ ... key = ... size = ... shmflg) = ... if ((shmid = shmget (key, size, shmflg)) == -1) { perror("shmget: shmget failed"); exit(1); } else { (void) fprintf(stderr, "shmget: shmget returned %d\n", shmid); exit(0); } ... |
像这样的使用管道的程序可以很好地迁移
int pdes[2]; pipe(pdes); if ( fork() == 0 ) { /* child */ close(pdes[1]); /* not required */ read( pdes[0]); /* read from parent */ ..... } else { close(pdes[0]); /* not required */ write( pdes[1]); /* write to child */ ..... } |
// // Very simple program demonstrating the use of threads. // // Command-line argument is P (number of threads). // // Each thread writes "hello" message to standard output, with // no attempt to synchronize. Output will likely be garbled. // #include <iostream> #include <cstdlib> // has exit(), etc. #include <unistd.h> // has usleep() #include <pthread.h> // has pthread_ routines // declaration for function to be executed by each thread void * printHello(void * threadArg); // ---- Main program ------------------------------------------------- int main(int argc, char* argv[]) { if (argc < 2) { cerr << "Usage: " << argv[0] << " numThreads\n"; exit(EXIT_FAILURE); } int P = atoi(argv[1]); // Set up IDs for threads (need a separate variable for each // since they're shared among threads). int * threadIDs = new int[P]; for (int i = 0; i < P; ++i) threadIDs[i] = i; // Start P new threads, each with different ID. pthread_t * threads = new pthread_t[P]; for (int i = 0; i < P; ++i) pthread_create(&threads[i], NULL, printHello, (void *) &threadIDs[i]); // Wait for all threads to complete. for (int i = 0; i < P; ++i) pthread_join(threads[i], NULL); // Clean up and exit. delete [] threadIDs; delete [] threads; cout << "That's all, folks!\n"; return EXIT_SUCCESS; } // ---- Code to be executed by each thread --------------------------- // pre: *threadArg is an integer "thread ID". // post: "hello" message printed to standard output. // return value is null pointer. void * printHello(void * threadArg) { int * myID = (int *) threadArg; cout << "hello, world, "; // pointless pause, included to make the effects of // synchronization (or lack thereof) more obvious usleep(10); cout << "from thread " << *myID << endl; pthread_exit((void* ) NULL); } |
(以上所有代码均由 Moshe 以 Moshe Bar 或 Moshe 以 Qlusters, Inc. 的 CTO 身份提供)
另请参阅 openMosix 的 man 页面,它们也充分解释了为什么进程不会迁移。
如果由于某种原因您的进程在不应该被锁定时保持锁定状态。您可以尝试通过简单地将以下内容放入
# tell shells to allow subprocs to migrate to other nodes echo 0 > /proc/self/lock |
首先,您是否在每台机器上使用相同的内核版本?“相同内核”是指版本。您可以构建相同源代码版本的不同内核映像,以满足给定节点的硬件/软件需求。但是,您需要确保在集群上安装 openMosix 时,所有机器都应安装 openmosix-x.x.x-y 内核,而不是一台机器运行 openmosix-x.x.z-x,另一台运行 openmosix-x.x.x-y,另一台运行 openmosix x.x.x-z,等等
当您运行 mosmon 时,按 t 查看正在运行的机器总数。它是否警告您 mosix 未运行?
如果是,请确保您的机器 IP 包含在 /etc/mosix.map 中(不要使用 127.0.0.1 - 如果您的机器 IP 是这样的,那么您的 dhcp 服务器/名称服务器可能存在问题)。如果它没有告诉您 mosix 未运行,请查看显示了哪些机器。您只看到您的机器吗?
如果是,那么您的机器很可能正在运行防火墙,并且不允许 openmosix 通过。
如果不是,那么问题很可能出在未显示的机器上。另外:节点上有两张网卡吗?然后您必须编辑 /etc/hosts 文件,使其包含以下格式的行
non-cluster_ip cluster-hostname.cluster-domain cluster-hostname |
也许您在每台机器上使用了不同的内核参数?特别是如果您使用“支持具有复杂网络拓扑的集群”选项,则应注意在每台机器上为同时出现的选项“最大网络拓扑复杂性支持”使用相同的值。
我经常收到错误
bash: child setpgid (4061 to 4061): No such process |
上面的行表示您正在使用的 shell 实际上已迁移到另一个节点?bash 的此打印输出是由旧版本 openmosix 中的错误引起的,但已提交修复程序。(Muli Ben-Yehuda mulix@actcom.co.il)
人们经常对 MFS 和 DFSA 到底是什么感到困惑。正如之前在 howto 中讨论的那样,MFS 是 openMosix 的一项功能,使您可以访问远程文件系统,就像这些文件系统是在本地挂载的一样。它们主要挂载在 /mfs 上。一个常见的误解是,您需要 MFS 才能使 openMosix 工作,这不是真的,但是它可以使事情变得更容易。
启用 DFSA 后,系统调用将在远程节点上执行,而无需将进程迁移回其主节点。此行为(直接文件系统访问)导致进程迁移到数据,而不是相反(这是常见的)。如果未启用 DFSA,MfS“仅仅”是一个非缓存网络文件系统。
一般来说,如果您没有启用 DFSA,则每个 I/O 都将转到主节点执行。如果启用了 DFSA,如果文件恰好位于进程所在的节点上,则 I/O 将在本地发生。
一个非常常见的错误是人们混合使用启用了 DFSA 和禁用了 DFSA 的内核。因此,必须有一种方法来确定 DFSA 是否实际启用。此信息可以通过键入以下内容获得
cat /proc/hpc/admin/version |
如果由于某种原因,您发现您的进程始终在您的主节点中被锁定,并且您找不到原因,您可以将以下行放入您的 ~/.profile 中作为临时措施以自动启用迁移
if [ -x /proc/$$/lock ]; then echo 0 > /proc/$$/lock fi |
在决定要为哪些程序启用迁移之前,您可能需要测试您的设置。例如,如果您在速度较慢的机器上运行 KDE2,并且速度明显更快的机器是您的 Mosix 集群的一部分,您可能会发现像 kmail 这样的资源密集型程序已迁移出去。这本身并不是一件坏事,但是,它可能会导致您的书写内容不会立即显示在屏幕上的短暂时刻。
Green Threads JVM 允许迁移,因为每个 Java 线程都是一个单独的进程。Linux 无法迁移 Java green thread JVM 以外的线程,因此 openMosix 无法迁移使用它们的程序。
如果您有 Java 应用程序的源代码,您或许可以将应用程序编译为本机代码。在这种情况下,您或许可以将您的应用程序迁移到另一个节点。
Gian Paolo Ghilardi 写了一篇题为 Consideration on OpenMosix 的论文,其中涉及 Java 和 openMosix 等主题。 http://www.democritos.it/events/openMosix/papers/crema.pdf
基本上,当禁用超线程时,openMosix 性能会随着当前的 Linux 调度程序而提高。您可以通过输入 'noht' 作为启动选项或在 BIOS 中禁用 HT 来执行此操作。
对于那些仍然想知道什么是超线程的人:Intel 解释了它
人们经常对 openMosix 和防火墙有疑问。Amit 在这个问题上帮助了我
from hpc/comm.c: #define MIG_DAEMON_PORT 0x3412 #define INFO_DAEMON_PORT 0x3415 |
mig_daemon 端口是 tcp 端口,info_daemon 端口是 udp。因此是 tcp/4660 和 udp/5428,Matt 还在某处提到了 tcp/723。
测试您的 openMosix 集群的最快方法是创建一个包含以下内容的小脚本。
awk 'BEGIN {for(i=0;i<10000;i++)for(j=0;j<10000;j++);}' & |
for i in `ls /etc/` ; do ./test_mosix ; done |
Perl 程序,用于测试 openMosix 集群。
这是一个我编写的用于测试 openMosix 集群的快速程序。这是摘自我于 2002 年 3 月 6 日发布到 openMosix-devel 邮件列表的帖子:“Charles 编写了这个小程序(用 Perl 编写),以压力测试他的家庭集群(3 个 P200MMX 和一个 P166)。这是一个模拟给定时间段内投资组合中不同股票集的程序。代码文档齐全,应该很容易添加/删除股票并更改每只股票的平均每月收益率和标准差。由于投资组合优化问题无法通过分析解决,因此它模拟了许多投资组合并在最后报告结果。请注意,此程序未考虑股票相关性。它尚未完成,但这是一个良好的开端。我计划在程序末尾添加更多代码,以改进数据报告格式(动态生成 SVG 图形)。但是模拟部分工作得非常好。为了利用 openMosix 提供的并行性,它使用了 Perl 模块 Parallel::?ForkManager(来自 CPAN)来扩展线程,然后 openMosix 可以将线程分配给集群的所有机器(它还需要另一个用于统计计算的模块,不要忘记安装这两个模块,我在代码的注释中提供了 URL)。看看它,告诉我你的想法。干杯!”
#! /usr/bin/perl -w # this mill unlock this process and all tis childs sub unlock { open (OUTFILE,">/proc/self/lock") || die "Could not unlock myself!\n"; print OUTFILE "0"; } unlock; # this will count the nodes sub cpucount { $CLUSTERDIR="/proc/hpc/nodes/"; $howmany=0; opendir($nodes, $CLUSTERDIR); while(readdir($nodes)) { $howmany++; } $howmany--; $howmany--; closedir ($nodes); return $howmany; } my $processes=cpucount; $processes=$processes*3; print("starting $processes processes\n"); #Portfolio.pl, version 0.1 #Perl program that simulate a portfolios for various stock composition for a given period of time #We run various scenarios to find the mix of assets that give the best performance/risk ratio #This method is base on the book "The intelligent asset allocator" by William Bernstein #Can be used to test an OpenMosix cluster #This program is licensed under GPL #Author: Charles-E. Nadeau Ph.D., (c) 2002 #E-mail address: charlesnadeau AT hotmail DOT com use Parallel::ForkManager; #We use a module to parallelize the calculation #Available at http://theoryx5.uwinnipeg.ca/mod_perl/cpan-search?filetype=%20distribution%20name%20or%20description;join=and;arrange=file;download=auto;stem=no;case=clike;site=ftp.funet.fi;age=;distinfo=2589 use Statistics::Descriptive::Discrete; #A module providing statistical values #Available at http://theoryx5.uwinnipeg.ca/mod_perl/cpan-search?new=Search;filetype=%20distribution%20name%20or%20description;join=and;arrange=file;download=auto;stem=no;case=clike;site=ftp.funet.fi;age=;distinfo=2988 srand; #We initialize the random number generator #Initializing constant $NumberOfSimulation=$processes; #Number of simulation to run $NumberOfMonth=100000; #Number of month for wich to run the simulation $NumberOfStock=6; #Number of different stocks in the simulation #Portfolio to simulate #TODO: Read the stock details from a file $Stock[0][0]="BRKB"; #Stock ticker $Stock[0][1]=0.01469184; #Stock average monthly return $Stock[0][2]=0.071724934; #Stock average monthly standard deviation $Stock[1][0]="TEST "; #Stock ticker $Stock[1][1]=-0.01519; #Stock average monthly return $Stock[1][2]=0.063773903; #Stock average monthly standard deviation $Stock[2][0]="SPDR"; #Stock ticker $Stock[2][1]=0.008922718; #Stock average monthly return $Stock[2][2]=0.041688404; #Stock average monthly standard deviation $Stock[3][0]="BRKB"; #Stock ticker $Stock[3][1]=0.01469184; #Stock average monthly return $Stock[3][2]=0.071724934; #Stock average monthly standard deviation $Stock[4][0]="TEST "; #Stock ticker $Stock[4][1]=-0.01519; #Stock average monthly return $Stock[4][2]=0.063773903; #Stock average monthly standard deviation $Stock[5][0]="SPDR"; #Stock ticker $Stock[5][1]=0.008922718; #Stock average monthly return $Stock[5][2]=0.041688404; #Stock average monthly standard deviation my $pm = new Parallel::ForkManager($NumberOfSimulation); #Specify the number of threads to span $pm->run_on_start( sub { my ($pid,$ident)=@_; print "started, pid: $pid\n"; } ); #We initialize the array that will contain the results @Results=(); for $i (0..$NumberOfSimulation-1){ for $j (0..$NumberOfStock+3){ $Results[$i][$j]=0.0; #Equal to 0.0 to start } } for $i (0..$NumberOfSimulation-1){ #Loop on the number of simulation to run $Results[$i][0]=$i; #The first column of each line is the number of the simulation $pm->start and next; #Start the thread $TotalRatio=1; #The sum of the proprtion of each stock #Here we calculate the portion of each investment in the portfolio for a given simulation for $j (0..$NumberOfStock-2){ #We loop on all stock until the second to last one #TODO: Replace rand by something from Math::TrulyRandom $Ratio[$j]=rand($TotalRatio); $Results[$i][$j+1]=$Ratio[$j]; #We store the ratio associated to this stock $TotalRatio=$TotalRatio-$Ratio[$j]; } $Ratio[$NumberOfStock-1]=$TotalRatio; #In order to have a total of the ratios equal to one, we set the last ratio to be the remainder $Results[$i][$NumberOfStock]=$Ratio[$NumberOfStock-1]; #We store the ratio associated to this stock. Special case for the last stock $InvestmentValue=1; #Initially the investment value is 1 time the initial capital amount. my $stats=new Statistics::Descriptive::Discrete; #We initialize the module used to calculate the means and standard deviations for $j (1..$NumberOfMonth){ #Loop on the number of months $MonthlyGrowth[$j]=0.0; #By how much did we grow this month. Initially, no growth yet. #We loop on each stock to find its monthly contribution to the yield for $k (0..$NumberOfStock-1){ $MonthlyGrowth[$j]=$MonthlyGrowth[$j]+($Ratio[$k]*((gaussian_rand()*$Stock[$k][2])+$Stock[$k][1])); #We had the growth for this stock to the stock already calculated for the preceding stocks } $stats->add_data($MonthlyGrowth[$j]); #Add the yield for this month so we can later on have the mean and standard deviation for this simulation $InvestmentValue=$InvestmentValue*(1+$MonthlyGrowth[$j]); #Value of the Investment after this month } $Results[$i][$NumberOfStock+1]=$stats->mean(); #Calculate the average monthly growth $Results[$i][$NumberOfStock+2]=$stats->standard_deviation(); #Calculate the standard deviation of the monthly growth $pm->finish; #Finish the thread } $pm->wait_all_children; #We wait until all threads are finished #Printing the results print "Simulation "; for $j (0..$NumberOfStock-1){ print "Ratio$Stock[$j][0] "; } print " Mean StdDev YieldRatio\n"; for $i (0..$NumberOfSimulation-1){ printf "%10d ", $Results[$i][0]; for $j (1..$NumberOfStock){ printf " %6.2f ",$Results[$i][$j]; } if($Results[$i][$NumberOfStock+2]!=0) { printf "%5.4f %5.4f %5.4f\n", $Results[$i][$NumberOfStock+1], $Results[$i][$NumberOfStock+2], ($Results[$i][$NumberOfStock+1]/$Results[$i][$NumberOfStock+2]); } else { printf "%5.4f %5.4f %5.4f\n", $Results[$i][$NumberOfStock+1], $Results[$i][$NumberOfStock+2], 0; } } #Subroutines #Subroutine to generate two numbers normally distributed #From "The Perl Cookbook", recipe 2.10 sub gaussian_rand { my ($u1, $u2); my $w; my ($g1, $g2); do { $u1=2*rand()-1; $u2=2*rand()-1; $w=$u1*$u1+$u2*$u2; } while ($w>=1 || $w==0); #There was an error in the recipe, I corrected it here $w=sqrt(-2*log($w)/$w); $g2=$u1*$w; $g1=$u2*$w; return wantarray ? ($g1,$g2) : $g1; } |
作者:Matt Rechenburg
此压力测试旨在测试 openMosix 集群 + 内核。它将执行多个应用程序 + 内核测试,以检查 openMosix 的稳定性和其他功能(例如,进程迁移、mfs 等)。在此测试期间,集群将主要处于负载状态,因此您应在启动测试之前停止其他正在运行的应用程序。完成后,它会生成一份关于每个被测组件的完整详细报告。
openMosix 压力测试运行多个程序以检查整个系统的功能。在以下部分中,您将找到每个测试应用程序的描述
distkeygen:此应用程序用于生成 4000 个密钥长度为 1024 位的 RSA 密钥对。它通过 fork 分布到 openMosix 集群中与处理器数量相同的进程中。
要求:gcc 编译器和 OpenSSL 库 Copyright (C) 2001 Ying-Hung Chen (GPL) http://www.yingternet.com/mosix
portfolio 'portfolio' 是一个 perl 程序,它模拟给定时间段内各种股票组成的投资组合。此方法基于 William Bernstein 的著作“The intelligent asset allocator”。
此程序在 GPL 下获得许可 作者:Charles-E. Nadeau Ph.D., (c) 2002 电子邮件地址:charlesnadeau AT hotmail DOT com
eatmem:简单地从值 1000000 次计算 sin+sqrt 并输出,它将循环计数输出到一个文件(该文件将变得很大)。此测试会自动启动多次,次数与您的 openMosix 集群中的处理器数量相同。
forkit:'forkit' 测试类似于 'eatmem' 测试,但使用 fork 创建多个进程(3*[您的_openMosix_集群中的_处理器_数量]),除了它不写入文件。
mfstest 这将创建一个 10MB 的文件并将其来回复制到所有节点。它用于检查 oMFS 的功能。
内核系统调用测试:Linux 测试项目是 SGI、IBM、OSDL 和 Bull 的联合项目,其目标是向开源社区提供测试套件,以验证 Linux 的可靠性、健壮性和稳定性。Linux 测试项目是用于测试 Linux 内核和相关功能的一组工具。目标是通过将测试自动化引入内核测试工作来改进 Linux 内核。鼓励感兴趣的开源贡献者加入该项目。有关更多信息,请访问:http://ltp.sf.net
moving:'moving.sh' 将在运行压力测试本身的同时,在您的 openMosix 集群中的每个节点周围移动 'start_openMosix_test.sh'。因此,'start_openMosix_test.sh' 将在测试运行期间每分钟迁移到另一个节点。取决于测试在您的集群上运行的时间,它将被迁移 20-40 次。
首先,从 http://www.openmosixview.com/omtest/ 下载 rpm 或源代码包
使用源代码包
例如,使用以下命令在 /usr/local 中解压缩 openMosix 压力测试
gunzip omtest.tar.gz tar -xvf omtest.gz |
./compile_tests.sh |
./start_openMosix_test.sh |
使用 RPM 包
安装 omtest.rpm 时需要满足一些要求,例如您需要 expect 和 compat-libstdc++-7.3-2.96.110(如果您在 RH 8.0 上)。只需使用以下命令安装 omtest.rpm
rpm -ihv omtest.rpm |
start_openMosix_test.sh |
[root@dhcp51 omtest]# ./start_openMosix_test.sh starting the openMosix stress test now! the results will be saved in : /tmp/openMosix-stress-test-report-03/16/2003-11:27:02.txt oMFS is not mounted at /mfs! oMFS-test will be disabled. Please mount oMFS before running this openMosix-test You will find instructions how to configure and use oMFS at: http://howto.ipng.be/openMosix-HOWTO/x222.htm#AEN243 (return to continue, ctrl-c for cancel) |
Persistence of Vision Raytracer 是一款高质量、完全免费的工具,用于创建令人惊叹的三维图形。
光线追踪是一种渲染技术,它通过模拟光线在真实世界中传播的方式来计算场景的图像。但是,它的工作方式是向后进行的。在现实世界中,光线从光源发射并照亮物体。光线从物体反射或穿过透明物体。这种反射光击中我们的眼睛或可能击中相机镜头。由于绝大多数光线永远不会击中观察者,因此追踪场景将花费很长时间。
这些类型的应用程序可以通过使用 pvmpovray 轻松实现并行化。Pvmpovray 期望在 Beowulf 风格的集群上工作,并使用 pvm 将其负载分散到其他节点。openMosix 的方法是相同的,但是我们只是在一台机器上执行此操作,并让 openMosix 为您完成负载分散工作!
关于 PVM Povray 的伟大 Howto 将向您展示如何设置 PVMPovray。以下是一个小摘要。
$ cd pvmpov3_1g_2 $ tar xfz ../povuni_s.tgz $ tar xfz ../povuni_d.tgz $ ./inst-pvm Trying to apply the patch. Searching for rejected files $ |
如果您在 RH 8.0 box 上,则将 libpng 和 zlib 移动到 .notused .. 这是为了防止版本问题.. 与其他 libpng 和 zlib 版本发生冲突。
export PATH=$PATH:/usr/share/pvm3/lib export PVMROOt=/usr/share/pvm3 |
新手 pvm 用户不知道的最后一件事是 pvm 使用其自己的路径,您必须将 pvmpov 放在该路径中,或者使用完整路径名启动它。
[root@dhcp71 povray31]# /usr/local/bin/pvmpov -L /usr/src/povray/pvmpov3_1g_2/povray31/include/ +Iskyvase.pov +Oskyvase.tga +NT16 +NW64 +NH64 +v +w1024 +h768 Persistence of Vision(tm) Ray Tracer Version 3.1g.Linux.gcc This is an unofficial version compiled by: Jakob Flierl - PVMPOV Version 3.1g.2 The POV-Ray Team(tm) is not responsible for supporting this version. Copyright 1999 POV-Ray Team(tm) Never found section in file /usr/src/povray/pvmpov3_1g_2/povray31/include/. Initializing PVMPOV Spawning /usr/local/bin/pvmpov with 16 PVM tasks on 1 hosts... ...16 PVM tasks successfully spawned. Waiting up to 120s for first slave to start... Slave 0 successfully started. Parsing Options Input file: skyvase.pov (compatible to version 3.1) Remove bounds........On Split unions........Off Library paths: /usr/local/lib/povray31 /usr/local/lib/povray31/include Output Options Image resolution 1024 by 768 (rows 1 to 768, columns 1 to 1024). Output file: skyvase.tga, 24 bpp PNG Graphic display.....Off Mosaic preview......Off CPU usage histogram.Off Continued trace.....Off Allow interruption...On Pause when done.....Off Verbose messages.....On Tracing Options Quality: 9 Bounding boxes.......On Bounding threshold: 25 Light Buffer.........On Vista Buffer.........On Antialiasing........Off Radiosity...........Off Animation Options Clock value.... 0.000 (Animation off) PVM Options Block Width.... 64 Block Height... 64 PVM Tasks...... 16 PVM Nice....... 5 PVM Arch....... PVM Slave...... /usr/local/bin/pvmpov PVM WorkingDir. /usr/src/povray/pvmpov3_1g_2/povray31 Redirecting Options All Streams to console..........On Debug Stream to console.........On Fatal Stream to console.........On Render Stream to console........On Statistics Stream to console....On Warning Stream to console.......On Starting frame 0... Slave 1 at dhcp71.office.be.stone-it.com successfully started. Slave 2 at dhcp71.office.be.stone-it.com successfully started. Slave 3 at dhcp71.office.be.stone-it.com successfully started. Slave 4 at dhcp71.office.be.stone-it.com successfully started. Slave 5 at dhcp71.office.be.stone-it.com successfully started. Slave 6 at dhcp71.office.be.stone-it.com successfully started. Slave 7 at dhcp71.office.be.stone-it.com successfully started. Slave 8 at dhcp71.office.be.stone-it.com successfully started. Slave 9 at dhcp71.office.be.stone-it.com successfully started. Slave 10 at dhcp71.office.be.stone-it.com successfully started. Slave 11 at dhcp71.office.be.stone-it.com successfully started. Slave 12 at dhcp71.office.be.stone-it.com successfully started. Slave 13 at dhcp71.office.be.stone-it.com successfully started. Slave 14 at dhcp71.office.be.stone-it.com successfully started. Slave 15 at dhcp71.office.be.stone-it.com successfully started. 0:00:53 86.46 of blocks complete.Not using dhcp71.office.be.stone-it.com for reassignment (77%) 0:00:53 86.98 of blocks complete.Not using dhcp71.office.be.stone-it.com for reassignment (67%) Not using dhcp71.office.be.stone-it.com for reassignment (86%) Not using dhcp71.office.be.stone-it.com for reassignment (85%) 0:00:55 89.06 of blocks complete. 640 of 768 lines finished (in frame 0).Not using dhcp71.office.be.stone-it.com for reassignment (65%) 0:00:56 91.67 of blocks complete.Not using dhcp71.office.be.stone-it.com for reassignment (72%) 0:00:56 92.71 of blocks complete.Not using dhcp71.office.be.stone-it.com for reassignment (80%) 0:00:57 93.75 of blocks complete. Slave at dhcp71.office.be.stone-it.com has exited. 0:00:57 94.79 of blocks complete. Slave at dhcp71.office.be.stone-it.com has exited. Slave at dhcp71.office.be.stone-it.com has exited. 0:00:58 95.83 of blocks complete. Slave at dhcp71.office.be.stone-it.com has exited. 0:00:58 96.35 of blocks complete. 672 of 768 lines finished (in frame 0).Not using dhcp71.office.be.stone-it.com for reassignment (77%) Slave at dhcp71.office.be.stone-it.com has exited. 0:00:58 97.14 of blocks complete. 688 of 768 lines finished (in frame 0). Slave at dhcp71.office.be.stone-it.com has exited. 0:00:59 97.92 of blocks complete. Slave at dhcp71.office.be.stone-it.com has exited. 0:00:60 98.44 of blocks complete. 704 of 768 lines finished (in frame 0). Slave at dhcp71.office.be.stone-it.com has exited. 0:01:03 100.00 of blocks complete. 768 of 768 lines finished (in frame 0). Finishing frame 0...rtw. 768 Waiting for remaining slave stats. PVM Task Distribution Statistics: host name [ done ] [ late ] host name [ done ] [ late ] dhcp71.office.be.stone-it.com [ 5.21%] [ 0.00%]dhcp71.office.be.stone-it.com [ 7.81%] [ 0.07%] dhcp71.office.be.stone-it.com [ 8.85%] [ 1.17%]dhcp71.office.be.stone-it.com [ 4.69%] [ 0.00%] dhcp71.office.be.stone-it.com [ 8.85%] [ 0.98%]dhcp71.office.be.stone-it.com [ 4.17%] [ 0.00%] dhcp71.office.be.stone-it.com [ 5.21%] [ 0.00%]dhcp71.office.be.stone-it.com [ 8.33%] [ 0.52%] dhcp71.office.be.stone-it.com [ 5.21%] [ 0.00%]dhcp71.office.be.stone-it.com [ 5.73%] [ 0.72%] dhcp71.office.be.stone-it.com [ 7.29%] [ 2.73%]dhcp71.office.be.stone-it.com [ 4.17%] [ 0.00%] dhcp71.office.be.stone-it.com [ 5.21%] [ 0.00%]dhcp71.office.be.stone-it.com [ 6.77%] [ 0.13%] dhcp71.office.be.stone-it.com [ 4.69%] [ 0.00%]dhcp71.office.be.stone-it.com [ 7.81%] [ 0.00%] POV-Ray statistics for finished frames: skyvase.pov Statistics (Partial Image Rendered), Resolution 1024 x 768 ---------------------------------------------------------------------------- Pixels: 303104 Samples: 303104 Smpls/Pxl: 1.00 Rays: 1192710 Saved: 0 Max Level: 0/5 ---------------------------------------------------------------------------- Ray->Shape Intersection Tests Succeeded Percentage ---------------------------------------------------------------------------- Cone/Cylinder 1842227 900504 48.88 CSG Intersection 2742731 323346 11.79 CSG Union 1801008 521692 28.97 Plane 20223278 11233348 55.55 Quadric 1801008 1196533 66.44 Sphere 1801008 461786 25.64 Bounding Object 1842227 900504 48.88 ---------------------------------------------------------------------------- Calls to Noise: 1201944 Calls to DNoise: 2108954 ---------------------------------------------------------------------------- Shadow Ray Tests: 2856188 Succeeded: 85620 Reflected Rays: 889606 ---------------------------------------------------------------------------- Smallest Alloc: 9 bytes Largest: 20508 Peak memory used: 5643343 bytes ---------------------------------------------------------------------------- Time For Trace: 0 hours 1 minutes 7.0 seconds (67 seconds) Total Time: 0 hours 1 minutes 7.0 seconds (67 seconds) |
我在可用 CPU 数量的 2 到 3 倍时获得了良好的结果
Blast 是该领域更常用的应用程序之一,Blast 有一个补丁可用,使其与 openMosix 的工作更顺畅,但这并不是唯一的选择。
首先,此补丁和 Blast 的其他版本存在一些已知问题,Blast 有时会发生段错误,这主要发生在您从 Internet 下载的预格式化数据库中。如果您在原始数据库上运行 formatdb,这些错误往往会消失。
除了 openMosix blast 补丁之外,很多人都在运行 MPIBlast 鉴于 openMosix 倾向于加速 MPI,将 openMosix 添加到此配置甚至可能会为您带来更多物有所值的性能,但是我们将不得不做一些额外的研究才能证实这一点。
这部分由 Amit Shah 撰写
目前内核的文档不多。我希望在未来几周内写一些。无论如何,以下是源代码的布局方式
openMosix 代码主要位于 hpc/ 和 include/hpc 中。从 arch/i386 目录到 mm/、fs/ 等,到处都有对核心内核文件的大量补丁。您需要阅读您感兴趣的代码,并思考这对于当前情况很重要(这应该不是问题,因为您已经完成内核编码)。
以下是您应该在每个源文件中期望的内容
hpc/badops.c:一个处理所有错误操作的文件:主要返回错误代码
hpc/balance.c:负载均衡器代码(负载 + 内存使用量 + 网络使用量)
hpc/comm.c:集群内通信设置
hpc/config.c:openMosix 的配置代码:在您运行启动脚本后
hpc/decay.c:衰减(老化)从其他节点收集的统计信息和信息
hpc/deputy.c:在 deputy 上执行的代码:服务远程系统调用(即在进程迁移后)、信号等。
hpc/dfsa.c:直接文件系统访问代码:分布式文件系统抽象层
hpc/div.c:执行浮点除法的算法
hpc/export.c:导出其他文件中需要的符号
hpc/freemem.c:跟踪空闲、可用内存并在需要时释放它。很大程度上取自 Linux mm/ 代码。
hpc/hpcadmin.c:调整 openMosix 管理值(通过 /proc/hpc)
hpc/hpcproc.c:/proc/hpc 代码在此处处理
hpc/info.c:信息守护程序:在整个集群中发送和接收(多播)负载 + 内存使用统计信息
hpc/init.c:初始化代码:初始化守护程序等。
hpc/kernel.c:大多数“核心”代码:所有重要的算法、决策等都在此处制定。
hpc/load.c:本地负载等的计算。
hpc/mig.c:处理迁移的代码。此文件中的代码在任何迁移时调用:deputy->remote,remote->deputy;remote->remote
hpc/prequest.c:处理进程的请求:信号、更多内存等。
hpc/remote.c:当进程位于远程时执行的代码:远程系统调用处理、将控制权传递给 deputy 等。
hpc/rinode.c:fs/ 相关内容:主要用于 DFSA
hpc/service.c:设置守护程序、获取内存等。
hpc/syscalls.c:在此处处理所有远程系统调用
hpc/ucache.c:处理 ucache:主要是 mm/、fs/ 内容。
openMosix 系统是用于单映像集群的 Linux 内核扩展。它扩展了杰出的 MOSIX 项目,但已根据 GNU General Public License (GPL) 获得许可。
是的。它位于 www.openMosix.org。SourceForge 项目页面位于 http://openmosix.sf.net/
是的。有三个
对于一般讨论,请使用 mailto:openmosix-general@lists.sourceforge.net,其一般信息页面位于 http://lists.sourceforge.net/lists/listinfo/openmosix-general
对于开发人员,请使用 mailto:openmosix-devel@lists.sourceforge.net,其一般信息页面位于 http://lists.sourceforge.net/lists/listinfo/openmosix-devel
由 Democritos(位于的里雅斯特的 INFM 国家模拟中心)托管的意大利语 openMosix 邮件列表
是的。openMosix 工作已经有 10 多位贡献者。与 Linux 内核维护系统不同,Moshe Bar 任命官方维护人员,然后将提交权限授予这些维护人员,以访问 openMosix CVS 源代码树,类似于 FreeBSD。
现在,我们正在寻找更多经验丰富的内核黑客来研究检查点/重启等新功能。
如果您想成为 openMosix 开发人员,请写信给 mailtomoshe@moelabs.com。
所有 MOSIX 代码的版权均归耶路撒冷希伯来大学的 Amnon Barak 教授所有。所有 openMosix 代码的版权均归特拉维夫的 Moshe Bar 所有。openMosix 系统不包含任何非 GPL(即 MOSIX)代码。
最初,openMosix 是 MOSIX 的一个分支,但它已发展成为一个先进的集群平台。openMosix 系统不再包含任何非 GPL(即 MOSIX)代码。
与 MOSIX 相比,添加了许多功能
移植到 UML(用户模式 Linux)架构 |
新的更简洁的迁移代码 |
更好的负载均衡器 |
大大减少的内核延迟 |
支持 Dolphin 和 IA64 |
大大简化的安装过程,使用 RPM 打包 |
丰富的文档 |
openMosix 的 RPM 和源代码可以从我们的下载/文件区获取。请先阅读发行说明!
此外,还可以使用 Gentoo Linux 的 emerge sys-apps/openmosix-user 和 Debian GNU/Linux openMosix 软件包。
不可以。就像旧版本的 MOSIX 一样,您不应该混合使用节点,因为协议会根据版本进行未声明的更改。此外,每个新版本都有错误修复,因此有必要更新到新内核。
首先,在一个目录(例如 /usr/src)中解压缩 Linux 内核源代码和相应的 openMosix 发行版。
然后
$ cd /usr/src; tar xzf linux-2.x.xx.tar.gz ;gunzip openMosix2.x.xx.gz |
使用以下命令将 openMosix 补丁应用于原始 Linux 内核源代码
$ patch -p1 openMosix2.x.xx-x |
您应该使用 gcc-2.95.3,因为这是 2.4 内核的推荐编译器。这是 Linux 内核的要求,而不仅仅是 openMosix 的要求。但是,这并不妨碍您在同一系统上同时拥有用于内核编译的 gcc-2.95.3 和用于非内核编译的 gcc-3.x。
补充说明:gcc-3.x 编译器存在许多与内核相关的问题。内联、优化和页面对齐会对操作系统内核产生奇怪的影响。标准的 Linux 内核仅保证使用 gcc 2.95.3 编译并正常工作。
但是,Red Hat gcc 2.96 编译器是 2.95 + RH 补丁。在这种情况下,您应确保使用 gcc-2.96-74 或更高版本。gcc-2.96-54 将无法正确构建内核。此外,请注意编译器优化。任何大于 -O2 的值都可能不明智。同样,如果您选择使用 gcc-2.95.x 或衍生版本,请务必不要使用 -fstrict-aliasing(根据您的 gcc 2.95.x 版本,可能需要使用 -fno-strict-aliasing)。
将 openMosix 内核视为任何其他内核即可。openMosix 系统只是内核的扩展,并且会被您的引导加载程序视为标准内核。
openMosix 文件系统 (oMFS) 是 openMosix 内核使用的文件系统。您可以通过在集群节点上安装 openMosix 内核来获取它,并在内核配置中启用 oMFS。(在 openMosix RPM 中应默认启用。)
您还应该启用直接文件系统访问 (DFSA),这允许迁移的进程在远程节点本地执行许多系统调用,而无需将其迁移回其主节点。
oMFS 的使用和管理与 NFS 非常相似,但与 NFS 不同,oMFS 具有以下特点
缓存一致性
时间戳一致性
链接一致性
请阅读 HOWTO 前面章节中有关 oMFS 及其使用方法的更多信息。
这里有一些链接
Brian Pontz 的 openMosix 源代码浏览器位于 http://www.openmosix.org/lxr/source。
openMosix 内部原理:openMosix 如何工作 位于 http://sourceforge.net/docman/display_doc.php?docid=10390&group_id=46729。
LTSP + openMosix:快速入门指南 位于 http://sourceforge.net/docman/display_doc.php?docid=10431&group_id=46729。
分布式操作系统:openMosix 的一般描述 位于 http://sourceforge.net/docman/display_doc.php?docid=9562&group_id=46729。
当您运行 'mosmon' 时,按 't' 查看正在运行的机器总数。它是否警告您 openMosix 未运行?
如果是,请确保您的机器 IP 地址包含在 /etc/openmosix.map 中。不要使用 127.0.0.1。如果这样做,您的 DHCP 服务器或 DNS 名称服务器可能会出现问题。
如果不是,请查看显示哪些机器。您只看到自己的机器吗?
如果是,则您的机器很可能正在运行防火墙,并且不允许 openMosix 通过。
如果不是,则问题很可能出在未显示的机器上。
另请注意:您的节点上是否有两张 NIC 卡?如果是,您必须编辑 /etc/hosts 以使其具有以下格式的行
<non-cluster ip> <cluster-hostname>.<cluster-domain> <cluster-hostname> |
也许您在每台机器上使用了不同的内核参数?特别是如果您使用“支持具有复杂网络拓扑的集群”选项,则应注意在每台机器上为同时出现的选项“最大网络拓扑复杂性支持”使用相同的值。
它们代表了 Mosix/openmosix 发展的三个阶段。文件 /etc/mosix.map 是原始 Mosix 映射名称,文件 /etc/hpc.map 是早期的 openMosix 映射名称(并且 'hpc' 仍然用于 openMosix 中的 /proc 文件)。当前的映射名称是 /etc/openmosix.map。
您需要修改您的 /etc/hosts 文件。在 Red Hat 机器上,大多数情况下 /etc/hosts 文件包含如下行
127.0.0.1 hostname.domain.com localhost |
如果 hostname.domain.com 的 IP 地址为 192.168.10.250,并且您查找 hostname.domain.com,您可能会得到 127.0.0.1 作为答案。
但是,如果您放入
192.168.10.250 hostname.domain.com 127.0.0.1 localhost |
机器永远不会太弱:我有三台 P200(每台 64MB)和两台 P166(一台 48MB,一台 192MB)。其中两台在 10Base-T 网络上,另外三台在 100Base-T 网络上。即使使用这些过时的机器和“异构”网络,我也可以获得完美的负载均衡来运行我用 Perl 编写的模拟程序。(请查看我们的 ProgramToTestACluster”)。不要因为您的机器老旧而退缩。对我们来说,这是 openMosix 的一个很好的特性:您可以随着新机器的可用而将其添加到现有集群中。而且您不需要拥有所有相同的机器。这太棒了!
但是,建议使用 100Base-T 网络!由 Charles Nadeau 贡献。
如果您打算在 openMosix 下运行 VMWare,以便 openMosix 可以负载均衡该软件的多个实例(是的,这可行)。但是,如果您想在多个 VMWare 实例中运行 openMosix 并让这些实例进行负载均衡(这将失败)。
第一种情况有效。后一种情况无效,因为 VMware 在其 Pentium 仿真中存在一个错误,该错误会导致 VMware 在首次迁移时崩溃(不是 openMosix,而是 VMware 二进制文件)。
目前仅支持 IA-32。openMosix 到 Intel(r) Itanium(tm) IA-64 处理器系列的移植已完成。openMosix 第二年的项目计划包括移植到 64 位 AMD Opteron(tm) 处理器。
PlumpOS 是一个迷你 Linux 发行版,旨在提供一种简单的方式来将节点添加到 openMosix 集群,而无需大量工作甚至思考。最初的想法来自 ClumpOS(现在已故的项目,由 Jean-David Marrow 开发),ClumpOS 的目标与 MOSIX 集群非常相似,而当前 PlumpOS 的开发也受到 ClumpOS 的启发。
使用 PlumpOS 的首要原因是尝试以简单方便的方式使用 openMosix 集群。第二个原因是在不进行大量工作的情况下将节点添加到现有集群。PlumpOS 绝不是企业集群的替代品,也不力求成为某种超级集群项目;它仅仅提供了一种快速简便的方法,将您的普通 586+ PC 变成集群的另一个节点。
从开发人员的角度来看,它有点困难,但对于普通用户来说却非常简单:只需将包含所有必需文件的 ISO 刻录到 CDROM 驱动器中,启动 PC(确保已安装可正常工作的网卡和网线),您就又多了一台计算机来分发负载/派生进程。由于它是子/从属节点,因此您必须已经有一个正在运行的 openMosix 盒子来运行 PlumpOS 计算机要处理的任务。如果没有主节点,PlumpOS 就几乎没用。该计算机或某些其他网络设备必须已经在提供 DHCP 地址,否则您会发现自己需要手动配置所有 PlumpOS 节点(这不会让网络管理员高兴 - 但这就是我们有初级管理员的原因 ^_^)。此外,请确保您的主节点上运行了 openMosix 自动发现守护程序(又名 omdiscd)。自动发现守护程序可以在 openMosix 的 userspace-tools 软件包中找到。
嗯,对于 PlumpOS 的特定帮助,您应该加入 PlumpOS 邮件列表,网址为 http://lists.sourceforge.net/lists/listinfo/plumpos-general 并提出问题(本 FAQ 中未解答的问题),或者访问 irc.freenode.net #PlumpOS。对于与 openMosix 相关的问题,您应该加入 openMosix-general 或 openMosix-devel 邮件列表,网址为 http://openmosix.sourceforge.net/mailing.html 或访问 irc.freenode.net #openMosix。
PlumpOS 的官方主页位于 http://PlumpOS.sourceforge.net/。您将在那里找到本文档的更新版本,以及更新的新闻、信息等。
Mirko Caserta 撰写的针对愚蠢的发布经理和冒险的“自己动手”RPM 打包者的分步指南
在您的机器上安装 RedHat 8 (psyche)。这是目前用于生成 rpm 的平台,并且已知其工作良好
从 oM 的 CVS 存储库获取“linux-openmosix”模块的更新副本 - 详细信息可以在 http://sourceforge.net/cvs/?group_id=46729 找到
获取我们将要修补的 Linux 内核源代码的 tarball,并将其放在 /usr/src/redhat/SOURCES 中 - 假设我们正在讨论 2.4.20 内核,请从许多 https://linuxkernel.org.cn/ 镜像站点之一获取 linux-2.4.20.tar.bz2 文件
在 /usr/src 下解压缩内核 tarball,即
# cd /usr/src # tar vxjf redhat/SOURCES/linux-2.4.20.tar.bz2 |
创建一个指向您检出 linux-openmosix 模块的目录的符号链接,例如
# ln -s /home/mcaserta/src/linux-openmosix/linux-openmosix \ /usr/src/linux-openmosix |
复制 .spec 文件和在此目录中找到的所有 .config 文件到 /usr/src/redhat/SOURCES 下,即
# cp /usr/src/linux-openmosix/configs/openmosix-kernel.spec \ /usr/src/redhat/SOURCES # cp /usr/src/linux-openmosix/configs/*.config \ /usr/src/redhat/SOURCES |
现在是检查版本号的时候了,然后再制作补丁文件:确保以下文件中的最前面几行
/usr/src/linux-openmosix/Makefile and /usr/src/redhat/SOURCES/openmosix-kernel.spec have the correct |
好的,是时候制作补丁了(假设我们正在为 2.4.20 Linux 内核和 openMosix 的第 3 个版本发布补丁)
# cd /usr/src # diff -Naur --exclude=CVS --exclude=configs \ linux-2.4.20 linux-openmosix > \ /usr/src/redhat/SOURCES/openMosix-2.4.20-3 # bzip2 /usr/src/redhat/SOURCES/openMosix-2.4.20-3 |
此时,您的 /usr/src/redhat/SOURCES 目录应如下所示
# ls /usr/src/redhat/SOURCES kernel-2.4.20-athlon.config kernel-2.4.20-i686-smp.config kernel-2.4.20-athlon-smp.config linux-2.4.20.tar.bz2 kernel-2.4.20-i386.config openMosix-2.4.20-3.bz2 kernel-2.4.20-i686.config openmosix-kernel.spec |
现在您只需要 rpmbuild 整个东西 - 我通常做的是
# cd /usr/src/redhat/SOURCES # rpmbuild -ba --target i386 openmosix-kernel.spec # rpmbuild -bb --target i686 openmosix-kernel.spec # rpmbuild -bb --target athlon openmosix-kernel.spec |
# rpmbuild -ba --target all_x86 openmosix-kernel.spec |
在 rpmbuild 完成其工作后,您应该在 /usr/src/redhat 目录下拥有以下文件
a) RPMS/i386/openmosix-kernel-2.4.20-openmosix3.i386.rpm b) RPMS/i686/openmosix-kernel-2.4.20-openmosix3.i686.rpm c) RPMS/i686/openmosix-kernel-smp-2.4.20-openmosix3.i686.rpm d) RPMS/athlon/openmosix-kernel-2.4.20-openmosix3.athlon.rpm e) RPMS/athlon/openmosix-kernel-smp-2.4.20-openmosix3.athlon.rpm f) RPMS/i386/openmosix-kernel-source-2.4.20-openmosix3.i386.rpm g) SRPMS/openmosix-kernel-2.4.20-openmosix3.src.rpm h) SOURCES/openMosix-2.4.20-3.gz |
a) binary kernel package for i386 UP* machines b) binary kernel package for i686 UP* machines c) binary kernel package for i686 SMP** machines d) binary kernel package for athlon UP* machines e) binary kernel package for athlon SMP** machines f) source kernel package for any x86 machine (basically this is useful if you need to have the openMosix kernel headers) g) source kernel package (see point 11) h) kernel patch file compressed with gzip |
从 .src.rpm 文件中获取所有文件的魔咒是:# rpm2cpio openmosix-kernel-....src.rpm | cpio -di
特别感谢 Martin H�y 在我尝试将所有内容组合在一起时提供的帮助。
希望您觉得本文档有用。至少对我来说是这样,因为我往往在完成事情后几分钟就忘记了 :)
* UP = 单处理器(即一个 CPU)** SMP = 对称多处理(即多个 CPU)
一些 openMosix 爱好者在线上花费时间在 irc 上帮助人们。我们在 irc.freenode.net 上的 #openMosix 上。加入我们,讨论您的问题、想法以及有关 openMosix 的其他内容
有些人一直在努力将本 HOWTO 的部分内容翻译成他们自己的语言,或者只是纯粹的 openMosix 文档。
如果您正在翻译本文档,请告知我们。
Ding Wei 用中文编写了一些文档,您可以在 http://software.ccidnet.com/pub/disp/Article?columnID=732&articleID=25795&pageNO=1 上阅读
这是中文文档的 本地 PDF 副本
Dmitry Katusubo 翻译了 openmosix 网站,并与 Yuri Prushinsky 一起翻译了 openMosix HOWTO http://www.openmosix.org.ru/docs/openMosix-HOWTO-multi/
使用 openMosix 集群的意大利经验 链接到会议上提出的几篇论文。这些论文涵盖了 openMosix 邮件列表中看到的许多常见问题
卡利亚里天文台 (pdf)在不受信任的网络环境中保护 openMosix 集群。
米兰大学 D.T.I.,Polo didattico e ricerca,Crema (pdf) 在 openMosix 上使用 Java 和 C 程序的经验。
Riello Group (pdf) 使用 openMosix 进行存储 (备份) 上的并行 I/O 负载均衡
INFM & 那不勒斯大学物理系 (pdf) 记录了许多小型到大型集群及其用途。(包括许多软件和项目的参考文献。)
Conecta srl (pdf) 包含有关 Kraken 的更多信息,Kraken 是基于 openMosix 的游戏服务器。其中包括他们如何通过 lmsenors 监控集群温度,以及他们如何使用 iproute2 队列控制改进节点间通信。
为本 HOWTO 做出贡献的人员名单很长,我实际上已经忘记了所有应该在这里的人员。我经常在他们贡献的部分旁边添加他们的名字。
如果您觉得您的名字遗漏在此处,请随时与我联系,我很乐意将您的名字添加到列表中。
Scot W. Stevenson
我必须感谢 Scot W. Stevenson 在我接手之前为本 HOWTO 所做的所有工作。他为本文档开了一个好头。
Assaf Spanier
与 Scott 一起起草了本 HOWTO 的布局和章节。现在承诺帮助我完成本文档。
Matthias Rechenburg
Matthias Rechenburg 应该感谢他在 openMosixview 和随附文档方面所做的工作,我们已将其包含在本 HOWTO 中。
Jean-David Marrow
是 Clump/OS 的作者,他将有关其发行版的文档贡献给了 HOWTO。
Bruce Knox
是 openMosix 网站的维护者,他尽其所能提供帮助并提供了大量反馈!
Evan Hisey
感谢他努力在 WIKI 中添加额外的文档
Charles Nadeau
感谢他努力在 WIKI 中添加额外的文档
Louis Zechter
Moshe Bar
感谢他编写的代码,并在他知道答案的地方帮助文档!
Amit Shah
感谢他开始研究 openMosix 内部原理
Mirko Caserta
感谢他向本 HOWTO 发送了大量的补丁
Ramon Pons
感谢他校对 HOWTO 并提供了一些建议
版本 1.1,2000 年 3 月
版权所有 (C) 2000 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 允许任何人复制和分发本许可证文档的完整副本,但不允许更改它。
本许可证的目的是使手册、教科书或其他书面文档在自由的意义上“自由”:以确保每个人都有效地自由地复制和再分发它,无论是否对其进行修改,无论是商业性还是非商业性。其次,本许可证为作者和出版商保留了一种为其作品获得荣誉的方式,同时不被视为对他人所做的修改负责。
本许可证是一种“反版权”,这意味着文档的衍生作品本身必须在相同的意义上是自由的。它补充了 GNU 通用公共许可证,后者是为自由软件设计的反版权许可证。
我们设计本许可证是为了将其用于自由软件的手册,因为自由软件需要自由文档:自由程序应附带提供与软件相同自由的手册。但是,本许可证不限于软件手册;它可以用于任何文本作品,无论主题是什么,也无论是否以印刷书籍形式出版。我们主要建议将本许可证用于目的在于指导或参考的作品。
本许可证适用于任何手册或其他包含版权所有者放置的声明的作品,声明该作品可以根据本许可证的条款分发。“文档”(以下简称“文档”)是指任何此类手册或作品。任何公众成员均为被许可人,并被称为“您”。
“文档的修改版本”是指包含文档或其一部分的任何作品,无论是逐字复制,还是进行修改和/或翻译成另一种语言。
“次要章节”是文档的命名附录或前言章节,专门处理文档的出版商或作者与文档的总体主题(或相关事项)的关系,并且不包含任何可以直接归入该总体主题的内容。(例如,如果文档部分是数学教科书,则次要章节可能不解释任何数学。)这种关系可能是与主题或相关事项的历史联系,或者与有关它们的法律、商业、哲学、伦理或政治立场有关。
“不变章节”是某些次要章节,其标题在声明文档根据本许可证发布的声明中被指定为不变章节的标题。
“封面文字”是在声明文档根据本许可证发布的声明中列出的某些短语,作为封面文字或封底文字。
“透明”文档副本是指机器可读的副本,以其规范可供公众使用的格式表示,其内容可以使用通用文本编辑器或(对于由像素组成的图像)通用绘画程序或(对于绘图)某些广泛可用的绘图编辑器直接且直接地查看和编辑,并且适合输入文本格式化程序或自动翻译成各种适合输入文本格式化程序的格式。以其他透明文件格式制作的副本,其标记旨在阻止或阻止读者随后进行修改,则不是透明的。不“透明”的副本称为“不透明”。
透明副本的合适格式示例包括没有标记的纯 ASCII、Texinfo 输入格式、LaTeX 输入格式、使用公开可用的 DTD 的 SGML 或 XML,以及为人工修改而设计的符合标准的简单 HTML。不透明格式包括 PostScript、PDF、只能由专有文字处理器读取和编辑的专有格式、DTD 和/或处理工具通常不可用的 SGML 或 XML,以及某些文字处理器仅出于输出目的而生成的机器生成的 HTML。
“标题页”对于印刷书籍,是指标题页本身,以及为清晰地容纳本许可证要求出现在标题页中的材料所需的后续页。对于没有标题页格式的作品,“标题页”是指最突出显示作品标题附近的文本,位于正文文本的开头之前。
您可以以任何媒介复制和分发文档,无论是商业性还是非商业性,前提是在所有副本中复制本许可证、版权声明和声明本许可证适用于文档的许可证声明,并且您不得在本许可证的条款中添加任何其他条件。您不得使用技术措施来阻止或控制您制作或分发的副本的阅读或进一步复制。但是,您可以接受报酬以换取副本。如果您分发的副本数量足够大,您还必须遵循第 3 节中的条件。
您也可以在上述相同的条件下借出副本,并且您可以公开展示副本。
如果您出版的文档印刷副本数量超过 100 份,并且文档的许可证声明要求封面文字,则您必须将副本装在封面上,封面上清晰且清晰地印有所有这些封面文字:封面上的封面文字和封底上的封底文字。两个封面还必须清晰且清晰地将您标识为这些副本的出版商。封面必须以标题中的所有单词同样突出和可见的方式呈现完整标题。您可以在封面上添加其他材料。只要封面保留文档的标题并满足这些条件,则对封面进行更改的复制可以被视为其他方面的逐字复制。
如果任一封面的所需文字太多而无法清晰地容纳,则应将列出的第一个文字(尽可能多地容纳)放在实际封面上,并将其余文字继续放在相邻页面上。
如果您出版或分发数量超过 100 份的文档不透明副本,则必须在每个不透明副本中包含一个机器可读的透明副本,或者在每个不透明副本中或随附声明一个公开可访问的计算机网络位置,其中包含文档的完整透明副本,不包含添加的材料,并且使用公共标准网络协议,一般网络用户可以匿名免费下载。如果您使用后一个选项,则当您开始批量分发不透明副本时,您必须采取合理谨慎的步骤,以确保此透明副本在声明的位置保持可访问状态,直到您向公众分发该版本的最后一个不透明副本(直接或通过您的代理商或零售商)后至少一年。
建议但不要求您在再分发大量副本之前与文档的作者联系,让他们有机会向您提供文档的更新版本。
您可以根据以上第 2 节和第 3 节的条件复制和分发文档的修改版本,前提是您根据本许可证精确地发布修改版本,修改版本在其中充当文档的角色,从而许可修改版本的发行和修改给拥有其副本的任何人。此外,您必须在修改版本中执行以下操作
在标题页(以及封面,如果有的话)中使用与文档标题不同的标题,以及与先前版本的标题不同的标题(如果存在任何先前版本,则应在文档的历史记录部分中列出)。如果该版本的原始出版商允许,您可以使用与先前版本相同的标题。
在标题页上,将一个或多个对修改版本的修改负责的个人或实体列为作者,并列出文档的至少五位主要作者(如果文档的主要作者少于五位,则列出所有主要作者)。
在标题页上,声明修改版本的出版商名称作为出版商。
保留文档的所有版权声明。
在其他版权声明旁边,为您的修改添加适当的版权声明。
在版权声明之后,立即包含一份许可声明,声明公众有权根据本许可证的条款使用修改版本,声明格式如下文附录所示。
在该许可声明中,保留文档许可声明中给出的不变章节和要求的封面文本的完整列表。
包含本许可证的未修改副本。
保留标题为“History”的章节及其标题,并在其中添加一项,至少说明标题页上给出的修改版本的标题、年份、新作者和出版商。如果文档中没有标题为“History”的章节,则创建一个,说明标题页上给出的文档的标题、年份、作者和出版商,然后添加一项,描述如前一句所述的修改版本。
保留文档中给出的任何网络位置,以便公众访问文档的透明副本,以及文档中给出的其所基于的先前版本的网络位置。这些可以放在“History”章节中。对于在文档本身至少四年前发布的作品,或者如果其引用的版本的原始出版商给予许可,您可以省略网络位置。
在任何标题为“Acknowledgements”或“Dedications”的章节中,保留该章节的标题,并在该章节中保留其中给出的每个贡献者致谢和/或献词的所有实质内容和语气。
保留文档的所有不变章节,其文本和标题均不得修改。章节编号或等效内容不被视为章节标题的一部分。
删除任何标题为“Endorsements”的章节。修改版本中不得包含此类章节。
不要将任何现有章节重命名为“Endorsements”,或使其标题与任何不变章节的标题冲突。
如果修改版本包含符合二级章节条件的新前置章节或附录,并且不包含从文档复制的材料,您可以选择将其中部分或全部章节指定为不变章节。为此,请将它们的标题添加到修改版本的许可声明中的不变章节列表中。这些标题必须与任何其他章节标题不同。
您可以添加一个标题为“Endorsements”的章节,前提是它只包含各方对您的修改版本的认可——例如,同行评审声明或文本已被某个组织批准为标准的权威定义。
您可以在修改版本的封面文本列表末尾添加最多五个单词的封面前页文本,以及最多 25 个单词的封底文本。任何一个实体只能添加(或通过安排添加)一段封面前页文本和一段封底文本。如果文档已经包含同一封面的封面文本,该文本 ранее 由您添加或通过您代表的同一实体安排添加,则您不得添加另一个;但您可以在获得添加旧文本的前出版商的明确许可后替换旧文本。
文档的作者和出版商并未通过本许可证授予使用其姓名进行宣传或声明或暗示认可任何修改版本的许可。
您可以将文档与根据本许可证发布的其他文档合并,根据上文第 4 节中为修改版本定义的条款,前提是您在合并中包含所有原始文档的所有不变章节,且不得修改,并在其许可声明中将它们全部列为合并作品的不变章节。
合并的作品只需要包含一份本许可证的副本,多个相同的不变章节可以用单个副本替换。如果有多个名称相同但内容不同的不变章节,请通过在其末尾添加括号,注明该章节的原始作者或出版商的名称(如果已知),或者添加一个唯一的数字,使每个此类章节的标题唯一。在合并作品的许可声明中的不变章节列表中,对章节标题进行相同的调整。
在合并中,您必须合并各个原始文档中任何标题为“History”的章节,形成一个标题为“History”的章节;同样合并任何标题为“Acknowledgements”的章节和任何标题为“Dedications”的章节。您必须删除所有标题为“Endorsements”的章节。
您可以创建一个集合,其中包含文档和根据本许可证发布的其他文档,并将各个文档中本许可证的单独副本替换为集合中包含的单个副本,前提是您在所有其他方面都遵循本许可证关于每个文档逐字复制的规则。
您可以从此类集合中提取单个文档,并根据本许可证单独分发,前提是您在提取的文档中插入本许可证的副本,并在关于该文档逐字复制的所有其他方面都遵循本许可证。
在存储或分发介质的卷中或卷上,将文档或其衍生作品与其他单独且独立的文档或作品汇编在一起,整体上不计为文档的修改版本,前提是未对汇编声明汇编版权。这种汇编称为“聚合”,并且本许可证不适用于与文档汇编在一起的其他独立作品,因为它们是这样汇编在一起的,如果它们本身不是文档的衍生作品。
如果第 3 节的封面文本要求适用于文档的这些副本,那么如果文档小于整个聚合的四分之一,则文档的封面文本可以放置在仅围绕聚合内文档的封面上。否则,它们必须出现在围绕整个聚合的封面上。
翻译被认为是一种修改,因此您可以根据第 4 节的条款分发文档的翻译。用翻译替换不变章节需要其版权持有人的特别许可,但您可以除了这些不变章节的原始版本之外,还包括部分或全部不变章节的翻译。您可以包含本许可证的翻译,前提是您也包含本许可证的原始英文版本。如果翻译版本与本许可证的原始英文版本之间存在分歧,则以原始英文版本为准。
除非本许可证明确规定,否则您不得复制、修改、再许可或分发文档。任何其他尝试复制、修改、再许可或分发文档的行为均属无效,并将自动终止您在本许可证下的权利。但是,根据本许可证从您处收到副本或权利的各方,只要这些方保持完全合规,其许可证就不会终止。
自由软件基金会可能会不时发布 GNU 自由文档许可证的新修订版本。这些新版本在精神上与当前版本相似,但在细节上可能有所不同,以解决新的问题或疑虑。请参阅 https://gnu.ac.cn/copyleft/。
本许可证的每个版本都有一个区分版本号。如果文档指定本许可证的特定编号版本“或任何后续版本”适用于它,您可以选择遵循指定版本的条款和条件,或者遵循自由软件基金会已发布的(非草案)任何后续版本的条款和条件。如果文档未指定本许可证的版本号,您可以选择自由软件基金会曾发布的(非草案)任何版本。
要在您编写的文档中使用本许可证,请在文档中包含本许可证的副本,并将以下版权和许可声明放在标题页之后
版权所有 (c) 年份 您的姓名。根据自由软件基金会发布的 GNU 自由文档许可证 1.1 版或任何后续版本的条款,授予复制、分发和/或修改本文档的许可;不变章节为 列出它们的标题,封面前页文本为 列出,封底文本为 列出。许可证的副本包含在标题为“GNU 自由文档许可证”的章节中。
如果您没有不变章节,请写“没有不变章节”,而不是说哪些是不变的。如果您没有封面前页文本,请写“没有封面前页文本”,而不是“封面前页文本为 列出”;封底文本也一样。
如果您的文档包含重要的程序代码示例,我们建议您在您选择的自由软件许可证(例如 GNU 通用公共许可证)下并行发布这些示例,以允许在自由软件中使用它们。