《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 其他 > Linux教學(xué)——Linux進(jìn)程調(diào)度與性能優(yōu)化

Linux教學(xué)——Linux進(jìn)程調(diào)度與性能優(yōu)化

2022-08-19
作者:張毅峰
來源:Linux閱碼場(chǎng)
關(guān)鍵詞: Linux

  

    一,、eBPF安全可觀測(cè)性的前景展望
  

  本次分享將從監(jiān)控和可觀測(cè)性、eBPF安全可觀測(cè)性分析,、內(nèi)核安全可觀測(cè)性展望三個(gè)方面展開,。   

  

  1.監(jiān)控(Monitoring)vs可觀測(cè)性(Observability)   

  

  微信圖片_20220819155917.png  

  

  從上圖可以看到,監(jiān)控只是可觀測(cè)性的冰山一角,,而大部分都隱藏在水面之下的深層次問題無法簡(jiǎn)單通過監(jiān)控解決,。   

  

  目前監(jiān)控也開始可視化,但絕大部分都是事先預(yù)定義參數(shù),,然后事后查看日志,,進(jìn)行分析。監(jiān)控的缺點(diǎn)包括:   

  

  可擴(kuò)展性差,,需要修改代碼和編譯,;驗(yàn)證周期長(zhǎng);數(shù)據(jù)來源窄等問題,。   

  

  

  可觀測(cè)性是通過主動(dòng)定制度量的搜集和內(nèi)核數(shù)據(jù)聚合,,包括以下三種:   

  

  

  Logging  

  

  實(shí)時(shí)或者事后特定事件信息   

  

  分布式服務(wù)器集群的海量數(shù)據(jù)溯源圖   

  

  離散信息整理各種異步信息   

  

       Tracing    

  


  數(shù)據(jù)源:提供數(shù)據(jù)來源   

  

  采集框架:往上對(duì)接數(shù)據(jù)源,采集解析發(fā)送數(shù)據(jù),,往下對(duì)用戶態(tài)提供接口   

  

  前端交互:對(duì)接Tracing內(nèi)核框架,,直接與用戶交互,負(fù)責(zé)采集配置和數(shù)據(jù)分析   

  

  Metrics(度量)這也是可觀測(cè)性與監(jiān)控最主要的區(qū)別   

   

  系統(tǒng)中某一類信息的統(tǒng)計(jì)聚合,,比如CPU,、內(nèi)存、網(wǎng)絡(luò)吞吐,、硬盤 I/O,、硬盤使用等情況。當(dāng)度量值觸發(fā)異常閾值時(shí),,系統(tǒng)可以發(fā)出告警信息或主動(dòng)處理,,比如殺死或隔離進(jìn)程,;   

  

  主要目的:監(jiān)控(Monitoring)和預(yù)警(Alert)   


  總結(jié)一下監(jiān)控和觀測(cè)的區(qū)別:   

  

  監(jiān)控:收集和分析系統(tǒng)數(shù)據(jù),查看系統(tǒng)當(dāng)前的狀態(tài),,對(duì)可預(yù)見的問題進(jìn)行分析處理,;   

  

  可觀測(cè)性:通過觀察系統(tǒng)并衡量系統(tǒng)的內(nèi)部狀態(tài),從其外部輸出的數(shù)據(jù)推斷出來系統(tǒng)此時(shí)處于某種程度的度量,,特別是我們所關(guān)心的場(chǎng)景和事件,;   

  

  


  微信圖片_20220819160017.png  

  

   2.eBPF安全可觀測(cè)性分析  

  

  先簡(jiǎn)單定義下什么是安全:安全指的是某種對(duì)象或者對(duì)象屬性不受威脅的狀態(tài)。   

  

  所謂安全可觀測(cè)性:   

  

  通過觀測(cè)整個(gè)系統(tǒng),,從低級(jí)別的內(nèi)核可見性到跟蹤文件訪問,、網(wǎng)絡(luò)活動(dòng)或能力(capability)變化,一直到應(yīng)用層,,涵蓋了諸如對(duì)易受攻擊的共享庫的函數(shù)調(diào)用,、跟蹤進(jìn)程執(zhí)行或解析發(fā)出的 HTTP 請(qǐng)求。因此這里的安全是整體的概念,。   

  提供對(duì)各種內(nèi)核子系統(tǒng)的可觀測(cè)性,,涵蓋了命名空間逃逸、Capabilities 和特權(quán)升級(jí),、文件系統(tǒng)和數(shù)據(jù)訪問,、HTTP、DNS,、TLS 和 TCP 等協(xié)議的網(wǎng)絡(luò)活動(dòng),,以及系統(tǒng)調(diào)用層的事件,以審計(jì)系統(tǒng)調(diào)用和跟蹤進(jìn)程執(zhí)行,。   

  

  從日志、跟蹤及度量三個(gè)維度檢查相關(guān)輸出,,進(jìn)而來衡量系統(tǒng)內(nèi)部安全狀態(tài)的能力,。   

      

  eBPF的安全可觀測(cè)性表現(xiàn)為對(duì)內(nèi)核來說其存在感極低但觀測(cè)能力卻異常強(qiáng)大(藥效好,副作用?。?   

  

  程序沙箱化:通過eBPF驗(yàn)證器保護(hù)內(nèi)核穩(wěn)定運(yùn)行,。

  侵入性低:無須修改內(nèi)核代碼,且無須停止程序運(yùn)行,。

  透明化:從內(nèi)核中透明搜集數(shù)據(jù),,保證企業(yè)最重要的數(shù)據(jù)資產(chǎn)。

  可配置:Cilium等自定義乃至自動(dòng)化配置策略,,更新靈活性高,,過濾條件豐富。

  快速檢測(cè):在內(nèi)核中直接處理各種事件,,不需要回傳用戶態(tài),,使得異常檢測(cè)方便和快速,。

  

  其中的程序沙箱話離不開更安全的eBPF Verifier(其中最重要的是邊界檢查):   


  

  擁有加載eBPF程序的流程所需的特權(quán)

  無crash或其他異常導(dǎo)致系統(tǒng)崩潰的情況

  程序可以正常結(jié)束,無死循環(huán)

  檢查內(nèi)存越界

  檢查寄存器溢出

  eBPF的可觀測(cè)性應(yīng)用場(chǎng)景主要有以下三類:   

  


     1.云原生容器的安全可觀測(cè)性,、   


  這也是傳統(tǒng)BPF基于網(wǎng)絡(luò)應(yīng)用場(chǎng)景的進(jìn)一步發(fā)展:   

  隨著云網(wǎng)邊端的急速發(fā)展,,人們的目光越發(fā)的聚焦在目前最火熱的云原生場(chǎng)景上。Falco,、Tracee,、Tetragon、Datadog-agent,、KubeArmor是現(xiàn)階段云原生場(chǎng)景下比較流行的幾款運(yùn)行時(shí)防護(hù)方案,。   

  

  這些方案主要是基于eBPF掛載內(nèi)核函數(shù)并編寫過濾策略,在內(nèi)核層出現(xiàn)異常攻擊時(shí)觸發(fā)預(yù)置的策略,,無需再返回用戶層而直接發(fā)出告警甚至阻斷,。   

 以預(yù)防的方式在整個(gè)操作系統(tǒng)中執(zhí)行安全策略,而不是對(duì)事件異步地做出反應(yīng),。除了能夠?yàn)槎鄠€(gè)層級(jí)的訪問控制指定允許列表外,,還能夠自動(dòng)檢測(cè)特權(quán)和 Capabilities 升級(jí)或命名空間提權(quán)(容器逃逸),并自動(dòng)終止受影響的進(jìn)程,。   

  安全策略可以通過 Kubernetes(CRD),、JSON API 或 Open Policy Agent(OPA)等系統(tǒng)注入。   

  


  2.應(yīng)用層安全可觀測(cè)方案   

  

  微信圖片_20220819160219.png  

  

  3.內(nèi)核層安全可觀測(cè)方案   

  

  微信圖片_20220819160235.png  

  

   3.內(nèi)核安全可觀測(cè)性展望  

  

  下面從傳統(tǒng)內(nèi)核安全,、Android內(nèi)核安全,、KRSI等幾個(gè)方面展開討論。   

  

  傳統(tǒng)內(nèi)核安全方案存在著諸多需要解決的問題:   

  

  正如Linus Torvalds曾經(jīng)說過的,,大多數(shù)安全問題都是bug造成的,,而bug又是軟件開發(fā)過程的一部分,是軟件就有bug,。   

  

  至于是安全還是非安全漏洞bug,,內(nèi)核社區(qū)的做法就是盡可能多的測(cè)試,找出更多潛在漏洞這樣近似于黑名單的做法,。   

  

  內(nèi)核代碼提交走的流程比較繁瑣,,應(yīng)用到具體內(nèi)核版本上,又存在周期長(zhǎng)以及版本適配的問題,,所以導(dǎo)致內(nèi)核在安全方面發(fā)展的速度明顯慢于其他模塊,。同時(shí),隨著智能化,、數(shù)字化,、云化的飛速發(fā)展,全球基于Linux系統(tǒng)的設(shè)備數(shù)以百億計(jì),而這些設(shè)備的安全保障主要取決于主線內(nèi)核的安全性和健壯性,,當(dāng)某一內(nèi)核LTS版本被發(fā)有漏洞,,這樣相關(guān)的機(jī)器都會(huì)面臨被攻破利用的局面,損失難以估量,。    


  


  嵌入式領(lǐng)域的Android內(nèi)核安全:  

  

  現(xiàn)如今,,世界上越來越多的智能終端包括手機(jī)、TV,、SmartBox和IoT,、汽車、多媒體設(shè)備等等,,均深度使用Android系統(tǒng),,而Android的底層正是Linux內(nèi)核,這也讓Linux內(nèi)核的安全性對(duì)Android產(chǎn)生重大影響,。   

  

  由于歷史原因,,Google在Android內(nèi)核開源的問題上,理念和Linux內(nèi)核社區(qū)不是十分的匹配,,這也導(dǎo)致了Android對(duì)內(nèi)核做了大量的針對(duì)性修改,,但是無法合入到Upstream上。這也導(dǎo)致了Android內(nèi)核在安全側(cè)有部分不同于Linux內(nèi)核,,側(cè)重點(diǎn)也存在不同,。   

  

  在操作系統(tǒng)級(jí)別,Android平臺(tái)不僅提供Linux內(nèi)核的安全功能,,而且還提供安全的進(jìn)程間通信 (IPC)機(jī)制,,以便在不同進(jìn)程中運(yùn)行的應(yīng)用之間安全通信。操作系統(tǒng)級(jí)別的這些安全功能旨在確保即使是原生代碼也要受應(yīng)用沙盒的限制,。無論相應(yīng)代碼是自帶應(yīng)用行為導(dǎo)致的結(jié)果,,還是利用應(yīng)用漏洞導(dǎo)致的結(jié)果,系統(tǒng)都能防止違規(guī)應(yīng)用危害其他應(yīng)用,、Android 系統(tǒng)或設(shè)備本身,。   

  

    


  Android內(nèi)核安全特性:  

  

  HWAddressSanitizer(硬件支持的內(nèi)存檢測(cè)工具)

  KASAN

  Top-byte Ignore

  KCFI(流控完整性校驗(yàn))

  ShadowCallStack(堆棧保護(hù))

  

  目前工作的關(guān)注重點(diǎn)是內(nèi)核安全可觀測(cè)性利器-KRSI:   

  

  KRSI (Kernel Runtime Security Instrumentation)的原型通過LSM (Linux security module)形式實(shí)現(xiàn),可以將eBPF program掛載到kernel的security hook(安全掛鉤點(diǎn))上,。內(nèi)核的安全性主要包括兩個(gè)方面:Signals和Mitigations,,這兩者密不可分,。   

  

  Signals:意味著系統(tǒng)有一些異?;顒?dòng)的跡象、事件   

  

  Mitigations:在檢測(cè)到異常行為之后所采取的告警或阻斷措施   

  


  KRSI基于LSM來實(shí)現(xiàn),,這也就使其能夠進(jìn)行訪問控制策略的決策,,但這不是KRSI的工作重心,主要是為了全面監(jiān)視系統(tǒng)行為,以便檢測(cè)攻擊(最重要的應(yīng)用場(chǎng)景,,但目前主要還是只做檢測(cè)居多,,因?yàn)橘Q(mào)然做阻斷處理可能會(huì)比較危險(xiǎn))。從這種角度來看,,KRSI可以說是內(nèi)核審計(jì)機(jī)制的擴(kuò)展,,使用eBPF來提供比目前內(nèi)核審計(jì)子系統(tǒng)更高級(jí)別的可配置性。   

  

  KRSI工具可以看作是eBPF和LSM的強(qiáng)強(qiáng)聯(lián)合:KRSI = eBPF + LSM   

  

  微信圖片_20220819160644.png  

  

  1.KRSI允許適當(dāng)?shù)奶貦?quán)用戶將BPF程序掛載到LSM子系統(tǒng)提供的數(shù)百個(gè)鉤子中的任何一個(gè)上面,。   

  

  2.為了簡(jiǎn)化這個(gè)步驟,,KRSI在/sys/kernel/security/bpf下面導(dǎo)出了一個(gè)新的文件系統(tǒng)層次結(jié)構(gòu)——每個(gè)鉤子對(duì)應(yīng)一個(gè)文件。   

  

  3.可以使用bpf()系統(tǒng)調(diào)用將BPF程序(新的BPF_PROG_TYPE_LSM 類型)掛載到這些鉤子上,,并且可以有多個(gè)程序掛載到任何給定的鉤子,。   

  

  4.每當(dāng)觸發(fā)一個(gè)安全鉤子時(shí),將依次調(diào)用所有掛載的BPF程序,,只要任一BPF程序返回錯(cuò)誤狀態(tài),,那么請(qǐng)求的操作將被拒絕。   

  

  5.KRSI能夠從函數(shù)級(jí)別做阻斷操作,,相比進(jìn)程具有更細(xì)粒度,,危險(xiǎn)程度也會(huì)小得多。   

  

  后續(xù)計(jì)劃   

  

  內(nèi)核安全問題是個(gè)非常復(fù)雜的話題,,牽一發(fā)而動(dòng)全身,,防御機(jī)制、加固配置,、漏洞利用等等挑戰(zhàn)性的技術(shù),。在進(jìn)行加固防御的過程中,又會(huì)產(chǎn)生性能或者系統(tǒng)穩(wěn)定性相關(guān)的影響,。   

  

  從eBPF + LSM的角度可以更加可視化,、數(shù)據(jù)豐富的觀測(cè)內(nèi)核安全情況,進(jìn)而在內(nèi)核Livepatch,、漏洞檢測(cè)以及防御提權(quán)相關(guān)攻擊手段上,,有著進(jìn)一步的發(fā)展空間。   

  

  二,、Linux進(jìn)程調(diào)度與性能優(yōu)化  

  

  本次分享將從進(jìn)程調(diào)度概念,、進(jìn)程調(diào)度框架、進(jìn)程調(diào)度算法和性能優(yōu)化四個(gè)方面展開,。   

  

  1.進(jìn)程調(diào)度概念   

  

  微信圖片_20220819160718.png  

  

  最初的Linux只有進(jìn)程,,task_struct相當(dāng)于進(jìn)程控制塊(PCB),后來出現(xiàn)了線程,,task_struct就開始對(duì)應(yīng)線程,。Linux沒有從概念上直接區(qū)分兩者,如果不同的task_struct間共享資源,它們屬于同一進(jìn)程中的線程,,否則就屬于不同的進(jìn)程,。   

  

  這里要注意,用戶態(tài)中的進(jìn)程和線程與內(nèi)核態(tài)間的映射關(guān)系:用戶態(tài)函數(shù)getpid()得到的是內(nèi)核中的tgid,;用戶態(tài)函數(shù)gettid()得到的是內(nèi)核中的pid,。   

  

  Posix支持一級(jí)調(diào)度和二級(jí)調(diào)度兩種模式,二級(jí)調(diào)度會(huì)先調(diào)度進(jìn)程,,然后才是進(jìn)程中的線程,。而Linux選擇的是直接調(diào)度線程的一級(jí)調(diào)度,效率會(huì)比二級(jí)調(diào)度高,。   

  

  Linux進(jìn)程調(diào)度體系如下圖:   

  

  微信圖片_20220819160737.png  

  

  CPU資源管理器(what):調(diào)度器(scheduler)就是CPU資源管理器,,因?yàn)椴僮飨到y(tǒng)的重要作用之一是管理各種系統(tǒng)資源,而CPU是其中最重要的資源,。常用直接共享型資源的管理方法有時(shí)分,、空分、獨(dú)占等,,IO一般是獨(dú)占資源,,內(nèi)存支持空分管理,而CPU只支持時(shí)分,,因此這種時(shí)分管理方法就是進(jìn)程調(diào)度,。   

  

   為什么要及為什么能調(diào)度(why):  

  

  為什么要調(diào)度:宏觀并行,微觀串行,,支持多任務(wù)的協(xié)作與搶占,。最初是協(xié)作,后來為了防止個(gè)別進(jìn)程長(zhǎng)期霸占CPU,,引入了搶占機(jī)制,。   

  

  為什么能調(diào)度:包括主動(dòng)調(diào)度和被動(dòng)調(diào)度,線程上下文可切換,。   

  

   調(diào)度時(shí)機(jī)(when):  

  

  主動(dòng)調(diào)度:通過主動(dòng)調(diào)用sched_yield的自愿性主動(dòng)調(diào)度,,以及進(jìn)程由于等待資源而阻塞的非自愿性主動(dòng)調(diào)度。   

  

    被動(dòng)調(diào)度:  

  

  觸發(fā)點(diǎn):設(shè)置 TIF_NEED_RESCHED 標(biāo)志,,主要是時(shí)鐘中斷和喚醒搶占,。   

  

  執(zhí)行點(diǎn):檢查 TIF_NEED_RESCHED 標(biāo)志 和 滿足preempt_count == 0的條件。   

  

  主要包括以下四種場(chǎng)景:  

  系統(tǒng)調(diào)用完成返回用戶空間      

       完成返回用戶空間

  中斷完成返回內(nèi)核空間

  出禁用搶占臨界區(qū)

  

  如何進(jìn)行調(diào)度(how):調(diào)用pick_next_task()選擇下一個(gè)調(diào)度進(jìn)程和通過context_switch切換進(jìn)程(上下文:內(nèi)存空間,,寄存器和棧),。   

  

  下面按時(shí)間順序簡(jiǎn)單介紹一下linux調(diào)度器的發(fā)展歷史:   

  

  傳統(tǒng)Unix調(diào)度器:區(qū)分IO密集型和CPU密集型,但全局只有一個(gè)未排序的運(yùn)行隊(duì)列,,多CPU會(huì)有競(jìng)爭(zhēng),,而且調(diào)度選擇需要遍歷整個(gè)隊(duì)列,復(fù)雜度為O(n),。

  O(1)調(diào)度器:運(yùn)行隊(duì)列從全局變成每個(gè)CPU一個(gè),,鏈表分成活動(dòng)和過期兩個(gè)數(shù)組,引入位圖,,復(fù)雜度降為為O(1),。

  SD調(diào)度器:考慮到會(huì)因?yàn)閭€(gè)別進(jìn)程的偽裝而造成的實(shí)際調(diào)度不公平,不再區(qū)分IO和CPU密集型,,未合入內(nèi)核,。

  RSDL調(diào)度器:組時(shí)間配額,有點(diǎn)像Cgroup,,但未合入內(nèi)核,。

  CFS(完全公平調(diào)度器):從SD/RSDL中吸取了完全公平的思想,目前內(nèi)核主流調(diào)度器,。

  

  可以從以下幾個(gè)方面來評(píng)價(jià)調(diào)度器:   

  

  1.響應(yīng)性:存在大量人機(jī)交互的PC和手機(jī)要重視響應(yīng),。   

  

  2.吞吐量:服務(wù)器更關(guān)心吞吐量,而提高響應(yīng)性會(huì)增加進(jìn)程切換的評(píng)論,,也就會(huì)降低吞吐量,。所以響應(yīng)和吞吐是一對(duì)矛盾。   

  

  3.公平性:相對(duì)公平,,實(shí)際和理論的運(yùn)行時(shí)間應(yīng)該相符,。   

  

  4.適應(yīng)性:也就是可擴(kuò)展性。   

  

  5.節(jié)能性:智能手機(jī)的需求,,需要通過調(diào)度均衡來省電,。   

  

  2.進(jìn)程調(diào)度框架   

  

  如下圖所示,Linux一共有5個(gè)調(diào)度類:(stop和idle每個(gè)CPU一個(gè))   

  

  stop:無調(diào)度策略,,用戶空間不可用,,內(nèi)核用來處理線程遷移等優(yōu)先級(jí)極高的事情。   

  

  idle:無調(diào)度策略,,用戶空間不可用,,無其他進(jìn)程調(diào)用時(shí)才調(diào)用idle進(jìn)程。   

  

  deadline:硬實(shí)時(shí),,要在確定時(shí)延內(nèi)完成調(diào)度,。   

  

  realtime:軟實(shí)時(shí),盡力而為保證實(shí)時(shí)性,。   

  

  time-share:按優(yōu)先級(jí)分配時(shí)間片,。   

  

  微信圖片_20220819160923.png  

  

  調(diào)度類之間的關(guān)系:除非資源限制,優(yōu)先調(diào)度高優(yōu)先級(jí)進(jìn)程,。但要注意,,Linux考慮到在惡劣環(huán)境下,,普通進(jìn)程應(yīng)該仍有被調(diào)度的機(jī)會(huì),會(huì)默認(rèn)預(yù)留有5%的帶寬給普通進(jìn)程,。   

  

  如下圖所示,,從用戶空間到內(nèi)核空間,進(jìn)程優(yōu)先級(jí)會(huì)發(fā)生轉(zhuǎn)換:   

  

  微信圖片_20220819160937.png  

  

  用戶空間優(yōu)先級(jí):分為1~99優(yōu)先級(jí)從低到高的實(shí)時(shí)進(jìn)程,,以及nice值-20~19動(dòng)態(tài)優(yōu)先級(jí)從高到低的分時(shí)進(jìn)程,。   

  

  映射到內(nèi)核空間優(yōu)先級(jí)分為三步:   

  

  1.實(shí)時(shí)優(yōu)先級(jí):實(shí)時(shí)進(jìn)程不變,分時(shí)進(jìn)程從動(dòng)態(tài)優(yōu)先級(jí)映射為100~139靜態(tài)優(yōu)先級(jí)由高到低,。   

  

  2.規(guī)范優(yōu)先級(jí):實(shí)時(shí)進(jìn)程映射為-1~98優(yōu)先級(jí)由高到低,,99為空,分時(shí)進(jìn)程靜態(tài)優(yōu)先級(jí)不變,。   

  

  3.動(dòng)態(tài)優(yōu)先級(jí):可以看到動(dòng)態(tài)優(yōu)先級(jí)幾乎等于規(guī)范優(yōu)先級(jí),,只有在解決優(yōu)先級(jí)反轉(zhuǎn)問題時(shí)采用優(yōu)先級(jí)繼承策略時(shí)才會(huì)變化,此時(shí)會(huì)體現(xiàn)為動(dòng)態(tài)優(yōu)先級(jí),。   

  

   注意:-1和-2分別對(duì)應(yīng)deadline和stop的邏輯優(yōu)先級(jí),。  

  

  那如何進(jìn)行進(jìn)程切換呢?   

  

    切換用戶空間:不同進(jìn)程的用戶空間不同,,需要切換,。   

  

   切換內(nèi)核棧:不同進(jìn)程共享內(nèi)核空間,但需要切換內(nèi)核棧,。進(jìn)程切換就像火車切換軌道,,換道后,車上的人感覺火車沒變,,但是因?yàn)檐壍雷兞?,行程也就跟著變了。線程的執(zhí)行過程就是函數(shù)調(diào)用樹的深度優(yōu)先遍歷,,進(jìn)程的切換點(diǎn)是__schedule函數(shù),,該函數(shù)前半部分在進(jìn)程A的調(diào)用棧上執(zhí)行,后半部分就跑到進(jìn)程B的調(diào)用棧上執(zhí)行了,,返回則在新進(jìn)程上執(zhí)行,。   

  

   3.進(jìn)程調(diào)度算法  

  

  CFS調(diào)度器定義:通過引入虛擬運(yùn)行時(shí)間vruntime(realtime / weight),每次選擇vruntime最小的進(jìn)程(紅黑樹來管理)來調(diào)度,,在真實(shí)硬件上模擬理想多任務(wù)處理器,。   

  

  枯燥的定義不太容易理解的話,下面我們通過一個(gè)與實(shí)際生活比較貼近的例子來解釋CFS調(diào)度模型,。   

  

  微信圖片_20220819161000.png  

  

  請(qǐng)仔細(xì)觀察上圖,,圖中事物與進(jìn)程調(diào)度的映射關(guān)系如下:   

  

   水杯:表示進(jìn)程,蓋子打開的水杯表示進(jìn)程處于就緒和執(zhí)行狀態(tài),,其中Ready Table上的水杯都是就緒態(tài)進(jìn)程,,水龍頭下的水杯是運(yùn)行態(tài)進(jìn)程,。蓋子閉合的表示阻塞態(tài)的進(jìn)程,它們都在不同的Wait Box中,。   

  

  水杯的粗細(xì):表示不同的優(yōu)先級(jí),。   

  

   watermark:表示虛擬運(yùn)行時(shí)間vruntime,min watermark會(huì)被pick to run,。   

  

    Ready Table:表示可運(yùn)行隊(duì)列rq。   

  

  Wait Box:表示不同Event對(duì)應(yīng)的等待隊(duì)列,,如果只能由對(duì)應(yīng)的Event喚醒的話,,就屬于不可中斷的深睡眠,否則就是也可由signal喚醒的可中斷淺睡眠,。   

  

   水龍頭:表示CPU,,水龍頭中放出來的水就是CPU時(shí)間。   

  

   操作pick to run的手:表示調(diào)度算法,,如果調(diào)度過于頻繁,,那杯子接的水就少,水龍頭的水掉地上浪費(fèi)了(響應(yīng)好但性能差),;反之調(diào)度周期長(zhǎng)的話,,杯子接的水太多會(huì)造成不平均(性能好但響應(yīng)差)。權(quán)衡下來既不能接太少,,最小值就是調(diào)度粒度,;也不能接太多,最大值就是時(shí)間片,。   

  

  這里需要特別注意的幾點(diǎn):   

  

  1.進(jìn)程的狀態(tài)   

  

  注意區(qū)別進(jìn)程的5種狀態(tài)中的運(yùn)行態(tài)和就緒態(tài),,所有就緒態(tài)進(jìn)程都位于cpu的運(yùn)行隊(duì)列中,而每個(gè)cpu上當(dāng)前只有一個(gè)運(yùn)行態(tài)進(jìn)程,??梢钥吹较旅娴拇a分別通過on_rq和on_cpu來確定進(jìn)程是runnable的就緒態(tài)還是running的運(yùn)行態(tài)。對(duì)應(yīng)上面的例子,,桌子上的開口水杯表示就緒(on_rq),,水龍頭下的開口水杯表示運(yùn)行(on_cpu)。   

  

  微信圖片_20220819161118.png  

  

  2.優(yōu)先級(jí)與權(quán)重   

  

  CFS中的nice值會(huì)提前轉(zhuǎn)換為權(quán)重,,nice的范圍是 [-20 -- 19],,為了使得兩個(gè)相鄰的權(quán)重的占比差為10%,將以nice 0 為基準(zhǔn)轉(zhuǎn)化為1024,,整個(gè)數(shù)列是以1.25為公比的等比數(shù)列,。將原來的等差數(shù)列轉(zhuǎn)為等比數(shù)列,因?yàn)檎{(diào)度策略的絕對(duì)值不重要,,相對(duì)值(比例)才重要,。   

  

  3.調(diào)度周期   

  

  調(diào)度周期 = 調(diào)度粒度 * 就緒和運(yùn)行進(jìn)程的數(shù)量,,對(duì)應(yīng)上面的例子就是所有開蓋玻璃杯數(shù)量(桌子上和水龍頭下的)與調(diào)度粒度的乘積,等于調(diào)度周期(所有杯子都接了一次水),。最小調(diào)度周期等于最小粒度乘以數(shù)量,,如果計(jì)算算出來的時(shí)間片小于最小調(diào)度周期,內(nèi)核就會(huì)讓時(shí)間片直接等于最小調(diào)度周期,。   

  

  4.調(diào)度延遲   

  

  調(diào)度延遲是另一個(gè)概念,,對(duì)應(yīng)上面的例子就是從開口玻璃杯放到到桌子上開始計(jì)算,到送到水龍頭下接水的時(shí)間,。但要注意,,Linux中的調(diào)度延遲卻不這個(gè)意思,,內(nèi)核代碼體現(xiàn)的調(diào)度延遲是最小調(diào)度周期,,也就是調(diào)度周期的最小值,。   

  

  4.性能優(yōu)化   

  

  單個(gè)進(jìn)程的性能優(yōu)化:   

  

  對(duì)于單個(gè)進(jìn)程來說,可以通過下面的系統(tǒng)調(diào)用來改變進(jìn)程(線程)的調(diào)度策略和優(yōu)先級(jí),,只有特權(quán)進(jìn)程才能調(diào)高自己的調(diào)度策略或者優(yōu)先級(jí),。一般不要輕易地把進(jìn)程設(shè)置為實(shí)時(shí)進(jìn)程或者提高其優(yōu)先級(jí),除非有充足的理由,。   

  

  系統(tǒng)響應(yīng)性與吞吐量的優(yōu)化:   

  

  系統(tǒng)的響應(yīng)性和吞吐量是一對(duì)矛盾,,很多時(shí)候我們要根據(jù)具體的情況來對(duì)系統(tǒng)進(jìn)行配置。CONFIG_PREEMPT:是否開啟內(nèi)核搶占,,開啟可增加響應(yīng)性,,不開啟可增加吞吐量。一般服務(wù)器系統(tǒng)不會(huì)開啟,,桌面和移動(dòng)系統(tǒng)會(huì)開啟,。   

  

  定時(shí)器tick頻率HZ:   

  

  定時(shí)器tick的頻率HZ,對(duì)系統(tǒng)的響應(yīng)性和吞吐量也有很大的影響,,HZ取值較大,,系統(tǒng)響應(yīng)性好,但是吞吐量會(huì)降低,,HZ取值較小,,吞吐量會(huì)增大,但是響應(yīng)性會(huì)降低,。   

  

  避免實(shí)時(shí)進(jìn)程過度占用CPU:   

  

  為此內(nèi)核提供了一對(duì)參數(shù),,可以設(shè)置一個(gè)運(yùn)行周期內(nèi),實(shí)時(shí)進(jìn)程最多只能用多少CPU時(shí)間,,這樣就可以給普通進(jìn)程留下一些執(zhí)行時(shí)間,。這兩個(gè)參數(shù)對(duì)應(yīng)的文件是:   

  

  /proc/sys/kernel/sched_rt_period_us/proc/sys/kernel/sched_rt_runtime_us   

  

  可以通過cat和echo來查看和設(shè)置具體的值,單位是微妙默認(rèn)值分別是1000000,,950000,,也就是說在每一秒內(nèi)實(shí)時(shí)進(jìn)程最多運(yùn)行0.95s,,會(huì)給普通進(jìn)程保留0.5s。當(dāng)然如果此時(shí)沒有普通進(jìn)程,,實(shí)時(shí)進(jìn)程還是可以使用100%的CPU時(shí)間的,。如果我們不希望實(shí)時(shí)進(jìn)程使用過多的CPU時(shí)間的話,可以修改這個(gè)值,。   

  

  子進(jìn)程是否優(yōu)先運(yùn)行的問題:   

  

  默認(rèn)情況下父進(jìn)程與剛fork出來的子進(jìn)程,,誰會(huì)先得到執(zhí)行是不確定的。如果在我們的環(huán)境中經(jīng)常會(huì)fork子進(jìn)程,,并且我們總是希望子進(jìn)程比父進(jìn)程先得到執(zhí)行,,那么我們可以將/proc/sys/kernel/sched_child_runs_first值設(shè)為1。   

  

   更多信息可以來這里獲取==>>電子技術(shù)應(yīng)用-AET<<  

  

  微信圖片_20210517164139.jpg  

  

  
  

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,,并不代表本網(wǎng)站贊同其觀點(diǎn),。轉(zhuǎn)載的所有的文章,、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有,。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者,。如涉及作品內(nèi)容、版權(quán)和其它問題,,請(qǐng)及時(shí)通過電子郵件或電話通知我們,,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失,。聯(lián)系電話:010-82306118,;郵箱:[email protected]