更新時間:2020-12-17 17:55:36 來源:動力節(jié)點 瀏覽3895次
在當前已經(jīng)是多核心SMP時代,作為多用戶,多任務的Linux操作系統(tǒng)仍然通過分時復用的方式,即給一個個任務分配不同的時間片從而實現(xiàn)用戶感知上的多任務。而各種中斷則擁有最高的響應權限,可以直接導致線程的切換。這時候就需要用到Linux內(nèi)核的tick機制來調(diào)節(jié)這一現(xiàn)象。
我們要知道低時延和大吞吐量有的時候是沖突的。解決低時延,系統(tǒng)需要多個不斷切換的線程接收用戶端的數(shù)據(jù)——想象一下加特林機槍的射速是通過多槍管輪流發(fā)射達到低時延的目的;而大吞吐量往往需要一個不受干擾的持續(xù)運行狀態(tài)——就如一條生產(chǎn)線,每一次更換產(chǎn)品都會帶來一系列的時間損失。
傳統(tǒng)上非實時搶占內(nèi)核Linux采用了一個相對固定的時間周期為不同的進程、線程切換CPU時間。在運行的過程中,如果kernel需要獲得控制權——主要是完成一些CPU重新調(diào)度以及定時器觸發(fā)之類的任務,則需要通過timer tick方式以一個固定的周期觸發(fā)。這個過程其實對于該CPU上正在運行的任務來說是非常不友好的。考慮到在大多數(shù)的機器上任務的數(shù)量遠遠多于CPU核心的數(shù)量,一次強行的中斷將直接導致出現(xiàn)流水線清空的問題。可見這個時間的設定對整個系統(tǒng)的時延/吞吐量非常關鍵。在不斷的均衡 latency和throughput的幾次修改之后,社區(qū)總算決定修改這一部分的設定。
然后就有了tickless idle(dyntick)模式,Ubuntu desktop版本默認就是選擇了這個模式。個人覺得這個模式完全是為了筆記本電腦這類的能耗敏感設備設計的。CPU在啟用了能耗管理功能之后會對空閑的CPU降頻節(jié)能,而這個過程并不一定能在1ms內(nèi)結(jié)束。如果這個空閑的CPU在此時接受了每1ms就會發(fā)送的time ticket之后,立馬又被喚醒,往復這個過程之后,系統(tǒng)無法進入節(jié)能模式。一句話解釋tickless idle模式:不向沒有任務的CPU發(fā)送定時器中斷。
另外一個就是tickless模式,這個才是重點,Centos 操作系統(tǒng)默認就是啟用了這個模式。這是一個完全針對吞吐量優(yōu)化的模式。同樣一句話的解釋:在多CPU系統(tǒng)上,如果當前的CPU沒有任務或者只有一個任務的前提下,系統(tǒng)將不向該CPU發(fā)送timer tick。
在當前的Linux內(nèi)核配置中general setup -> timer subsystem配置中可以實現(xiàn)對上述3個模式進行切換,編譯安裝內(nèi)核之后生效。從timer ticker的發(fā)送策略上講,如果要完全體現(xiàn)tickless的優(yōu)勢,CPU必須滿足如下嚴苛條件:
1.該CPU上只有一個任務。
2.這個唯一的任務不需要系統(tǒng)調(diào)用,即始終保持在用戶態(tài)。
3.長時間不間斷地任務,并保持內(nèi)核不會再這個過程中重新調(diào)度此CPU。
滿足這個配置的簡單方式就不得不提到一個內(nèi)核啟動入?yún)ⅲ篿solcpus=<CPUs>。這個入?yún)⒌男Ч歉綦x部分CPU不參與內(nèi)核調(diào)度。用戶必須通過taskset/cgroup的方式實現(xiàn)用戶調(diào)度。而且如果涉及多任務,同樣需要用戶調(diào)度。這也是Linux內(nèi)核的tick機制的關鍵所在。
Linux內(nèi)核的tick機制可謂神秘莫測,然而令你意想不到的是,Linux的奧妙遠不止如此,在本站的Linux教程中還有Linux系統(tǒng)中各種各樣的機制的詳細介紹和原理分析,這些機制共同構建了Linux的內(nèi)核體系結(jié)構,為Linux的各種功能的實現(xiàn)發(fā)揮著獨特的作用。
0基礎 0學費 15天面授
有基礎 直達就業(yè)
業(yè)余時間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習