天天看點

提高linux的實時性,高效輕型線程助力提高Linux實時性能

描述

簡介:最近,研發人員緻力于研究适用于多核裝置的Linux使用者空間解決方案,該解決方案允許從使用者空間中直接通路基礎硬體,進而可避免因将Linux核心引入使用者空間應用而帶來的額外系統開銷。這些使用者空間擴充(有多個)已首先由電信/網絡高性能 IP 資料包處理系統進行驅動,以實作所謂的"裸金屬"實施。其中,多核裝置中的Linux使用者空間應用可以模拟"無作業系統"解決方案的執行過程,即在每個核心上進行簡單"運作到完成"、輪詢循環,以便進行資料包處理。在從根本上實作該目标的同時,該解決方案仍可用于非常特殊的用例。還有其他需要提高性能的用例無法通過以上解決方案完全解決嗎?如果有的話,請列舉出來,是否可應用更完善的Linux實時改進?答案是肯定的,采用Linux使用者空間輕型線程 (light-weight threading, LWT) 即可。我們來研究一下實時 Linux,以及輕型線程如何能成為适用于某些應用的解決方案。研究的重點受電信、網絡或常用通信應用的影響,Enea側重于這些應用中采用的技術。但總體上來說,對輕型線程的重點應用會使多方受益。

實時Linux及其解決的問題

在過去的10 年中,Linux 已在實時性能和行為方面取得了顯著的進步,滿足了大量應用的需求。具體歸納如下:

PREEMPT_RT

PREEMPT_RT也許是Linux實時擴充取得的最顯著的成就,PREEMPT_RT資料包解決了多核裝置Linux中存在的特别棘手的問題,即"中斷延遲"問題。将事件/資料傳送到真實使用者空間應用之前,處理Linux核心中的中斷占用的系統開銷非常高 - 該系統開銷往往會延遲其他中斷,進而增大發生中斷時測得的中斷資訊接收方進行處理的總體延遲。同樣,Linux核心中還有許多所謂的"重要部分",可在其中通過自旋鎖禁用中斷。标準Linux核心的總體中斷延遲與許多實時應用的最重要的中斷延遲要求不符,特别是無線接入網(移動)和移動核心基礎設施,這兩者要求最差情況下的中斷延遲應在20-30微秒範圍内。這一點也适用于許多其他市場應用。在快速"nutshell"PREEMPT_RT中,這一問題是通過以下方式解決的:

●将全部裝置驅動器中斷句柄傳遞到可排程線程中,這樣可最大程度地減少Linux核心對中斷的處理工作,是以,無需等待前一中斷處理完成便可處理新中斷。之後,中斷處理會變為受優先級驅動,根據使用者需求,會先完成優先級最高的中斷處理。

●将Linux核心中的所有死空間自旋鎖傳遞到互斥量中,進而允許其他核心線程代替核心空間自旋鎖運作。

基本上,PREEMPT_RT已根據非常高性能的實時标準将總體中斷延遲成功縮短,這樣對大量Linux應用都非常有幫助。要了解具體應用?請繼續往下讀。

使用者空間Linux調整

如上文所述,近年來,研發人員對Linux使用者空間應用投入了大量精力。目的是避免使用者空間應用(Linux 使用者對其附加價值投入了大量精力)占用Linux核心本身的系統開銷來處理某些特定的裝置/中斷互動。Linux采用的模型可極大程度地防止使用者空間應用受到核心的影響,在該模型中,所有使用者空間操作(包括線程)始終會映射到Linux核心,以便處理其I/O請求。這樣便Linux具有強大的行為和特性。但是,對于資料處理性能非常高的應用來說,即使采用PREEMPT_RT,Linux也會有短時故障,這是因為,總是需要進行Linux核心上下文切換才能直接通路硬體。使用者空間Linux實施允許應用在不涉及Linux核心的情況下直接通路硬體和中斷,并可極大程度地提高性能。但這種性能提升隻能在I/O密度極高的環境中實作。大部分Linux使用者空間調整都側重于單線程應用(如高性能資料包處理),其中,Linux下隻有一個線程用于模拟多核裝置中的"無作業系統"性能。

