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