关键服务器需求和 Linux 内核
本文提供了一些在任务关键型环境(如电信)中运行的服务器节点所需的 Linux 内核中的特性和机制示例,在这些环境中,可靠性、性能、可用性和安全性至关重要。在此,我们讨论了四个这样的特性:集群通信协议、对多 FIB 的支持、在运行时验证二进制文件数字签名的模块以及高效的低级异步事件机制。对于其中一些示例特性,已经存在开源项目来提供它们的实现。对于其他特性,目前没有开源项目可以实现它们。对于我们的四个示例特性中的每一个,我们都讨论了该特性、其重要性、它提供的优势、可用时的实现以及其与 Linux 内核集成的状态。
今天的计算和电信环境越来越多地采用集群服务器,以获得性能、可用性和可扩展性方面的优势。集群带来的好处比单台服务器提供的更大和/或更具成本效益。此外,在电信行业中,对集群的兴趣源于这样一个事实,即集群使用具有成本效益的硬件和软件来解决运营商级特性——保证服务可用性、可靠性和可扩展的性能。在不绝对要求这些要求的情况下,可以将它们分为三类:短故障检测和故障恢复、保证服务可用性和短响应时间。最广泛采用的集群技术是使用多个互连的、松散耦合的节点来创建一个单一的高可用性系统。
电信服务器中集群的直接优势包括
通过冗余和故障转移技术实现高可用性,这些技术隔离或减少机器、资源或设备故障的影响。
通过适当的系统管理设施实现可管理性,从而降低系统管理成本并平衡负载以实现高效的资源利用。
通过扩展集群的容量来提高可扩展性和性能,方法是添加更多服务器,或者就服务器而言,添加更多处理器、内存、存储或其他资源来支持增长并实现更高的性能水平。
此外,在集群系统中使用商用现成构建模块具有许多优势,包括与专用并行超级计算机相比更好的性价比;部署最新的大众市场技术,因为它可以低成本地获得;以及从最新的标准操作系统特性中获得额外的好处,因为它们变得可用。
Linux 内核在该领域缺少的一个特性是可靠、高效和透明的进程间和处理器间通信协议,我们可以使用它来构建高可用性的 Linux 集群。透明进程间通信 (TIPC) 是一种合适的开源实现,它填补了这一空白,并提供了一种高效的集群通信协议,利用了松散耦合集群中存在的特定条件。

图 1. TIPC 的功能视图
TIPC 是独一无二的,因为似乎没有其他协议能够提供可比的多功能性和性能组合。它包括一些原始创新,例如功能寻址、拓扑订阅服务和反应式连接概念。其他重要的 TIPC 功能包括完全位置透明性、对轻量级连接的支持、可靠的多播、信令链路协议、拓扑订阅服务等等。
对于任何想要开发或使用运营商级或高可用性 Linux 集群的人来说,TIPC 都应该被视为一个有用的工具箱。它为集群、网络和软件管理功能提供了必要的基础设施,并为设计与站点无关、可扩展、分布式、高可用性和高性能应用程序提供了良好的支持。
还值得一提的是,IETF 内的 ForCES 工作组已经同意,必须可以跨不同类型的传输协议承载其路由器内部协议(ForCES 协议)。人们一致认为,当 ForCES 消息通过互联网传输时,应使用 TCP 协议,而在封闭环境(LAN)中,应使用 TIPC 协议,在这些环境中,高性能和多播支持等特殊特性是理想的。也可以添加其他协议作为选项。
此外,TIPC 还满足 OSDL 运营商级 Linux 需求定义版本 2.0 和 3.0 中定义的多个优先级 1 和 2 需求,为集群通信服务需求下的各种协议提供实现。
TIPC 是爱立信对开源社区的贡献。在过去两年中,它经历了重大的重新设计,现在可以作为一个可移植的源代码包提供,大约有 12,000 行 C 代码。该代码实现了一个内核驱动程序,这种设计使得性能提高了 35%(比 TCP 快),并最大限度地减少了代码占用空间。当前版本在双 BSD 和 GPL 许可下可用。它运行在 Linux 2.4 和 2.6 上,并在 LKML 上宣布(见资源)。存在几个到其他操作系统的专有端口(OSE、True64、Dicos、VxWare),并且计划在 2004 年底之前推出更多端口。
路由器是现代电信网络的核心要素。它们使用空中传输设备或高速链路传播和定向来自其源到其目的地的数十亿个数据包。路由器必须以与其使用的介质相同的速度运行,以便提供最佳的服务质量,并对通信产生可忽略不计的影响。给出一些数字,路由器通常管理 10,000 到 500,000 条路由。在这些情况下,通过处理大约 2,000 条路由/秒可以实现良好的性能。
Linux 中 IP 堆栈的实际实现对于家庭或小型企业路由器来说运行良好。然而,由于电信运营商的高度期望和电信硬件的新功能,几乎不可能将 Linux 用作大型网络(核心/边界/接入路由器)或具有路由功能的高端服务器的高效转发和路由元件。
Linux 中网络堆栈的两个问题是缺乏对具有重叠接口 IP 地址的多个转发信息库 (multi-FIB) 的支持,以及缺乏用于寻址 FIB 的适当接口。当前实现的另一个问题是路由表的可扩展性有限。
解决这些问题的方案是提供对具有重叠 IP 地址的多 FIB 的支持。这样,我们可以在同一个 Linux 盒子中拥有形成独立网络的不同 VLAN 或不同的物理接口。分隔 VLAN 的一个好理由是为了通过服务分离来实现安全性。例如,具有连接到它的多个公司网络的 GSN 节点可以使用 VLAN 进行分隔,但这可能不适用于节点的另一侧。保持分隔(和安全性)的唯一方法是拥有多个 FIB。
考虑图 2 的示例,其中有两个 HTTP 服务器为两个不同的网络提供服务,这两个网络可能具有相同的 IP 地址。一个 HTTP 服务器为网络/FIB 10 提供服务,而另一个 HTTP 服务器为网络/FIB 20 提供服务。获得的优势是使用一个 Linux 盒子为两个不同的客户提供服务,使用相同的 IP 地址。ISP 采用这种方法,通过为共享同一服务器的多个客户提供服务(服务器分区),而不是为每个客户使用一个服务器。

