太空中的首个 Beowulf 集群

作者:Ian McLoughlin

当艾森豪威尔总统在 1995 年的日内瓦峰会上向苏联代表团提出“开放天空政策”时,这未能成功地使美国一个月后发射 U2 间谍机的计划合法化。 五十年后,“开放天空”随着新加坡 X-Sat 的发射成为现实。 有什么比开源更能补充“开放天空”呢? 显而易见的是,当可靠性至关重要时,Linux 源代码的透明和开放性是宝贵的帮助。

在 X-Sat 项目的开始阶段,该项目专注于开发新加坡的第一颗卫星,有人提出了使用 Linux 的论点,但遭到断然拒绝。 当时,对于嵌入式系统使用而言,Linux 是一种深奥的局外人,尚未渗透到空间发展领域决策者的意识中。 此外,新加坡通常不以冒险而闻名,并且就卫星而言,赞成这种态度确实是有道理的。 相比之下,VxWorks 具有出色的空间遗产,但这并不能保证成功。

虽然卫星的主计算机运行 VxWorks,但 Linux 为数据处理计算机提供动力。 这实际上是一个松散耦合的集群,称为并行处理单元 (PPU),它是 Linux 在太空中的第一个分布式示例。 这个概念是在简单的重新编译和从地面 Linux 开发平台上传过程之后,直接在太空中运行卫星图像处理应用程序。 让我们比较一下主板载计算机 (OBC) 和 PPU(表 1)。

表 1. X-Sat 同时具有板载计算机 (OBC) 和并行处理单元 (PPU)。

 OBCPPU
处理器2 x ERC3220 x SA 1110
配置冷冗余备用随你喜欢
峰值性能 [MIPS]204,000
总内存 [MB]81,280
尺寸 [cm3]3,1253,125
功耗 [瓦]大约 225
硬件成本 [美元]50,0003,500
处理成本 [美元 / MIPS]2,5000.88
处理体积 [cm3 / MIPS]156.250.78
处理能力 [mW / MIPS]506.25
操作系统VxWorksLinux
操作系统成本数千美元免费

OBC 如此昂贵,是因为它使用了昂贵的抗辐射加固组件,而 PPU 主要使用商用现货 (COTS) 组件。 传统上,通过使用最可靠的单个组件来在恶劣环境中生存,从而确保了太空中的可靠性。 但是 PPU 体现了一个相对较新的概念——至少在太空领域——通过冗余实现可靠性。 尽管 PPU 的每个单个组件在太空中的可靠性不如 OBC 组件,但每个 PPU 处理器都有 20 个副本,因此即使一个接一个地失败,仍然会剩下一些东西。 该设计几乎消除了单点故障,即单个组件故障可能导致整个系统或多个组件瘫痪。 最重要的是,PPU 的特点是从完全工作的 20 处理器系统到单处理器系统的优雅降级。 因此,良好的设计可确保在设计寿命结束时仍能运行的单个 PPU 处理器的概率与 OBC 同时仍能运行的概率相匹配。 即使只有一个幸存的处理器,它仍然可以击败 OBC。

X-Sat

X-Sat 是一颗 100 公斤的微型卫星,大致是一个 80 厘米的立方体,如图 1 的 CAD 模型所示。这颗卫星是新加坡南洋理工大学的一个教育项目,带有三个有效载荷:一个 10 米分辨率的多光谱(彩色)相机,用于获取新加坡地区的图像;一个用于澳大利亚分布式传感器网络的无线电链路;以及最值得注意的是 PPU。 从项目一开始,X-Sat 就是一个开放的卫星,详细信息公开可用,还有什么比使用开源软件更好的理由呢?

First Beowulf Cluster in Space

图 1. X-Sat 大小约为 80 厘米,带有一个彩色相机、无线电链路和一个 Linux 集群。

通信使用 S 波段,上行链路为 4kb/s,下行链路为 500kb/s,以及通过 X 波段的单向 50Mb/s 下行链路进行图像转储。 但是,X 波段需要专用的 13 米抛物面天线才能接收,并且仅当卫星位于新加坡上空时才能工作。 在其预期的太阳同步 685 公里轨道上,这种情况每天仅发生几分钟,这导致了 PPU 的主要原理。 假设每个轨道的保守占空比为 10%,则相机每天可以生成 81GB 的数据,但只能下行链路 12% 的数据。 凭借三年设计寿命和数百万美元的成本,每张照片的成本都非常昂贵。

