自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺談Linux內(nèi)核的實時性優(yōu)化

系統(tǒng) Linux
ftrace是一個很強大的調(diào)試工具,除了常用的函數(shù)跟蹤器能讓我們輕松知道一個函數(shù)的執(zhí)行耗時之外,它強大的event機制,更是可以直接讓我們在驅(qū)動或者內(nèi)核中添加跟蹤點,輸出內(nèi)核執(zhí)行過程中的各類數(shù)據(jù),讓我們輕松洞察內(nèi)核的執(zhí)行過程。

1.實時系統(tǒng)的概念

1.1什么是實時操作系統(tǒng)

什么是實時操作系統(tǒng)?接觸過嵌入式的小伙伴可能會知道,實時操作系統(tǒng)是指在嵌入式領(lǐng)域廣泛應(yīng)用的各類RTOS(Real Time Operating System)。其中最具代表性的有國外的μC/OS-III、FreeRTOS、Vxworks等,國內(nèi)的代表有RT-Thread和LiteOS。

圖1:常見的實時操作系統(tǒng)

在這些眾多的RTOS系統(tǒng)里面既有開源的也有商業(yè)的,同時還有一些是行業(yè)專用的,比如enea公司推出的OSE系統(tǒng)就是通信行業(yè)早期的基站設(shè)備應(yīng)用比較廣泛的系統(tǒng)。無論是開源或是商業(yè),這類系統(tǒng)都有一個最顯著的特點,就是它們都具有很高的實時性。也是因為這個特點,它們都被集中應(yīng)用在了嵌入式領(lǐng)域,特別是工控領(lǐng)域,例如工業(yè)制造控制、導(dǎo)彈飛機導(dǎo)航、電力設(shè)備監(jiān)控等。歷史上有很多著名的航空航天設(shè)備都使用到了實時的操作系統(tǒng)。比如登陸火星的鳳凰號、好奇號火星探測器,它們所采用的操作系統(tǒng)就是美國WindRiver公司推出的Vxworks。那什么是系統(tǒng)的實時性呢?Linux系統(tǒng)在嵌入式領(lǐng)域也有大量使用,那Linux系統(tǒng)支不支持實時性呢?

1.2 Linux實時性、軟實時和硬實時

實時性指的是一個操作系統(tǒng)能夠在規(guī)定的時間點內(nèi)完成指定的任務(wù)操作,一旦超過這個時間點會對整個系統(tǒng)帶來不可估量的后果。與此相對的是一般操作系統(tǒng),它更注重用戶體驗,系統(tǒng)偶爾卡頓不會給用戶帶來災(zāi)難性后果。實時性反映了一個系統(tǒng)行為控制的精準(zhǔn)能力,具體體現(xiàn)在定時器的精準(zhǔn)度高,中斷響應(yīng)及時以及系統(tǒng)的行為固定且可預(yù)估等。

Linux系統(tǒng)最初是按照分時系統(tǒng)設(shè)計并推出的,再加上在歷史版本中使用的調(diào)度算法目的是公平的分配和使用各種系統(tǒng)資源,保證CPU被各個進程公平的使用,所以早期并不支持實時性。但是在后來的2.6版本開始,加入了內(nèi)核搶占的功能,使它的實時性得到了提升,在某種程度上具備了軟實時的能力。軟實時指的是系統(tǒng)對于時限要求并不是十分的嚴(yán)格,在一些情況下允許系統(tǒng)超限完成。

舉個例子,我們在PC機上使用鼠標(biāo)操作,偶爾會出現(xiàn)卡頓延遲,這種情況除了讓我們抓狂影響使用體驗之外并不會給我們帶來嚴(yán)重的影響,大家平時在使用電腦時遇到鼠標(biāo)圖標(biāo)轉(zhuǎn)圈圈同時界面不響應(yīng)操作就是一個例子。再比如視頻信號采集,偶爾丟失幾個數(shù)據(jù)幀,并不會對視頻最后的播放帶來嚴(yán)重的畫面缺失。但是硬實時就不一樣,它對操作系統(tǒng)的行為有著嚴(yán)格的時限要求,超出時限往往會帶來災(zāi)難性后果。

