Linux内核版本 3.3 和 3.4 包括一个令人印象深刻的特性集,但是在某种意义上它们也是不详预兆的里程碑。版本 3.3 是第一个超过 1500 万行代码的 Linux 版本(采用了一种确实存在缺陷的测量方法测量的)。如果减去 Linux 内核的变体部分(比如驱动程序、架构相关代码和各种工具),数量可能会下降到 400 万以下(仍然是一个庞然大物)。
关于这个里程碑潜在的不详预兆有两个方面,Linux 内核的增长速度(自 2008 年以来增长了 50%)以及这种增长速度是否会对 Linux 内核效率(功率和性能)产生负面影响。功率和性能通常不是以每个补丁为基础进行测量,所以一个 bug 可能很容易蔓延到已发布内核中,并存留一段时间(例如,在版本 3.3 中修复的 PCI Express [PCIe] Active State Power Management 功率问题,在内核中已经存在一年了)。
Linux 内核版本控制
内核使用一个由 3 部分组成的数字组合进行版本控制,该数字组合是由一个内核版本、一个主要修订和微小修订(例如,3.3.4)构成。候选发布版本内核包括一个 rc#"后缀,该后缀中包含一个数字,代表具体候选版本(例如,当前版本是 3.5rc1)。
在不到 21 年的时间内,Linux 已经从 10,000 多行代码增长到超过 1500 万行代码。尽管大多数代码驻留于驱动程序子树中,但内核的复杂性随着代码的增多在不断增加。很快有一天,这种扩大可能会导致修改内核来消除复杂性并提高其可维护性。
如 图 1 所示,版本 2.4 自 2001 年发布以来,Linux 内核增长迅速(从 3,377,902 行增加到 2012 的 14,998,651 行)。这段时期内,每年几乎有大约 100 万行新代码被添加到内核中。这是一个惊人的数字,会让每个软件开发人员都感到恐惧。
图 1. 版本 2.2(2001 年)到版本 3.3(2012 年)的内核大小
引用 Torvalds 自己的话,随着内核的增长他很担心未来的维护。内核中大约有 400 万行代码,当前内核管理方法可能需要提高。#p#
Android 集成
内核版本 3.3 中最大的新闻是将 Google Android 引入到主线内核中。这一集成将继续存在于版本 3.4 中,但是有足够的 Android 分支位于主线上以支持引导 Android 用户空间(参见 图 2)。Android 内核是 Linux 内核的一个分支,拥有几个电源和资源节约型操作(根据功率限制移动设备需要)所需的附加特性。尽管重点是 ARM 架构,但是也支持 x86(用于 Google TV 项目)。
图 2. 在 Oracle VM VirtualBox 上使用 Android x86 引导到 Android 用户空间
Linux 维护人员和 Google 之间的协作问题导致了两年前的 Android 的独立开发。终于在 2011-2012 冬天,人们迎来了 Android Mainlining Project 的创建,Android Mainlining Project 旨在将 Android 驱动程序和特性集成到主线 Linux 内核。这项工作已引入版本 3.3 中,并将在版本 3.5 中看到更进一步的集成。
Android 为 Linux 创建了一些维护移动环境竞争性所需的增强功能。示例包括快速进程间通信 (IPC)、改进的应用程序内存管理和一个大型连续物理内存管理问题的解决方案。
名为 Binder 的驱动程序是 Android 对 IPC 的回应。Android 开发人员可以很轻松地重用现有方法,但是 Binder 包括无法使用的惟一特性(包括零复制的消息传递和证书传递)。在 Android 中,应用程序无法退出,因此只能继续执行,直到内核删除它们。Shrinker 作为一个机制而存在,当内存利用率降低时会复制其利用率。应用程序注册了一个可调用来最大程度地减少内存使用的函数,以便内核在内存紧张时调用这些函数。Android 的另一个新增内容是 Pmem,它提供了在需要时(比如,需要一个相机功能)分配大型物理连续缓存的功能。Pmem 为这类内存分配导出一个用户空间驱动程序,还可以还集成其他功能,但是它们都是特定于移动领域的。
某些特性还没尚未引入内核,比如 wakelocks,它是电源管理功能,允许使用组件阻止系统进入低功率状态(例如,正在更新的时候)。缺少 wakelocks 并不会妨碍 Android 系统启动,但会很快耗尽电池。
随着 Android 被再次合并到 Linux 内核中,再一次最好地说明了 Linux 内核的灵活性(从嵌入式系统和移动设备再到最大的大型机和超级计算机)。由于有超过 3 亿 Android 设备目前正在使用中,所以作为通用平台的 Linux 需要不断改进。
Open vSwitch
Linux 继续成为实现虚拟化的首选平台。除了成为世界一流的操作系统之外,Linux 同时还是一个世界一流的虚拟机监控程序。Open vSwitch 的引入进一步加强了这种状况,它提供了一个开箱即用的虚拟化经验和基础架构即服务 (Infrastructure as a Service, IaaS) 用户。
虚拟交换机只不过是物理交换机的一个软件版本。回想一下,平台虚拟化(由基于内核的虚拟机 [KVM] 或 Xen 实现)允许您在一个虚拟机监控程序 上运行多个操作系统实例(作为 WM),以将该物理平台刻入各种虚拟平台。虚拟交换机的引进扩展了这一抽象概念,其方法是引进了网络基础架构的虚拟形式。虚拟交换机提供一个让 VM 在虚拟网络上相互通信的高效方法。Open vSwitch 跨虚拟主机扩展这一抽象概念,允许一个物理主机上的 VM 与另一个物理主机上的其他 VM 进行透明地通信。
在 Open vSwitch 中,您将会发现一组丰富的虚拟网络特性,包括服务质量、虚拟 LAN、流量过滤、隔离以及各种监控和控制协议(比如 OpenFlow 和 NetFlow)。尽管 Linux 已经拥有一个虚拟交换机实现(称为 Linux Bridge),但 Open vSwitch 是一个功能更为丰富的解决方案(包括多主机管理),因此也是一个备受欢迎的补充。请参阅 参考资料 获取更多相关信息。#p#
文件系统更改
内核版本 3.3 在许多文件系统中都可以对这些文件系统进行更改,以供用户和开发人员使用。对用户来说,通过一个 I/O 控件,可对第 4 扩展文件系统 (ext4) 进行在线调整大小(在线 系统仍然保持运行)。这意味着整个调整都在内核中执行,其结果是使调整变得更快。
对于 B 树文件系统 (Btrfs),已经重写了平衡操作(用于更改元数据的底层结构,比如,添加了一个新驱动器),以支持暂停和恢复。Btrfs 增强继续存在于版本 3.4 中,并且还有一个新的数据恢复工具,可用于从损坏的 btrfs 文件系统提取文件。除此之外,在版本 3.4 中,Btrfs 还进行一些性能改进和错误处理改进(包括恐慌消除,以优雅的错误管理替换它们)。在版本 3.4 之前,Btrfs 作为一个文件系统在 VM 中表现不佳,这是由于写时复制机制所致。可以执行调优来将破坏降至最低。
同时还更新软件独立磁盘冗余整列 (redundant array of independent disks, RAID) 以支持热替换,允许数据从一个卷(使用可替换的mdadm 进行标记)迁移到另一个卷,以便于删除原始数据。最后,版本 3.4 为 QNX4 文件系统添加了只读支持。
对于开发人员来说,现在,可以将错误注入 Network File System 以测试客户端的恢复能力(通过 sysfs)。对于 Btrfs 开发人员而言,新增了一个用于完整性检查的实用工具,可用于识别无效的 “写入” 请求,有助于更快速地解决 bug。
网络增强
随着 Linux 逐渐处于网络功能的前沿,内核版本 3.3 也对这方面进行了增强。
对于低延迟基础架构(比如,高性能计算),可集成 SCSI Remote Direct Memory Access (RDMA) 协议目标驱动程序。Secure Remote Password 是一个协议,它允许使用 RDMA 作为块存储设备的底层传输。这一特定的添加功能允许 Linux 使用 SPR 暴露一个块设备,远程发起者可以通过它附加块 I/O。RDMA 是由 InfiniBand 支持,这在高性能集群中是很常见的。
Random Early Detection (RED) 包调度程序可使用 Sally Floyd 的一个新算法 Ramakrishna Gummadi 进行修改,Scott Shenker 将其称之为 Adaptive RED。RED 已被证明是一个高效的包调度程序算法(它可以根据可用队列大小的函数丢弃无法缓存的包),但是也发现它对于网络中的拥堵程度非常敏感。RED 将队列大小作为丢包概率,因此在一个空的或几乎空的队列中,所有包都会被接受,但当队列填满时,所有包都被丢弃。Adaptive RED 通过测量该算法丢包时表现的积极程度动态改变丢包概率。您可在 Adaptive RED 文章中阅读有关该算法的更多信息,参考资料 提供了相关的链接。
添加了一个新的组合网络设备来替换较旧的内核连接驱动程序。该组合设备允许创建虚拟接口,从多个物理 Ethernet 设备(链路聚合和 802.1AX 所定义的)集合空闲带宽。该设备可用于提高网络性能(聚合多个物理设备)或提供冗余(透明故障恢复)。目前支持两种模式,允许流量跨物理端口简单地分配轮循,或者,如果主要网络连接失败,可定义一个端口作为活动备份来路由所有流量。
在大量网络增强中,另一个有趣的更改是添加控制组(或 cgroups)的 TCP 缓存限制。Cgroups 可以通过各种实现方法,比如,将资源隔离到一个 VM。此更改允许跟踪一个 cgroup 中的用户空间内存和内核内存,实现更好的系统资源管理。#p#
其他有趣的更改
Linux 3.3 也引进了一些非特定于文件系统或网络的更改。在新架构方面,现在直接支持 Texas Instruments C6x 处理器(而不是作为一个单独项目)。C6x 是一个单一的多核数字信号处理器,基于 Very Long Instruction Word,但是缺少现代特性,比如对称多进程处理和缓存一致性;它还缺乏一个内存管理单元 (MMU)。尽管有这些架构漏洞,但 C6x 系列还是很出色的,有一组丰富的外围设备和芯片上加速器(安全性、快速和傅立叶变换等)。版本 3.4 支持最新的 GPU 处理器,比如 Nvidia 的 Kepler,以及 AMD 最新版本的 Radeon 和 Trinity。
APM 架构子树现在使用大量物理地址扩展,并引入了在一个芯片上支持 Nvidia Tegra 3 服务,这对于 ARM 在低功率服务器领域与 Intel 的竞争,提供了有力的工具。另外,在版本 3.3 中还对于 AMD I/O MMU 实现进行了改进,提高了不同页面大小管理和不断增长的设备安全性(分组或设备隔离)。此外,Virtual Function I/O 提高了 KVM 将设备映射到 KVM 来宾用户组的能力。最后,还更新 S390 架构来支持访问高达 64TB 的 RAM(远超过之前少于 4 TB 的限制)。
Performance Monitoring Unit (PMU) 现在进行虚拟化以供 KVM 所用,因此,来宾用户组现在可以在其自己的虚拟平台上访问一个 PUM。这将为每个来宾用户呈现一些有用的性能活动,包括退役的指令、缓存引用与差错,以及执行的或遗漏的分支指令。Xen 的另一个有用虚拟化特性是支持安全丢弃。安全丢弃 意味着永久删除有问题的扇区,而不再是简单地标记为空闲。最后,各种虚拟 I/O 驱动程序(blk、net、balloon 和 console)现在支持 Advanced Configuration 和 Power Interface S4 休眠状态,意味着来宾 VM 可以在 Xen 上休眠。
对于内存崩溃问题,调试起来非常繁琐,因此添加了一个称为 CONFIG_DEBUG_PAGEALLOC 的新配置项。此更改将检查 CPU 是否访问未分配页面,并可能会导致一些性能损失。
展望未来
Linux 不断向前迈进,已发布版本 3.4,候选版本 3.5 也即将在 2012 年 8 月发布。Linux 3.5 包括一些有趣的新特性。
Btrfs 不断地增强,这次在文件系统中加入了优化的回写处理。标准 Linux 文件系统 (ext4) 也得到了增强,能够将校验和添加到元数据以帮助识别数据干预。Linux 很快会越过防火墙或 USB Attached SCSI Protocol 支持 SCSI 目标。最后,用户空间探测也将得到支持(与 SystemTap 一同使用来分析用户空间编程行为)。期望 8 月份即将发布的候选版本能进行更多的更改。