图 2. 用法示例
实现这一目标的途径是拥有一个 ID(标识服务客户或用户的标识符),以便在内存中完全分隔路由表。实现此目的有两种方法。第一种方法是拥有单独的路由表;每个路由表都通过其 ID 查找,并在该表内通过前缀完成查找。第二种方法是拥有一个表,其中查找是在组合键 = 前缀 + ID 上完成的。
当我们无法预测路由缓存和 FIB 的哈希表中的链接访问时间时,会出现另一种问题。在需要可预测性能的环境中,这个问题尤其令人关注。
问题的另一个方面是路由缓存和路由表在大多数时候没有保持同步(路径 MTU,仅举一个例子)。路由缓存刷新定期执行;因此,缓存上的任何更新都会丢失。例如,如果您有路由缓存刷新,则必须通过遍历哈希/尝试表中的每条路由并重建信息来重建当前正在与之通信的每条路由。首先,您必须在路由缓存中查找它;如果您未命中,则需要进入哈希/尝试表。此过程缓慢且不可预测,因为哈希/尝试表是使用链表实现的,并且当存在大量路由时,发生冲突的可能性很高。这种设计适用于只有少量路由的家用 PC,但不适用于大型服务器。
为了支持在高性能、任务关键型环境中运行的服务器节点的各种路由需求,Linux 应支持以下内容
使用树(基数树、Patricia 树等)实现多 FIB。重要的是在 10,000 到 500,000 条路由的插入/删除/查找中具有可预测的性能。此外,最好对 IPv4 和 IPv6 使用相同的数据结构。
用于寻址多 FIB 的套接字和 ioctl 接口。
对邻居(arp)的多 FIB 支持。
在 Linux 中提供这些实现会影响 net/core、net/ipv4 和 net/ipv6 的大部分;这些子系统,主要是网络层,将需要重写。其他区域在源代码级别的影响最小;大部分影响将在传输层——套接字、TCP、UDP、RAW、NAT、IPIP、IGMP 等。
至于是否有开源项目可以提供这些功能,现有的 Linux 虚拟路由和转发项目可能能够提供帮助。该项目旨在实现一种灵活且可扩展的机制,用于在 Linux 内核中提供多个路由实例。该项目在提供所需功能方面具有一些潜力;但是,自 2002 年以来没有取得任何进展,并且该项目现在似乎处于非活动状态。
分布式安全基础设施 (DSI) 是爱立信启动的一个开源项目,旨在为运行软实时分布式应用程序的运营商级 Linux 集群提供安全框架。运营商级集群对性能和响应时间有严格的限制,使得安全解决方案的设计变得困难。许多安全解决方案由于其高资源消耗而无法使用。因此,需要一个针对运营商级 Linux 集群的安全框架来在此类系统中提供高级安全级别。
Linux 通常被认为对互联网上病毒、后门和木马程序的传播免疫。然而,随着 Linux 作为桌面平台的日益普及,看到为该平台开发的病毒或木马的风险正在增加。解决这种潜在风险的一种方法是允许系统在运行时阻止执行不受信任的软件。
一种解决方案是对受信任的二进制文件进行数字签名,并让系统在运行二进制文件之前检查二进制文件的数字签名。因此,不受信任(未签名)的二进制文件将被拒绝执行。这可以通过避免大量恶意二进制文件在系统上运行来提高系统的安全性。