如果我们想要每张照片的最大价值,并且必须丢弃 88% 的图像,我们应该选择哪些图像? 任何去过新加坡的人都应该记得阴沉的天空。 事实证明,新加坡上空 90% 的卫星照片仅显示云和雾霾。 尽管这可能会让气象学家感到兴奋,但对我们来说,这是一种浪费金钱的行为。 我们只能从我们下载的 12% 的照片中获得 10% 的价值——成功率为 1.2%! 因此,如果在下载之前有任何方法可以确定照片是否被云遮挡,或者甚至可以剪掉多云的部分并下载其余部分,那么这很有价值。 嗯,你猜对了,这样的应用程序确实存在。 它们在 Linux Beowulf 集群上运行,需要大量 MIPS,并且非常适合我们的 PPU。

PPU 设计

PPU 由两个防熔丝 Actel 现场可编程门阵列 (FPGA) 组成,已知它们比 Xilinx 或 Altera 的其他解决方案更耐辐射。 每个 FPGA 托管十个处理节点 (PN),每个处理节点都有一个 206MHz StrongARM 处理器和 64MB SDRAM。 单个 FPGA 连接到三个 Atmel 4MB 串行闪存芯片,其中包含引导加载程序、操作系统内核和文件系统映像,其中包括选定的图像处理应用程序。 当然,程序可以在卫星在太空中时动态添加,就像它是常规的 Linux 集群一样。

PPU 通过相当慢的四冗余控制器局域网 (CAN) 链路和两个快速 (200Mb/s) 的低压差分信号 (LVDS) 链路连接到卫星的其余部分,用于来自板载相机的图像数据。 图 2 显示了硬件架构的概述。 最值得一提的是,PPU 还可以从 OBC 接管卫星控制。 事实上,这是应该验证软件和硬件 COTS 组件可以完成关键任务的实验之一。

First Beowulf Cluster in Space

图 2. 该集群基于两个 FPGA,每个 FPGA 连接到十个 206MHz StrongARM 处理器。

在内部,PPU 类似于基于集群的计算系统,FPGA 提供互连网络。 事实上,这些集线器本身可以提供图像处理功能。 集群概念意味着我们可以牺牲 PN 来避免故障,并且仍然可以继续系统运行。 它还赋予每个 PN 足够的自主权以同时运行多个算法。 由于每个 FPGA 都有自己独立的通信链路,因此即使发生严重故障(例如整个 FPGA 被破坏),PPU 也可以继续运行。

并行总线将每个 PN 连接到 FPGA。 鉴于十个 PN 与一个 FPGA 通信,因此 FPGA 上的硬件 I/O 引脚成为一个限制。 不可能支持十个完整的 32 位总线。 16 位数据总线是下一个合理的选择,但会导致有效总线带宽减半。 但是,已经进行了相当大的努力以确保这个精简的接口高效运行,并且它产生了一个新的 17 位数据总线,稍后将对此进行讨论。 从 PN 的角度来看,FPGA 使用可寻址窗口概念映射到地址空间中,以减少并行总线需求。

启动

PN 的启动是按顺序进行的,以减少启动时的峰值功率,它由三个阶段组成。 首先,StrongARM 以 16 位访问模式运行,直接从 FPGA 的最低地址窗口执行代码。 尽管这会转换为半带宽内存访问,但 ARM 汇编程序引导加载程序的小尺寸(512 字节)使其可以接受。 引导加载程序是一个小于 5,122 字节的微型 ARM 汇编程序编码例程,它直接从 FPGA 的最低地址窗口执行。 它初始化 StrongARM,设置 SDRAM,然后从串行闪存加载第二阶段。 第二阶段从串行闪存检索内核和 ramdisk,执行内核解压缩程序并启动 Linux。 最后,第三个引导加载程序阶段由 bzImage 组成,它将其自身解压缩到适当的内存位置,然后执行内核,内核然后解压缩其 ext2 initrd ramdisk。

17 位总线接口和协议