比如在我們?nèi)粘I钪惺褂玫钠嚩寂鋫淞税踩珰饽?,汽車在發(fā)生激烈碰撞時可能會在0.2s內(nèi)停下,那就要求氣囊在0.02s內(nèi)充氣完畢并彈出,超出這個時間乘客可能就會面臨生命危險。再比如導(dǎo)彈防御系統(tǒng),當(dāng)敵方導(dǎo)彈來襲時攔截系統(tǒng)必須做出100%的精準(zhǔn)反應(yīng)并計算出彈道軌跡進行攔截,稍有延遲就會造成攔截失敗,這種后果是不可接受的。這就是硬實時系統(tǒng)和軟實時系統(tǒng)的區(qū)別。但是由于Linux系統(tǒng)內(nèi)核過于龐大且模塊眾多,內(nèi)核中仍然有不少影響實時性的因素,比如使用大量自旋鎖、中斷禁止、時鐘粒度等,使其距離us級別的控制精度還有很大的距離。但是也不能因此認(rèn)定Linux系統(tǒng)今后就不能用于實時控制領(lǐng)域。

其實Linux內(nèi)核一路發(fā)展過來,在歷史的版本主線中仍然有很多技術(shù)公司或者大牛為了提升Linux系統(tǒng)的實時性而努力著,他們或是在某個版本上發(fā)布實時補丁,或是對內(nèi)核進行一定程度上的改造,具體的代表有RTLinux、RTAI(Real-Time Application Interface)和Xenomai等。

RTLinux全稱叫做AReal-Time Linux,它由美國新墨西哥礦業(yè)及科技學(xué)院的V. Yodaiken開發(fā)。RTLinux采用了雙內(nèi)核的做法,可以說是開創(chuàng)了雙內(nèi)核法的先河。簡單理解就是系統(tǒng)中存在兩個內(nèi)核,實時核和非實時核。底層硬件資源和實時的內(nèi)核打交道繞開非實時核,來自硬件的中斷源由實時核全面接管,把非實時的Linux內(nèi)核當(dāng)成實時核上的一個低優(yōu)先級的進程來運行,通過這種方式確保實時核上的中斷和任務(wù)得到優(yōu)先響應(yīng),提升了實時性。

Xenomai也借鑒了RTLinux的雙內(nèi)核做法,內(nèi)部也有實時核和非實時核。但不同的是Xenomai在底層硬件和兩個內(nèi)核之間還加了一層硬件抽象層ADEOS(Adoptive Domain Environment for Operating System),實時核和非實時核作為硬件抽象層的兩個域而存在,Xenomai內(nèi)核屬于實時域,Linux內(nèi)核屬于非實時域。ADEOS在系統(tǒng)的關(guān)鍵路徑中對中斷進行攔截,優(yōu)先響應(yīng)Xenomai實時域的中斷,當(dāng)沒有實時任務(wù)和中斷需要處理的時候才會輪到Linux內(nèi)核執(zhí)行。兩者對比如下。

圖2:RTLinux和Xenomai框架對比

由于版權(quán)、技術(shù)專利等因素,RTLinux已經(jīng)不再更新。而Xenomai因為注重拓展性,可移植性和可維護性,對開發(fā)者相對友好,目前還在不斷推出補丁,并且在社區(qū)活躍度很高,在工控領(lǐng)域也有不少成功應(yīng)用的案例。這些基于Linux系統(tǒng)去改造從而提升實時性的系統(tǒng)的出現(xiàn),使得Linux系統(tǒng)在發(fā)展過程中在實時性的研究上熱度不減。甚至有不少人從Linux系統(tǒng)實時性研究入手,深入去學(xué)習(xí)Linux內(nèi)核的調(diào)度機制、中斷機制、定時器機制等,逐漸發(fā)展成自己的興趣和愛好。從我們作為普通技術(shù)族的實力來說,可能不具備像國外的公司或者一些技術(shù)組織大改并發(fā)布實時Linux的能力。而想要提升系統(tǒng)實時性,有的是出于自身工作的需要,有的則是帶著個人的興趣愛好去鉆研,那么如果想提升Linux內(nèi)核的實時性,我們該怎么做呢?