多線程問題

實時Linux解決方案調查中缺少的是認真檢查多線程在實時嵌入式應用中的有效性。實際上,早在20世紀80年代Linux出現之前,人們就提出了需要采用嵌入式實時作業系統(RTOS) 來實作低延遲、高吞吐量、極具實時特點的應用。作業系統的結構發生了變化,但對這方面的需求卻沒有改變。此類RTOS解決方案所具有的各種性能、行為和特性是過去十多年中Linux一直嘗試達到的。這并不意味着傾向于恢複使用RTOS,而是要達到RTOS所具有的功能。就便攜性、應用的廣闊生态系統以及裝置支援和正常支援來講,Linux在實時嵌入式解決方案中的總體價值是任何RTOS都無法比拟的。存在兩個實際問題:

●多線程為何重要?

●如果多線程很重要,那麼我們應如何将RTOS多線程性能、行為和特性添加到Linux中,以便取得更大的成功?關鍵問題是了解Linux多線程實施與RTOS,然後考慮可以進行哪些改進。

多線程為何重要?

30多年前,當計算機解決方案軟體設計人員碰到單線程解決方案無法解決的複雜問題時,便已提出了對多線程實時性方面的需求。所需解決方案要求單個應用具有多個任務,也許一些是計算任務,一些是受I/O驅動的任務,但是,就任務的總體執行而言,所有任務均密切相關。但多個任務密切相關意味着這些任務應共享一部分CPU時間才能達到CPU的有效總體使用率。在很多此類應用中,必須禁止執行某些操作、等待某些I/O事件或另一應用發出的其他通信。是以出現了簡單的可執行程式,這些可執行程式可以處理多個線程,同時可禁用線程,并可在各線程之間進行低延遲通信。

并非所有實時應用都需要支援重要的多線程處理功能。本文并未對相關應用進行分類。但很顯然,需要使用多線程處理功能的應用是那些需要在協定中設定"等待狀态"的任何類型的複雜協定,即等待允許應用繼續進行的響應或事件。之後,應用應放棄對CPU的控制權,允許運作其他類似的線程,來代替該響應或事件。

也許上述教程對于許多人來說很簡單。請注意,很多移動基礎設施和核心網絡裝置供應商得出的結論是,雖然Linux是目前或未來系統的首選,但目前建構的Linux還不足以滿足業界的全部要求。原因是什麼?

采用PTHREADS的Linux多線程

Pthreads是由IEEE規劃的可移植作業系統接口(POSIX)建立的,目的是為了解決Unix中存在的高性能、多線程問題,之後被Linux用在最早的版本中,用于為企業實施可移植Unix,目前用于嵌入式應用中。

建立pthreads模型是為了解決原始Unix Fork/Join模型建立Unix"子"程序時出現的問題。由于該模型涉及到建立(還可能涉及删除)整個受記憶體保護的環境及執行模式,是以Unix程序模型非常龐大。需要在Unix下采用适用于多線程的較輕型模型,是以pthreads應運而生。

但Unix(也包括Linux)模型是專為将核心與使用者空間應用完全分離而設計的,其優勢之一在于提供的保護、安全性和可靠性遠勝于其他實施方案(包括過去10幾年間使用的RTOS)。實質上,這意味着Linux使用者空間中的每個pthread都會由Linux核心線程表示,是以,全部或大部分Linux系統調用(特别是裝置驅動器)均可通過使用者空間進行通路。但是,由于OEM制造的産品并不具備GPL,是以使用者空間中實際存儲了所有嵌入式Linux實時應用。是以,在每種情況下,使用pthreads都涉及到調用Linux核心,進而為本可以在本地實施的應用帶來了額外的系統開銷。