与 PN 的所有通信都通过 FPGA 进行。 内核设备驱动程序加上用户空间库为 Linux 应用程序提供标准接口 API。 底层驱动程序维护两个文件系统字符设备,这些设备实现中断处理和软件接收/发送缓冲区。 为了保持驱动程序高效和简单,禁用了内核抢占。 驱动程序还会定期写入 FPGA 中的看门狗寄存器,作为心跳信号,导致超时时重新启动。

在 PPU 中,从 PN 到 FPGA 的写入分为两类:控制和消息数据。 消息数据通常用于另一个 PN,而控制数据指示 FPGA 或 PN 执行某些操作。 同样,PN 对 FPGA 的读取也分为这些类别。

如果消息数据通过FPGA从一个PN写入另一个PN,则必须对发送给特定PN的每个数据项进行寻址。寻址信息要么是每个传输的字的一部分,要么是预先设置好的。在PPU中,出于效率考虑,消息路径在PN控制下预先设置好,假设大多数传输量很大——对于卫星图像来说,这毫无疑问是如此。但是,一个传输 16 位数据消息的 16 位接口必须有一种机制来区分数据包和地址包。这可以通过将它们写入 FPGA 中单独的地址寄存器来实现。

然而,读取 FPGA 的情况更为复杂。一个 16 位总线需要两次读取才能获得每个消息:一次读取用于确定消息类型和/或长度,另一次读取用于传输实际消息。但由于我们的消息长度可变,因此消息的定时存在一个直接问题。原因是使用中断信号来指示等待读取的 16 位值,PN有义务响应。因此,对于长消息,FPGA 会读取一系列 16 位的半字。但它没有明显的手段来区分插入到该序列中的 16 位控制字。我们可以在所有半字前加上类型标头,但这将意味着每个消息半字需要两次读取——使带宽减半。

我们的解决方案是采用 17 位总线,StrongARMs 在 32 位访问模式下运行。原始数据和命令共享物理链接作为半字,它们的类型通过一个特殊的第 17 位的状态来区分,该位向 PN 指示传入的项是数据还是控制消息。最重要的是,它在不需要任何额外的读取周期或额外的总线带宽的情况下实现了这一点。

如果驱动模块不能直接利用 ARM 的加载-存储特性以及所有指令都是有条件的这一事实,那么这种方法就不会引起人们的兴趣。前者意味着从 17 位总线读取的 32 位数据被加载到内部寄存器中,然后再移动到内存。后者意味着,如果接口的第 17 位连接到最高有效数据位 D31,而不是更明显的 D16 选择,则它可以用来影响零标志。因此,通过条件数据移动可以控制到两个内部内存缓冲区的其中一个的数据目的地。与大多数其他处理器使用的效率低下的条件分支相比,这非常高效。以下汇编代码提供了一个示例,其中 r0、r1、r2 和 r3 分别是 FPGA 数据传输地址、控制字缓冲区、消息字缓冲区和类型的寄存器。总而言之,优化解决方案的代码速度提高了 33%,并且少用了一个寄存器

方案一——默认读取方法

...
LDR   r4, [r0]        ; Load FPGA value
LDR   r5, [r3]        ; Load type register
TST   r5, #0x80000000 ; Check for D31
STREQ r4, [r1]        ; Z flag set (control)
STRNE r4, [r2]        ; Z flag not set (message)
B     _repeat         ; Loop again

方案二——优化读取方法

...
LDR   r4, [r0]        ; Load FPGA value
STRMI r4, [r1]        ; N flag set (control)
STRPL r4, [r2]        ; N flag not set (message)
B     _repeat         ; Loop again
...
软件错误检测与纠正

所有卫星都会受到宇宙射线辐射。除了老化效应外,最常见的后果是 SDRAM 和 CPU 中出现随机位翻转错误。如果不加以检查,这些最终会导致大规模的数据损坏。从软件的角度来看,每次计算的结果以及内存中的每个字都是可疑的。毫无疑问,必须在任何天基系统中实施一种检测和纠正此类错误的机制。

用于错误检测和纠正 (EDAC) 保护的典型解决方案涉及定制硬件校验和生成器。但是对于我们的 20 处理器 PPU 来说,校验和解决方案过于复杂,因此我们采用效率较低但更简单的多层软件方法。EDAC 进程定期在内核空间中调度,以提供错误保护。第二个 EDAC 进程允许相互交叉检查以实现冗余。