2.Linux實時性優(yōu)化

2.1 實時性優(yōu)化和時鐘精度

知其然并知其所以然,知道影響實時性的因素才能很好的優(yōu)化改造它。目前影響Linux內(nèi)核實時性因素主要有時鐘精度、系統(tǒng)中斷、進程調(diào)度算法和內(nèi)核可搶占性等。每一塊都可以深入研究并做出相應(yīng)的優(yōu)化。首先是時鐘精度,時鐘就像是一個系統(tǒng)的脈搏,系統(tǒng)進程的調(diào)度切換是按照時鐘節(jié)拍來進行的。目前Linux內(nèi)核支持幾種不同的系統(tǒng)節(jié)拍,可以在用戶編譯內(nèi)核時配置。假設(shè)當(dāng)前的系統(tǒng)節(jié)拍是100Hz,那么系統(tǒng)的時鐘粒度就是10ms,如果提升到1000Hz,那么時鐘粒度就是1ms,精度提升了10倍。

圖3:編譯內(nèi)核系統(tǒng)節(jié)拍設(shè)置

上面這張圖是CentOS7.6發(fā)行版系統(tǒng)默認(rèn)的系統(tǒng)節(jié)拍設(shè)置。時鐘精度的提升最直接的影響就是系統(tǒng)中的調(diào)度動作加快了,進程的響應(yīng)也更為及時,但隨著而來的是時鐘中斷頻率的加快,這也加大了系統(tǒng)的開銷和壓力,因為會頻繁的響應(yīng)系統(tǒng)的時鐘中斷。在某些CPU消耗型的進程上會由于系統(tǒng)頻繁的進行進程切換而導(dǎo)致CPU資源浪費,CPU的時間會浪費在進程切換上,因為從進程切換到實際被調(diào)度執(zhí)行之間有一個時間差,叫做進程切換開銷,所以好和壞我們還是需要根據(jù)自己的系統(tǒng)表現(xiàn)來看待。

2.2 中斷

其次是中斷。無論是RTOS還是Linux,硬件中斷在系統(tǒng)當(dāng)中的響應(yīng)優(yōu)先級永遠是最高的。RTOS由于支持中斷優(yōu)先級,在實際使用過程中可以根據(jù)產(chǎn)品的實際情況針對不同的外設(shè)場景設(shè)置不同的優(yōu)先級,且高優(yōu)先級的中斷可以搶占低優(yōu)先級的中斷,使得RTOS的中斷響應(yīng)非常迅速。Linux系統(tǒng)中的中斷模塊遠比RTOS系統(tǒng)復(fù)雜得多。

通常,Linux系統(tǒng)在進入一個中斷時候,會禁止本地CPU的中斷。在處理具體某一個中斷的時候,由于禁止了本地CPU中斷(NMI類型的中斷除外),當(dāng)有新的中斷到來的時候只好掛起,只有當(dāng)前的中斷處理完才打開本地中斷并響應(yīng)新的中斷。如果系統(tǒng)中存在大量不同類型的中斷,勢必會有一些中斷被延遲得不到及時響應(yīng),這種延遲現(xiàn)象在單核CPU上表現(xiàn)尤為明顯。針對這種情況,就要求我們在編寫實際中斷處理函數(shù)的時候,盡量在中斷處理函數(shù)中不做復(fù)雜的操作,堅守中斷處理函數(shù)“快進快出”的原則。比如只讀取硬件寄存器等簡單操作即可,剩下的數(shù)據(jù)處理的操作放到中斷下半部中去執(zhí)行,這就是所謂的“中斷線程化”。

傳統(tǒng)上的中斷下半部有軟中斷、tasklet、工作隊列,它們的優(yōu)先級也從高到低。軟中斷和tasklet工作在中斷上下文不允許休眠它的優(yōu)先級比工作隊列高,工作隊列工作在進程上下文允許休眠但是優(yōu)先級最低,所以在實際編程開發(fā)中需要我們根據(jù)場景選擇性的使用。如果是多核CPU,那么可以根據(jù)實際的中斷情況把不同類型的中斷遷移綁定到不同的CPU上,避免不同中斷之間的干擾。下面以I.MX6DL硬件平臺為例子介紹中斷遷移的使用。首先,通過#cat /proc/interrupts指令查看系統(tǒng)的所有中斷,如下圖所示:

圖4:綁定中斷前的系統(tǒng)中斷分布

從上面圖中可以看出,當(dāng)前的硬件平臺一共有4顆CPU,其中IMX-uart和imx-i2c的中斷集中發(fā)生在CPU0和CPU3,從第一列可以知道它們的中斷號分別是58和69。接下來我們可以將IMX-uart中斷全部遷移到CPU1上,讓CPU0只響應(yīng)imx-i2c中斷。通過# echo "2" > /proc/irq/58/smp_affinity指令即可完成遷移。注意,這里的數(shù)字“2”表示CPU編號,它是從1開始。遷移后IMX-uart中斷情況如下:

圖5:綁定中斷后的系統(tǒng)中斷分布

從前后兩張圖對比可以看出,中斷遷移前,IMX-uart在CPU3上的中斷次數(shù)為1824次,在CPU0上中斷次數(shù)為727次。中斷遷移后,CPU0和CPU3不再響應(yīng)IMX-uart中斷,CPU1上IMX-uart中斷次數(shù)由15次增加到了115次。我曾經(jīng)在一個雙核硬件平臺上遇到過串口和SPI同時需要響應(yīng)大量中斷,它們互相影響導(dǎo)致中斷響應(yīng)不及時而出現(xiàn)數(shù)據(jù)丟失和輸出不及時的情況,最終就是通過中斷綁核解決的。中斷綁核其實不能完全消除對實時性的影響,只能最大程度去降低中斷對進程的影響,因為系統(tǒng)中NMI中斷和本地時鐘中斷無法遷移和禁止。除了中斷可以綁核,應(yīng)用層的進程和線程也可以改變它們與CPU的親和性,比如遷移到中斷較少的核上,也能在一定程度上提升進程的實時性。

2.3進程調(diào)度算法

除了前面提到的時鐘和中斷外,還有一個影響實時性最大的因素就是操作系統(tǒng)的調(diào)度算法。Linux系統(tǒng)目前默認(rèn)采用的是完全公平調(diào)度算法(CFS),它按照各個進程的權(quán)重來分配運行時間,在默認(rèn)使用CFS的情況下,我們可以給有實時性需求的進程分配更高的優(yōu)先級和權(quán)重,可以看做是通過賦予更高的優(yōu)先級來獲得更好的實時性。 Linux內(nèi)核目前支持多種調(diào)度類,每一種調(diào)度類都是同一類型調(diào)度策略的集合,目前支持的調(diào)度類有:stop、deadline、realtime、CFS、idle。

通常情況下進程都可選以上的幾種調(diào)度類,他們的優(yōu)先級依次由高到底排序,其中deadline調(diào)度類可選的調(diào)度策略有SCHED_DEADLINE,realtime調(diào)度類可選的調(diào)度策略有SCHED_FIFO和SCHED_RR,CFS可選的調(diào)度類有SCHED_NORMAI、SCHED_BATCH和SCHED_IDLE。在實際開發(fā)過程中,如果對時間有嚴(yán)格要求的實時進程可以選擇deadline調(diào)度類,其他情況可以參考使用對應(yīng)的調(diào)度策略,改變調(diào)度策略,是最直接的一種優(yōu)化方式。其中deadline調(diào)度類的使用參考如下:

圖6:deadline調(diào)度策略編程參考

2.4 內(nèi)核其他限制

除了內(nèi)核本身的調(diào)度算法的原因,Linux內(nèi)核的調(diào)度模塊當(dāng)中還有其他限制因素。比如為了防止某個進程或某一個進程組長時間的占用CPU時間,Linux內(nèi)核引入了一個“運行帶寬”的概念,也就是說某一個進程或進程組使用CPU的總時間不能超過這個“帶寬”閾值,默認(rèn)值是0.95s。