但請您稍稍考慮一下。采用上文提到的Linux實時擴充怎麼樣?是的,PREEMPT_RT可以解決Linux核心中存在的許多關于響應性的問題,但不能真正解決多線程問題。實施使用者空間 Linux可解決裝置驅動器/中斷性能問題,但并不能真正解決多線程問題。Linux實時容器可解決部分問題,但實時容器隻是一種基于标準Linux的使用者空間Linux可視化技術,并不能真正解決根本的多線程問題。

輕型線程(LWT)--複雜Linux應用的真正解決方案

之前針對Linux提出了多種輕型線程模型的建議,但沒有一種模型能夠真正解決問題。原因何在?因為大多數模型的功能都不是很強大。涉及複雜多線程應用的下一代Linux解決方案真正需要的是适用于使用者空間Linux應用的全新Linux模型。下文概括介紹了這種名為Linux輕型線程(LWT)的解決方案。将高性能、低系統開銷、多線程排程器植入Linux使用者空間,來代替單獨的pthread.原因何在?

●Pthread系統開銷

●程序和pthreads是Linux了解的唯一排程實體。

●LWT pthread隻是一個Linux編碼執行背景,可用于永久運作pthread.由于使用者空間排程器始終保持控制,是以pthread絕不會被挂起,省電模式除外。這種情況不在本文的讨論範圍。

該使用者空間排程器的運作和操作方式與某些傳統RTOS高性能、低延遲實施完全相同,但不會涉及到Linux核心。

實施過程利用新使用者空間Linux實施過程來直接通路硬體。同樣也不涉及Linux核心。

上述LWT解決方案可在任何Linux實時應用中實作動态性能的提升。Enea已設計出上述LWT的一些原型,事實證明,與Linux pthreads在排程器系統開銷、特别是上下文切換和線程間消息發送/通信延遲方面的性能相比,LWT性能可提高10倍。

但是除了排程性能和線程間通信功能之外,LWT解決方案還應帶來什麼?LWT概念除了在性能方面勝過Linux pthreads之外,還有更多優勢。解決方案穩健性的概念如何?與曆史悠久的RTOS實時解決方案一樣,LWT也需要具有以下額外Linux特性:

●決定性排程

●排程系統開銷低--上下文切換成本低

●線程間信号系統開銷低

●線程建立成本低

多核裝置中Linux輕型線程模型的結構圖

LWT實施方案的結構圖如下。涉及整個共享記憶體空間的Linux程序可能跨多核裝置的多個核心。為了達到最高效率,LWT模型需要将Linux程序中的單個pthread鎖定至某一個核心,但并不特别要求這樣做。LWT鎖定至pthread之後,便可遷移到Linux SMP需要的任何核心中。

提高linux的實時性,高效輕型線程助力提高Linux實時性能

圖1:多核裝置中Linux輕型線程模型的結構圖

結論

高效輕型線程(LWT)将成為下一個Linux實時性能和行為問題。需要強調的是,并非所有實時應用都需要使用功能強大的類似LWT的解決方案。但是一些實時應用,尤其是電信/網絡中的應用以及無線接入網、移動基礎設施核心/邊緣中的那些需要使用某些複雜網絡協定的應用、或任何具有類似實時需求的其他系統均可受益于Linux輕型線程--下一代 Linux 實時擴充。同時,實時嵌入式Linux的整個發展過程證明了Linux的運作效果與傳統RTOS解決方案一樣優異。Linux已取得了一些進展,但是作者認為,最重要的電信/網絡應用中使用的Linux尚未達到預期的要求。但也許通過Linux輕型線程,我們可以更接近這一目标。總的來說,Linux實時嵌入式行業的一個側重點是研發出可用于要求最高的實時應用的解決方案。下圖中描述了該目标:

提高linux的實時性,高效輕型線程助力提高Linux實時性能

圖2:輕型線程和Linux概念--Linux和RTOS最重要的概念

打開APP閱讀更多精彩内容

點選閱讀全文