在我们系统中,关键代码的过程完整性验证在 EDAC 进程的计划运行之间执行。此外,还监控受保护的软件程序的输入和输出值。如果检测到意外值,系统会采用清理方法、重试计算、输出先前计算的值或使用最重要的位翻转校正方案。使用哪一种方法是在每个函数的参数化验证表中配置的,该表同样受到 EDAC 保护。

C 代码通过单个头文件和可链接的库代码进行保护。函数入口定义是手动插入的

#define EDAC_CHECK \ entry_check_edac( __func__);

GCC 在编译时使用正在输入的函数的字符串名称解析 __func__。按需 EDAC 进程在函数执行之前调用。返回重定义类似

#define return(z)
return_check_edac( __func__,\ __builtin_return_address, z);
return(z);

开发人员将其插入到代码中,如下面的示例程序所示

int calc(int x, int y) {
    EDAC_CHECK .....
    return(z); }

使用这个,一个运行不正常的程序不会造成太大的损害。但即使内核参与其中,心跳丢失也会触发重新启动。为了最大限度地减少对其他任务的影响,最好每个节点同时只运行一个用户应用程序——当然,这由用户自行决定。

应用和算法

那么,PPU 在发射后应该做什么呢?即使硬件成本相对于整个卫星预算几乎可以忽略不计,但由于发射价格约为 10,000 美元/千克,因此每一克都必须得到强有力的证明。目前,最重要的 PPU 任务是使用内容驱动的 JPEG2000 方案进行图像压缩。但 PPU 的主要优势在于其“站岗”能力,即摄像头持续监控地球,图像数据在评估后如果无价值则立即丢弃。如果检测到有价值的信息(在软件控制下),则保留获得的场景以供后续传输。但更重要的是,X-Sat 可以立即将其发现的结果传输到地面上的移动终端——每个终端的尺寸和价格都与传统的晶体管收音机相当。如果例如在 2004 年节礼日苏门答腊岛西北部地震引发海啸导致超过 285,000 人死亡时,此类系统已经到位,那么这种概念的意义很容易理解。

目前,支持两个特定应用:石油泄漏检测和人为和自然火灾产生的雾霾观测。两者都利用 FPGA 提供的额外处理能力来预处理流入各个处理器的图像数据。图 3 中的图像是在一天轨道完整日照期间模拟采集活动中的示例。来自 10% 占空比的原始数据覆盖约 300 万平方公里的区域。如果只有 0.001% 的数据显示石油泄漏,则相当于 62 次灾难性的Prestige石油泄漏。借助功能齐全的 PPU,同时执行两个灾难检测任务的处理时间占每日总轨道时间的 25%。然而,与此相反,它允许评估所有数据,而不仅仅是地面上的小部分数据。

First Beowulf Cluster in Space

图 3. PPU 的处理能力使它能够在卫星上检测石油泄漏和火灾,而无需下载所有原始数据。

发射进入新的太空时代

从工程师的角度来看,如果没有 Linux,X-Sat 及其 PPU 就无法成功:遥感领域几乎所有当前的应用程序开发都使用 Linux,大多数现代集群系统也是如此。因此,在 2007 年初的某个时候,如果你在正确的时间向后倾斜你的头,你可能会被摄像机拍到、处理并下载,这要归功于 Linux。

本文的资源: /article/8399

伊恩从 1856 年左右就开始使用 Linux,并在企鹅的电子乳头上喂养了他的孩子们。他的兴趣包括卫星和信号处理,他的职业目标是失去工作并成为中国的一名传教士。

尽管 Timo 没有尝试用企鹅喂养他的女儿,但他使用 Linux 来解决他在 Beowulf 集群上的大多数数字运算问题,并且未来将在太空领域更广泛地使用 Linux。Timo 的研究重点是遥感和各种图像处理问题,除非他去旅行了。

Bharath 为惠普设计高性能系统。他本身性能不高,因此他依靠办公桌下的宠物猴子来提出硬件设计。偶尔,它也会为封面上带有企鹅的杂志撰写文章。

加载 Disqus 评论