圖7:“運行帶寬”默認(rèn)值

實際開發(fā)過程中為了提高我們進程的實時性,需要進程長時間地占用CPU資源,我們可以把這個“運行帶寬”給禁止掉。實際上不同的產(chǎn)品和使用場景也會有著不同的優(yōu)化措施,如果設(shè)備的CPU核數(shù)比較多,我們可以從整體上去規(guī)劃系統(tǒng)對于CPU的使用,大量的使用中斷綁核和進程、線程綁核達到對CPU的獨占使用。比如DPDK,它是Intel公司開發(fā)的一種高性能網(wǎng)絡(luò)加速組件。在Linux內(nèi)核中,傳統(tǒng)的網(wǎng)絡(luò)數(shù)據(jù)包的收發(fā)都是經(jīng)過網(wǎng)卡驅(qū)動和內(nèi)核協(xié)議棧,網(wǎng)卡驅(qū)動針對大數(shù)據(jù)包場景也做了大量的應(yīng)對措施,但是從本質(zhì)上來說,網(wǎng)絡(luò)包的收發(fā)在內(nèi)核中也還是依賴系統(tǒng)給我們實現(xiàn)好的軟中斷機制。

而DPDK則是使用輪詢代替了中斷,它繞過了Linux內(nèi)核的網(wǎng)絡(luò)模塊(驅(qū)動和協(xié)議棧),不需要頻繁的進行數(shù)據(jù)的拷貝,使得用戶空間可以直接看到硬件網(wǎng)卡的數(shù)據(jù),這大大減小了數(shù)據(jù)傳遞路程上的開銷。下面這張圖就是使用輪詢和DPDK獨占CPU的一個例子。

圖8:DPDK輪詢獨占CPU

再比如,irqbalance,它用于中斷收集分配,會根據(jù)系統(tǒng)的負(fù)載情況自動進入性能模式和節(jié)能模式,會將中斷平均分配到不同的CPU上去處理,特殊情況下我們需要禁止這個功能。還有其他比如禁止軟鎖、虛擬內(nèi)存管理優(yōu)化等。從上面可以看出,實時性優(yōu)化的方法多種多樣,甚至使用使用輪詢代替了中斷。但是關(guān)鍵還是在于我們要了解Linux內(nèi)核模塊的一些運行機制,和這些機制在實現(xiàn)上本身就存在的缺點,只有這樣我們才能針對具體問題作出對應(yīng)的優(yōu)化措施。以上提到的這些方法只是從大的方向而且很淺顯去分析和介紹Linux內(nèi)核的實時性影響因素和對應(yīng)的優(yōu)化措施??偨Y(jié)起來有以下幾點:

  • 中斷優(yōu)先級高,要減少中斷對進程的影響;
  • 進程之間有優(yōu)先級之分,要合理改變優(yōu)先級;
  • 內(nèi)核模塊的實現(xiàn)機制限制,在特殊情況下使用輪訓(xùn);
  • 提升系統(tǒng)節(jié)拍,提升定時精度;
  • 禁止irqbalance,防止進入節(jié)能或休眠模式;

還有其他更為深入的細(xì)節(jié)我們沒有深入分析,比如Linux進程切換耗時,中斷響應(yīng)耗時、內(nèi)存分配開銷以及普通定時器精度和高精度定時器精度等,這些都是從細(xì)分的模塊方向去研究并優(yōu)化。進程的切換涉及到主調(diào)度器和周期調(diào)度器,它們都不可避免地涉及到定時器,目前Linux內(nèi)核的高精度定時器也很難做到us級別,這也就決定了在調(diào)度的時間上也不是那么地準(zhǔn)確,再加上內(nèi)核中充斥著大量的自旋鎖,而自旋鎖的使用會關(guān)閉CPU的中斷進而影響實時性,所以在開發(fā)過程中更加提高了對我們自身的水平要求。

3.總結(jié)

