Linux 內(nèi)核 3.3 和 3.4的重要更改
Linux內(nèi)核版本 3.3 和 3.4 包括一個令人印象深刻的特性集,但是在某種意義上它們也是不詳預(yù)兆的里程碑。版本 3.3 是第一個超過 1500 萬行代碼的 Linux 版本(采用了一種確實存在缺陷的測量方法測量的)。如果減去 Linux 內(nèi)核的變體部分(比如驅(qū)動程序、架構(gòu)相關(guān)代碼和各種工具),數(shù)量可能會下降到 400 萬以下(仍然是一個龐然大物)。
關(guān)于這個里程碑潛在的不詳預(yù)兆有兩個方面,Linux 內(nèi)核的增長速度(自 2008 年以來增長了 50%)以及這種增長速度是否會對 Linux 內(nèi)核效率(功率和性能)產(chǎn)生負(fù)面影響。功率和性能通常不是以每個補(bǔ)丁為基礎(chǔ)進(jìn)行測量,所以一個 bug 可能很容易蔓延到已發(fā)布內(nèi)核中,并存留一段時間(例如,在版本 3.3 中修復(fù)的 PCI Express [PCIe] Active State Power Management 功率問題,在內(nèi)核中已經(jīng)存在一年了)。
Linux 內(nèi)核版本控制
內(nèi)核使用一個由 3 部分組成的數(shù)字組合進(jìn)行版本控制,該數(shù)字組合是由一個內(nèi)核版本、一個主要修訂和微小修訂(例如,3.3.4)構(gòu)成。候選發(fā)布版本內(nèi)核包括一個 rc#"后綴,該后綴中包含一個數(shù)字,代表具體候選版本(例如,當(dāng)前版本是 3.5rc1)。
在不到 21 年的時間內(nèi),Linux 已經(jīng)從 10,000 多行代碼增長到超過 1500 萬行代碼。盡管大多數(shù)代碼駐留于驅(qū)動程序子樹中,但內(nèi)核的復(fù)雜性隨著代碼的增多在不斷增加。很快有一天,這種擴(kuò)大可能會導(dǎo)致修改內(nèi)核來消除復(fù)雜性并提高其可維護(hù)性。
如 圖 1 所示,版本 2.4 自 2001 年發(fā)布以來,Linux 內(nèi)核增長迅速(從 3,377,902 行增加到 2012 的 14,998,651 行)。這段時期內(nèi),每年幾乎有大約 100 萬行新代碼被添加到內(nèi)核中。這是一個驚人的數(shù)字,會讓每個軟件開發(fā)人員都感到恐懼。
圖 1. 版本 2.2(2001 年)到版本 3.3(2012 年)的內(nèi)核大小
引用 Torvalds 自己的話,隨著內(nèi)核的增長他很擔(dān)心未來的維護(hù)。內(nèi)核中大約有 400 萬行代碼,當(dāng)前內(nèi)核管理方法可能需要提高。#p#
Android 集成
內(nèi)核版本 3.3 中最大的新聞是將 Google Android 引入到主線內(nèi)核中。這一集成將繼續(xù)存在于版本 3.4 中,但是有足夠的 Android 分支位于主線上以支持引導(dǎo) Android 用戶空間(參見 圖 2)。Android 內(nèi)核是 Linux 內(nèi)核的一個分支,擁有幾個電源和資源節(jié)約型操作(根據(jù)功率限制移動設(shè)備需要)所需的附加特性。盡管重點是 ARM 架構(gòu),但是也支持 x86(用于 Google TV 項目)。
圖 2. 在 Oracle VM VirtualBox 上使用 Android x86 引導(dǎo)到 Android 用戶空間
Linux 維護(hù)人員和 Google 之間的協(xié)作問題導(dǎo)致了兩年前的 Android 的獨立開發(fā)。終于在 2011-2012 冬天,人們迎來了 Android Mainlining Project 的創(chuàng)建,Android Mainlining Project 旨在將 Android 驅(qū)動程序和特性集成到主線 Linux 內(nèi)核。這項工作已引入版本 3.3 中,并將在版本 3.5 中看到更進(jìn)一步的集成。
Android 為 Linux 創(chuàng)建了一些維護(hù)移動環(huán)境競爭性所需的增強(qiáng)功能。示例包括快速進(jìn)程間通信 (IPC)、改進(jìn)的應(yīng)用程序內(nèi)存管理和一個大型連續(xù)物理內(nèi)存管理問題的解決方案。
名為 Binder 的驅(qū)動程序是 Android 對 IPC 的回應(yīng)。Android 開發(fā)人員可以很輕松地重用現(xiàn)有方法,但是 Binder 包括無法使用的惟一特性(包括零復(fù)制的消息傳遞和證書傳遞)。在 Android 中,應(yīng)用程序無法退出,因此只能繼續(xù)執(zhí)行,直到內(nèi)核刪除它們。Shrinker 作為一個機(jī)制而存在,當(dāng)內(nèi)存利用率降低時會復(fù)制其利用率。應(yīng)用程序注冊了一個可調(diào)用來最大程度地減少內(nèi)存使用的函數(shù),以便內(nèi)核在內(nèi)存緊張時調(diào)用這些函數(shù)。Android 的另一個新增內(nèi)容是 Pmem,它提供了在需要時(比如,需要一個相機(jī)功能)分配大型物理連續(xù)緩存的功能。Pmem 為這類內(nèi)存分配導(dǎo)出一個用戶空間驅(qū)動程序,還可以還集成其他功能,但是它們都是特定于移動領(lǐng)域的。
某些特性還沒尚未引入內(nèi)核,比如 wakelocks,它是電源管理功能,允許使用組件阻止系統(tǒng)進(jìn)入低功率狀態(tài)(例如,正在更新的時候)。缺少 wakelocks 并不會妨礙 Android 系統(tǒng)啟動,但會很快耗盡電池。
隨著 Android 被再次合并到 Linux 內(nèi)核中,再一次最好地說明了 Linux 內(nèi)核的靈活性(從嵌入式系統(tǒng)和移動設(shè)備再到最大的大型機(jī)和超級計算機(jī))。由于有超過 3 億 Android 設(shè)備目前正在使用中,所以作為通用平臺的 Linux 需要不斷改進(jìn)。
Open vSwitch
Linux 繼續(xù)成為實現(xiàn)虛擬化的首選平臺。除了成為世界一流的操作系統(tǒng)之外,Linux 同時還是一個世界一流的虛擬機(jī)監(jiān)控程序。Open vSwitch 的引入進(jìn)一步加強(qiáng)了這種狀況,它提供了一個開箱即用的虛擬化經(jīng)驗和基礎(chǔ)架構(gòu)即服務(wù) (Infrastructure as a Service, IaaS) 用戶。
虛擬交換機(jī)只不過是物理交換機(jī)的一個軟件版本?;叵胍幌?,平臺虛擬化(由基于內(nèi)核的虛擬機(jī) [KVM] 或 Xen 實現(xiàn))允許您在一個虛擬機(jī)監(jiān)控程序 上運(yùn)行多個操作系統(tǒng)實例(作為 WM),以將該物理平臺刻入各種虛擬平臺。虛擬交換機(jī)的引進(jìn)擴(kuò)展了這一抽象概念,其方法是引進(jìn)了網(wǎng)絡(luò)基礎(chǔ)架構(gòu)的虛擬形式。虛擬交換機(jī)提供一個讓 VM 在虛擬網(wǎng)絡(luò)上相互通信的高效方法。Open vSwitch 跨虛擬主機(jī)擴(kuò)展這一抽象概念,允許一個物理主機(jī)上的 VM 與另一個物理主機(jī)上的其他 VM 進(jìn)行透明地通信。
在 Open vSwitch 中,您將會發(fā)現(xiàn)一組豐富的虛擬網(wǎng)絡(luò)特性,包括服務(wù)質(zhì)量、虛擬 LAN、流量過濾、隔離以及各種監(jiān)控和控制協(xié)議(比如 OpenFlow 和 NetFlow)。盡管 Linux 已經(jīng)擁有一個虛擬交換機(jī)實現(xiàn)(稱為 Linux Bridge),但 Open vSwitch 是一個功能更為豐富的解決方案(包括多主機(jī)管理),因此也是一個備受歡迎的補(bǔ)充。請參閱 參考資料 獲取更多相關(guān)信息。#p#
文件系統(tǒng)更改
內(nèi)核版本 3.3 在許多文件系統(tǒng)中都可以對這些文件系統(tǒng)進(jìn)行更改,以供用戶和開發(fā)人員使用。對用戶來說,通過一個 I/O 控件,可對第 4 擴(kuò)展文件系統(tǒng) (ext4) 進(jìn)行在線調(diào)整大?。ㄔ诰€ 系統(tǒng)仍然保持運(yùn)行)。這意味著整個調(diào)整都在內(nèi)核中執(zhí)行,其結(jié)果是使調(diào)整變得更快。
對于 B 樹文件系統(tǒng) (Btrfs),已經(jīng)重寫了平衡操作(用于更改元數(shù)據(jù)的底層結(jié)構(gòu),比如,添加了一個新驅(qū)動器),以支持暫停和恢復(fù)。Btrfs 增強(qiáng)繼續(xù)存在于版本 3.4 中,并且還有一個新的數(shù)據(jù)恢復(fù)工具,可用于從損壞的 btrfs 文件系統(tǒng)提取文件。除此之外,在版本 3.4 中,Btrfs 還進(jìn)行一些性能改進(jìn)和錯誤處理改進(jìn)(包括恐慌消除,以優(yōu)雅的錯誤管理替換它們)。在版本 3.4 之前,Btrfs 作為一個文件系統(tǒng)在 VM 中表現(xiàn)不佳,這是由于寫時復(fù)制機(jī)制所致。可以執(zhí)行調(diào)優(yōu)來將破壞降至最低。
同時還更新軟件獨立磁盤冗余整列 (redundant array of independent disks, RAID) 以支持熱替換,允許數(shù)據(jù)從一個卷(使用可替換的mdadm 進(jìn)行標(biāo)記)遷移到另一個卷,以便于刪除原始數(shù)據(jù)。最后,版本 3.4 為 QNX4 文件系統(tǒng)添加了只讀支持。
對于開發(fā)人員來說,現(xiàn)在,可以將錯誤注入 Network File System 以測試客戶端的恢復(fù)能力(通過 sysfs)。對于 Btrfs 開發(fā)人員而言,新增了一個用于完整性檢查的實用工具,可用于識別無效的 “寫入” 請求,有助于更快速地解決 bug。
網(wǎng)絡(luò)增強(qiáng)
隨著 Linux 逐漸處于網(wǎng)絡(luò)功能的前沿,內(nèi)核版本 3.3 也對這方面進(jìn)行了增強(qiáng)。
對于低延遲基礎(chǔ)架構(gòu)(比如,高性能計算),可集成 SCSI Remote Direct Memory Access (RDMA) 協(xié)議目標(biāo)驅(qū)動程序。Secure Remote Password 是一個協(xié)議,它允許使用 RDMA 作為塊存儲設(shè)備的底層傳輸。這一特定的添加功能允許 Linux 使用 SPR 暴露一個塊設(shè)備,遠(yuǎn)程發(fā)起者可以通過它附加塊 I/O。RDMA 是由 InfiniBand 支持,這在高性能集群中是很常見的。
Random Early Detection (RED) 包調(diào)度程序可使用 Sally Floyd 的一個新算法 Ramakrishna Gummadi 進(jìn)行修改,Scott Shenker 將其稱之為 Adaptive RED。RED 已被證明是一個高效的包調(diào)度程序算法(它可以根據(jù)可用隊列大小的函數(shù)丟棄無法緩存的包),但是也發(fā)現(xiàn)它對于網(wǎng)絡(luò)中的擁堵程度非常敏感。RED 將隊列大小作為丟包概率,因此在一個空的或幾乎空的隊列中,所有包都會被接受,但當(dāng)隊列填滿時,所有包都被丟棄。Adaptive RED 通過測量該算法丟包時表現(xiàn)的積極程度動態(tài)改變丟包概率。您可在 Adaptive RED 文章中閱讀有關(guān)該算法的更多信息,參考資料 提供了相關(guān)的鏈接。
添加了一個新的組合網(wǎng)絡(luò)設(shè)備來替換較舊的內(nèi)核連接驅(qū)動程序。該組合設(shè)備允許創(chuàng)建虛擬接口,從多個物理 Ethernet 設(shè)備(鏈路聚合和 802.1AX 所定義的)集合空閑帶寬。該設(shè)備可用于提高網(wǎng)絡(luò)性能(聚合多個物理設(shè)備)或提供冗余(透明故障恢復(fù))。目前支持兩種模式,允許流量跨物理端口簡單地分配輪循,或者,如果主要網(wǎng)絡(luò)連接失敗,可定義一個端口作為活動備份來路由所有流量。
在大量網(wǎng)絡(luò)增強(qiáng)中,另一個有趣的更改是添加控制組(或 cgroups)的 TCP 緩存限制。Cgroups 可以通過各種實現(xiàn)方法,比如,將資源隔離到一個 VM。此更改允許跟蹤一個 cgroup 中的用戶空間內(nèi)存和內(nèi)核內(nèi)存,實現(xiàn)更好的系統(tǒng)資源管理。#p#
其他有趣的更改
Linux 3.3 也引進(jìn)了一些非特定于文件系統(tǒng)或網(wǎng)絡(luò)的更改。在新架構(gòu)方面,現(xiàn)在直接支持 Texas Instruments C6x 處理器(而不是作為一個單獨項目)。C6x 是一個單一的多核數(shù)字信號處理器,基于 Very Long Instruction Word,但是缺少現(xiàn)代特性,比如對稱多進(jìn)程處理和緩存一致性;它還缺乏一個內(nèi)存管理單元 (MMU)。盡管有這些架構(gòu)漏洞,但 C6x 系列還是很出色的,有一組豐富的外圍設(shè)備和芯片上加速器(安全性、快速和傅立葉變換等)。版本 3.4 支持最新的 GPU 處理器,比如 Nvidia 的 Kepler,以及 AMD 最新版本的 Radeon 和 Trinity。
APM 架構(gòu)子樹現(xiàn)在使用大量物理地址擴(kuò)展,并引入了在一個芯片上支持 Nvidia Tegra 3 服務(wù),這對于 ARM 在低功率服務(wù)器領(lǐng)域與 Intel 的競爭,提供了有力的工具。另外,在版本 3.3 中還對于 AMD I/O MMU 實現(xiàn)進(jìn)行了改進(jìn),提高了不同頁面大小管理和不斷增長的設(shè)備安全性(分組或設(shè)備隔離)。此外,Virtual Function I/O 提高了 KVM 將設(shè)備映射到 KVM 來賓用戶組的能力。最后,還更新 S390 架構(gòu)來支持訪問高達(dá) 64TB 的 RAM(遠(yuǎn)超過之前少于 4 TB 的限制)。
Performance Monitoring Unit (PMU) 現(xiàn)在進(jìn)行虛擬化以供 KVM 所用,因此,來賓用戶組現(xiàn)在可以在其自己的虛擬平臺上訪問一個 PUM。這將為每個來賓用戶呈現(xiàn)一些有用的性能活動,包括退役的指令、緩存引用與差錯,以及執(zhí)行的或遺漏的分支指令。Xen 的另一個有用虛擬化特性是支持安全丟棄。安全丟棄 意味著永久刪除有問題的扇區(qū),而不再是簡單地標(biāo)記為空閑。最后,各種虛擬 I/O 驅(qū)動程序(blk、net、balloon 和 console)現(xiàn)在支持 Advanced Configuration 和 Power Interface S4 休眠狀態(tài),意味著來賓 VM 可以在 Xen 上休眠。
對于內(nèi)存崩潰問題,調(diào)試起來非常繁瑣,因此添加了一個稱為 CONFIG_DEBUG_PAGEALLOC 的新配置項。此更改將檢查 CPU 是否訪問未分配頁面,并可能會導(dǎo)致一些性能損失。
展望未來
Linux 不斷向前邁進(jìn),已發(fā)布版本 3.4,候選版本 3.5 也即將在 2012 年 8 月發(fā)布。Linux 3.5 包括一些有趣的新特性。
Btrfs 不斷地增強(qiáng),這次在文件系統(tǒng)中加入了優(yōu)化的回寫處理。標(biāo)準(zhǔn) Linux 文件系統(tǒng) (ext4) 也得到了增強(qiáng),能夠?qū)⑿r灪吞砑拥皆獢?shù)據(jù)以幫助識別數(shù)據(jù)干預(yù)。Linux 很快會越過防火墻或 USB Attached SCSI Protocol 支持 SCSI 目標(biāo)。最后,用戶空間探測也將得到支持(與 SystemTap 一同使用來分析用戶空間編程行為)。期望 8 月份即將發(fā)布的候選版本能進(jìn)行更多的更改。