通過(guò)輕型線(xiàn)程提高多核設備中的Linux實(shí)時(shí)性能
簡(jiǎn)介
本文引用地址:http://dyxdggzs.com/article/134608.htm上個(gè)世紀,研發(fā)人員投入了大量精力提高 Linux 實(shí)時(shí)性能和行為,最著(zhù)名的是 PREEMPT_RT Linux 實(shí)時(shí)擴展。最近,研發(fā)人員致力于研究適用于多核設備的 Linux 用戶(hù)空間解決方案,該解決方案允許從用戶(hù)空間中直接訪(fǎng)問(wèn)基礎硬件,從而可避免因將 Linux 內核引入用戶(hù)空間應用而帶來(lái)的額外系統開(kāi)銷(xiāo)。這些用戶(hù)空間擴展(有多個(gè))已首先由電信/網(wǎng)絡(luò )高性能 IP 數據包處理系統進(jìn)行驅動(dòng),以實(shí)現所謂的“裸金屬”實(shí)施,其中,多核設備中的 Linux 用戶(hù)空間應用可以模擬“無(wú)操作系統”解決方案的執行過(guò)程,即在每個(gè)內核上進(jìn)行簡(jiǎn)單“運行到完成”、輪詢(xún)循環(huán),以便進(jìn)行數據包處理。在從根本上實(shí)現該目標的同時(shí),該解決方案仍可用于非常特殊的用例。還有其他需要提高性能的用例無(wú)法通過(guò)以上解決方案完全解決嗎?如果有的話(huà),請列舉出來(lái),是否可應用更完善的 Linux 實(shí)時(shí)改進(jìn)?答案是肯定的,采用 Linux 用戶(hù)空間輕型線(xiàn)程 (light-weight threading, LWT) 即可。我們來(lái)研究一下實(shí)時(shí) Linux,以及輕型線(xiàn)程如何能成為適用于某些應用的解決方案。研究的重點(diǎn)受電信、網(wǎng)絡(luò )或常用通信應用的影響,Enea 側重于這些應用中采用的技術(shù)。但總體上來(lái)說(shuō),對輕型線(xiàn)程的重點(diǎn)應用會(huì )使多方受益。
實(shí)時(shí) Linux 及其解決的問(wèn)題
在過(guò)去的 10 年中,Linux 已在實(shí)時(shí)性能和行為方面取得了顯著(zhù)的進(jìn)步,滿(mǎn)足了大量應用的需求。具體歸納如下:
PREEMPT_RT
PREEMPT_RT 也許是 Linux 實(shí)時(shí)擴展取得的最顯著(zhù)的成就,PREEMPT_RT 數據包解決了多核設備 Linux 中存在的特別棘手的問(wèn)題,即“中斷延遲”問(wèn)題。將事件/數據傳送到真實(shí)用戶(hù)空間應用之前,處理Linux內核中的中斷占用的系統開(kāi)銷(xiāo)非常高 - 該系統開(kāi)銷(xiāo)往往會(huì )延遲其他中斷,從而增大發(fā)生中斷時(shí)測得的中斷信息接收方進(jìn)行處理的總體延遲。同樣,Linux 內核中還有許多所謂的“重要部分”,可在其中通過(guò)自旋鎖禁用中斷。標準Linux 內核的總體中斷延遲與許多實(shí)時(shí)應用的最重要的中斷延遲要求不符,特別是無(wú)線(xiàn)接入網(wǎng)(移動(dòng))和移動(dòng)核心基礎設施,這兩者要求最差情況下的中斷延遲應在 20-30 微秒范圍內。這一點(diǎn)也適用于許多其他市場(chǎng)應用。在快速“nutshell”PREEMPT_RT 中,這一問(wèn)題是通過(guò)以下方式解決的:
- 將全部設備驅動(dòng)器中斷句柄傳遞到可調度線(xiàn)程中,這樣可最大程度地減少 Linux 內核對中斷的處理工作,因此,無(wú)需等待前一中斷處理完成便可處理新中斷。之后,中斷處理會(huì )變?yōu)槭軆?yōu)先級驅動(dòng),根據用戶(hù)需求,會(huì )先完成優(yōu)先級最高的中斷處理。
- 將 Linux 內核中的所有死空間自旋鎖傳遞到互斥量中,從而允許其他內核線(xiàn)程代替內核空間自旋鎖運行。
基本上,PREEMPT_RT 已根據非常高性能的實(shí)時(shí)標準將總體中斷延遲成功縮短,這樣對大量 Linux 應用都非常有幫助。要了解具體應用?請繼續往下讀。
用戶(hù)空間 Linux 調整
如上文所述,近年來(lái),研發(fā)人員對 Linux 用戶(hù)空間應用投入了大量精力。目的是避免用戶(hù)空間應用(Linux 用戶(hù)對其附加價(jià)值投入了大量精力)占用 Linux 內核本身的系統開(kāi)銷(xiāo)來(lái)處理某些特定的設備/中斷交互。Linux 采用的模型可極大程度地防止用戶(hù)空間應用受到內核的影響,在該模型中,所有用戶(hù)空間操作(包括線(xiàn)程)始終會(huì )映射到 Linux 內核,以便處理其 I/O 請求。這樣便使 Linux 具有強大的行為和特性。但是,對于數據處理性能非常高的應用來(lái)說(shuō),即使采用 PREEMPT_RT,Linux 也會(huì )有短時(shí)故障,這是因為,總是需要進(jìn)行 Linux 內核上下文切換才能直接訪(fǎng)問(wèn)硬件。用戶(hù)空間 Linux 實(shí)施允許應用在不涉及 Linux 內核的情況下直接訪(fǎng)問(wèn)硬件和中斷,并可極大程度地提高性能。但這種性能提升只能在 I/O 密度極高的環(huán)境中實(shí)現。大部分 Linux 用戶(hù)空間調整都側重于單線(xiàn)程應用(如高性能數據包處理),其中,Linux 下只有一個(gè)線(xiàn)程用于模擬多核設備中的“無(wú)操作系統”性能。
多線(xiàn)程問(wèn)題
實(shí)時(shí) Linux 解決方案調查中缺少的是認真檢查多線(xiàn)程在實(shí)時(shí)嵌入式應用中的有效性。實(shí)際上,早在 20 世紀 80 年代 Linux 出現之前,人們就提出了需要采用嵌入式實(shí)時(shí)操作系統 (RTOS) 來(lái)實(shí)現低延遲、高吞吐量、極具實(shí)時(shí)特點(diǎn)的應用。操作系統的結構發(fā)生了變化,但對這方面的需求卻沒(méi)有改變。此類(lèi) RTOS 解決方案所具有的各種性能、行為和特性是過(guò)去十多年中 Linux 一直嘗試達到的。這并不意味著(zhù)傾向于恢復使用 RTOS,而是要達到 RTOS 所具有的功能。就便攜性、應用的廣闊生態(tài)系統以及設備支持和常規支持來(lái)講,Linux 在實(shí)時(shí)嵌入式解決方案中的總體價(jià)值是任何 RTOS 都無(wú)法比擬的。存在兩個(gè)實(shí)際問(wèn)題:
- 多線(xiàn)程為何重要?
- 如果多線(xiàn)程很重要,那么我們應如何將 RTOS 多線(xiàn)程性能、行為和特性添加到 Linux 中,以便取得更大的成功?關(guān)鍵問(wèn)題是了解 Linux 多線(xiàn)程實(shí)施與 RTOS,然后考慮可以進(jìn)行哪些改進(jìn)。
多線(xiàn)程為何重要?
30 多年前,當計算機解決方案軟件設計人員碰到單線(xiàn)程解決方案無(wú)法解決的復雜問(wèn)題時(shí),便已提出了對多線(xiàn)程實(shí)時(shí)性方面的需求。所需解決方案要求單個(gè)應用具有多個(gè)任務(wù),也許一些是計算任務(wù),一些是受 I/O 驅動(dòng)的任務(wù),但是,就任務(wù)的總體執行而言,所有任務(wù)均密切相關(guān)。但多個(gè)任務(wù)密切相關(guān)意味著(zhù)這些任務(wù)應共享一部分 CPU 時(shí)間才能達到 CPU 的有效總體利用率。在很多此類(lèi)應用中,必須禁止執行某些操作、等待某些 I/O 事件或另一應用發(fā)出的其他通信。因此出現了簡(jiǎn)單的可執行程序,這些可執行程序可以處理多個(gè)線(xiàn)程,同時(shí)可禁用線(xiàn)程,并可在各線(xiàn)程之間進(jìn)行低延遲通信。
并非所有實(shí)時(shí)應用都需要支持重要的多線(xiàn)程處理功能。本文并未對相關(guān)應用進(jìn)行分類(lèi)。但很顯然,需要使用多線(xiàn)程處理功能的應用是那些需要在協(xié)議中設定“等待狀態(tài)”的任何類(lèi)型的復雜協(xié)議,即等待允許應用繼續進(jìn)行的響應或事件。之后,應用應放棄對 CPU 的控制權,允許運行其他類(lèi)似的線(xiàn)程,來(lái)代替該響應或事件。
也許上述教程對于許多人來(lái)說(shuō)很簡(jiǎn)單。請注意,很多移動(dòng)基礎設施和核心網(wǎng)絡(luò )設備供應商得出的結論是,雖然 Linux 是當前或未來(lái)系統的首選,但目前構建的 Linux 還不足以滿(mǎn)足業(yè)界的全部要求。原因是什么?
采用 PTHREADS 的 Linux 多線(xiàn)程
Pthreads 是由 IEEE 規劃的可移植操作系統接口 (POSIX) 創(chuàng )建的,目的是為了解決 Unix 中存在的高性能、多線(xiàn)程問(wèn)題,之后被 Linux 用在最早的版本中,用于為企業(yè)實(shí)施可移植 Unix,目前用于嵌入式應用中。
創(chuàng )建 pthreads 模型是為了解決原始 Unix Fork/Join 模型創(chuàng )建 Unix“子”進(jìn)程時(shí)出現的問(wèn)題。由于該模型涉及到創(chuàng )建(還可能涉及刪除)整個(gè)受內存保護的環(huán)境及執行模式,因此Unix 進(jìn)程模型非常龐大。需要在 Unix 下采用適用于多線(xiàn)程的較輕型模型,因此pthreads應運而生。
但 Unix(也包括 Linux)模型是專(zhuān)為將內核與用戶(hù)空間應用完全分離而設計的,其優(yōu)勢之一在于提供的保護、安全性和可靠性遠勝于其他實(shí)施方案(包括過(guò)去 10 幾年間使用的 RTOS)。實(shí)質(zhì)上,這意味著(zhù) Linux 用戶(hù)空間中的每個(gè) pthread 都會(huì )由 Linux 內核線(xiàn)程表示,因此,全部或大部分 Linux 系統調用(特別是設備驅動(dòng)器)均可通過(guò)用戶(hù)空間進(jìn)行訪(fǎng)問(wèn)。但是,由于 OEM 制造的產(chǎn)品并不具備 GPL,因此用戶(hù)空間中實(shí)際存儲了所有嵌入式 Linux 實(shí)時(shí)應用。因此,在每種情況下,使用 pthreads 都涉及到調用 Linux 內核,從而為本可以在本地實(shí)施的應用帶來(lái)了額外的系統開(kāi)銷(xiāo)。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論