前面列舉的這些優(yōu)化措施實施起來很簡單,但對于我們自身來說更要理解為什么要這么做。深入去分析Linux內(nèi)核的機制,實際的去閱讀內(nèi)核的模塊源碼,才會在實時性或者Linux內(nèi)核的學(xué)習(xí)道路上收獲更多。比如閱讀內(nèi)核源碼才會知道tasklet和workqueue的應(yīng)用場景的不同,盡管它們都是“中斷下半部”之一,但是它們在內(nèi)核當(dāng)中執(zhí)行的優(yōu)先級還是有很大區(qū)別。只有閱讀內(nèi)核源碼,才會知道tasklet和hrtimer也是基于軟中斷的,而且這個軟中斷也有優(yōu)先級之分。也只有閱讀內(nèi)核源碼,才會知道系統(tǒng)目前實現(xiàn)了多少種軟中斷,甚至我們自己也可以實現(xiàn)軟中斷獲得實時性的提升,盡管Linux內(nèi)核不建議我們這么做。

除了閱讀內(nèi)核的源碼,掌握調(diào)試跟蹤內(nèi)核的工具也必不可少,比如ftrace、trace-cmd、kernelshark、perf等。俗話說,工欲善其事必先利其器,熟練掌握這些工具的使用會讓我們優(yōu)化工作更高效。ftrace是一個很強大的調(diào)試工具,除了常用的函數(shù)跟蹤器能讓我們輕松知道一個函數(shù)的執(zhí)行耗時之外,它強大的event機制,更是可以直接讓我們在驅(qū)動或者內(nèi)核中添加跟蹤點,輸出內(nèi)核執(zhí)行過程中的各類數(shù)據(jù),讓我們輕松洞察內(nèi)核的執(zhí)行過程。總之,實時性優(yōu)化是一條漫長的道路,一路上也充滿了各種未知,鉆研越深越對它充滿好奇,也越覺得Linux內(nèi)核神奇。

比如你可能會好奇在Linux內(nèi)核中一個進程從被喚醒到真正去執(zhí)行這個過程花了多長時間。又比如一個外部中斷,從它被觸發(fā)到真正走到用戶注冊的中斷處理函數(shù),這個過程又花了多長時間。只有自己親自到設(shè)備上去調(diào)試,去嘗試弄明白這些問題了才會發(fā)現(xiàn)Linux內(nèi)核有趣的地方,也才會越走越充實。以上只是我自己在工作過程中積累的一點觀點看法,如果讀者面對Linux內(nèi)核不知道從何處入手的話,個人建議不妨從實時性優(yōu)化這個方向入手,逐漸深入。

作者簡介:鄧世強,一線碼農(nóng),從事通信行業(yè),目前在一家通信公司擔(dān)任內(nèi)核工程師,日常喜歡鉆研學(xué)習(xí)Linux內(nèi)核知識。

責(zé)任編輯:武曉燕 來源: Linux閱碼場
相關(guān)推薦

2011-07-05 18:30:44

站內(nèi)優(yōu)化

2016-07-22 10:50:56

Linux內(nèi)核無線子系統(tǒng)

2010-03-24 10:10:21

2011-06-02 15:03:07

SEO

2009-07-05 11:23:44

2020-06-04 08:36:55

Linux內(nèi)核線程

2024-12-04 10:39:00

Linux內(nèi)核技術(shù)性

2010-07-19 10:05:52

ibmdwLinux

2015-11-09 11:19:36

Linux安全Linux內(nèi)核安全

2013-11-25 14:57:04

TCPTCP優(yōu)化

2013-05-22 14:59:26

Linux操作系統(tǒng)實時性

2009-05-04 09:52:49

Oracle優(yōu)化排序

2023-03-27 09:08:11

Linux

2022-06-16 09:43:27

Linux實時

2023-11-15 18:46:49

HBase數(shù)據(jù)庫開源

2012-06-01 10:23:47

Mobile Site優(yōu)化

2025-03-12 04:25:00

Linux系統(tǒng)優(yōu)化應(yīng)用

2019-09-18 08:53:55

2020-01-06 11:22:06

TCPLinux內(nèi)核

2013-11-15 13:10:36

SUSE SolidDSUSELinux內(nèi)核
點贊
收藏

51CTO技術(shù)棧公眾號