图 3. bsign 的签名部分,如在 ELF 二进制文件中添加的

图 4. DigSig 运行中
DigSig 是 DSI 的一个组件,是这种特性的一个实现。DigSig 是一个 Linux 内核模块,它在运行二进制文件之前检查二进制文件的签名。DigSig 将数字签名插入到 ELF 二进制文件中,并在加载二进制文件之前验证此签名。它基于 Linux 安全模块 (LSM) 钩子。自 2.5.x 及更高版本以来,LSM 已集成到 Linux 内核中。
通常,在这种方法中,供应商不签署二进制文件;系统的控制权仍然在本地管理员手中。负责任的管理员使用其私钥签署她信任的所有二进制文件。因此,DigSig 保证了两件事。首先,如果您签署了一个二进制文件,则任何人都无法在不被检测到的情况下修改该二进制文件。其次,没有人可以运行未签名或签名不正确的二进制文件。
在该领域已经进行了多项举措,例如 Tripwire、bsign 和 Cryptomark,但我们认为 DigSig 项目是第一个易于所有人访问的项目——它在 SourceForge 上以 GPL 许可提供——并在运行时在内核级别运行。运行时对于运营商级环境尤为重要,因为它考虑了系统的高可用性方面。
DigSig 方法一直在使用现有的解决方案,例如 GnuPG 和 bsign,而不是重新发明轮子。然而,为了减少内核中的开销,DigSig 项目仅从 GnuPG 中提取了必要的最小代码。这有助于减少导入到内核的代码量;只有原始 GnuPG 1.2.2 源代码的十分之一被导入到内核模块。
DigSig 是爱立信根据 GPL 许可对开源社区的贡献。DigSig 已在 LKML 上宣布;但是,它尚未集成到 Linux 内核中。
运营商级系统的操作系统必须能够提供高响应率和最短的停机时间。此外,运营商级系统必须考虑可扩展性、高可用性和性能等特性。
在运营商级系统中,必须同时处理数千个请求,而不会影响整体系统性能,即使在极高的负载下也是如此。订阅者在发出请求时会期望一定的延迟时间,但他们不愿意接受无限的响应时间。由于许多原因,此类事务不会立即处理,并且可能需要几毫秒或几秒钟才能回复。等待答案会降低应用程序处理其他事务的能力。
已经提出了许多不同的解决方案并进行了原型设计,以提高 Linux 内核在该领域的能力。大多数解决方案都侧重于使用不同类型的软件组织,例如多线程架构、实现高效的 POSIX 接口或提高现有内核例程的可扩展性。
适用于运营商级服务器的一种可能的解决方案是异步事件机制 (AEM)。AEM 在 Linux 内核中提供异步进程执行。它实现了对 Linux 内核中异步事件的本机支持,旨在为 Linux 带来可扩展性、性能和软实时响应能力方面的运营商级特性。
基于事件的机制提供了一种新的编程模型,为软件开发人员提供了独特而强大的支持,以实现进程的异步执行。当然,它与使用的顺序编程风格截然不同,但它提供了一个更适合软件开发的结构化设计框架。它还简化了复杂软件组件的集成和互操作性。此外,AEM 还提供了一个基于事件的开发框架、可扩展性、灵活性和可扩展性。
新兴的 AEM 范例提供了一种更简单、更自然的编程风格,与多线程架构提供的复杂性相比。它证明了其在多层软件架构开发中的效率,其中每一层都为上层提供服务。这种类型的架构对于分布式应用程序非常常见。AEM 的优势之一是它能够在同一应用程序中组合同步和异步代码,甚至在同一代码例程中混合这两种类型的模型。通过这种混合方法,可以根据具体情况利用它们各自的功能。这种模型尤其有利于安全软件的开发和任务关键型应用程序的长期维护。
爱立信于 2003 年 2 月根据 GPL 许可向开源社区发布了 AEM。AEM 已在 LKML 上宣布,并收到了很多反馈。反馈建议对设计进行更改,从而改进了实现并获得了更好的内核兼容代码结构。AEM 尚未集成到 Linux 内核中。
Ibrahim Haddad 在加拿大蒙特利尔的爱立信研究部门工作。他还担任 Linux Journal 的特约编辑。Ibrahim 与 Richard Peterson 合著了 Red Hat Linux Pocket Administrator 和 Red Hat Enterprise and Fedora Edition: The Complete Reference (DVD 版),均由 McGraw-Hill/Osborne 出版。他目前是康考迪亚大学的理学博士候选人。