App下載

面試?yán)渲R(shí),Redhat紅帽/CentOS服務(wù)器的Linux內(nèi)核實(shí)時(shí)系統(tǒng)

猿友 2020-08-03 17:24:54 瀏覽數(shù) (5964)
反饋

本文分享了程序員面試關(guān)于 Linux 內(nèi)核實(shí)時(shí)系統(tǒng)的冷知識(shí)。希望能讓大家增長(zhǎng)一點(diǎn)知識(shí)。

背景知識(shí)

Linux的調(diào)度策略包括SCHED_FIFO and SCHED_RR 和SCHED_OTHER

  • SCHED_FIFO(Round-robin線程調(diào)度策略)和SCHED_RR是“實(shí)時(shí)”策略。實(shí)現(xiàn)POSIX標(biāo)準(zhǔn)規(guī)定的固定優(yōu)先級(jí)實(shí)時(shí)調(diào)度(fixed-priority real-time scheduling)。按照這些策略的任務(wù)會(huì)搶占其他所有任務(wù)。因?yàn)槭菗屨?,如果它們不釋放CPU,所以很容易使得某些低級(jí)別的任務(wù)得不到執(zhí)行。

  • SCHED_FIFOSCHED_RR 之間的區(qū)別在于:在相同優(yōu)先級(jí)的任務(wù)中,SCHED_RR 執(zhí)行 round-robin 分配,每個(gè)任務(wù)都得到相同的cpu時(shí)間片策略。而SCHED_FIFO需要任務(wù)主動(dòng)放棄cpu時(shí)間片。

  • SCHED_OTHER是常見(jiàn)的循環(huán)式分時(shí)調(diào)度策略,該調(diào)度策略根據(jù)系統(tǒng)中運(yùn)行的其他任務(wù)為某個(gè)時(shí)間的調(diào)度任務(wù)。

SCHED_RR和SCHED_FIFO的問(wèn)題:

紅帽企業(yè)版Linux實(shí)時(shí)版中的兩種實(shí)時(shí)調(diào)度策略具有一個(gè)主要特征:直到被更高優(yōu)先級(jí)的線程搶占或直到它們“等待”(sleep/休眠或執(zhí)行I/O)線程會(huì)一直運(yùn)行。如果是SCHED_RR,在SCHED_RR優(yōu)先級(jí)相同的線程中,操作系統(tǒng)可能會(huì)搶占一個(gè)線程,讓另一個(gè)線程得以執(zhí)行。

POSIX規(guī)范沒(méi)有規(guī)定允許低優(yōu)先級(jí)線程獲得任何CPU時(shí)間的策略。

實(shí)時(shí)線程的這種特性意味著編寫一個(gè)霸占100%的CPU的應(yīng)用程序非常容易。乍一看,好像榨干了服務(wù)器是個(gè)不錯(cuò)的想法,但實(shí)際上,它引起了操作系統(tǒng)的許多問(wèn)題。操作系統(tǒng)負(fù)責(zé)管理系統(tǒng)范圍的資源和按CPU的資源,并且必須定期檢查描述這些資源的數(shù)據(jù)結(jié)構(gòu),并對(duì)其執(zhí)行內(nèi)部管理活動(dòng)。如果內(nèi)核被SCHED_FIFO線程壟斷,則它無(wú)法執(zhí)行內(nèi)務(wù)處理任務(wù),最終整個(gè)系統(tǒng)將變得不穩(wěn)定,從而可能導(dǎo)致崩潰。

中斷處理程序以具有SCHED_FIFO優(yōu)先級(jí)的線程(默認(rèn)值:50)運(yùn)行。具有或策略高于中斷處理程序線程的cpuxiao hao x線程可能會(huì)阻止中斷處理程序運(yùn)行,并導(dǎo)致程序等待那些由中斷發(fā)出的數(shù)據(jù),從而使該程序餓死并失敗。

紅帽/CentOS的特殊策略/實(shí)時(shí)節(jié)流機(jī)制

在紅帽企業(yè)版實(shí)時(shí)系統(tǒng)內(nèi)核中,有個(gè)實(shí)時(shí)節(jié)流機(jī)制/SCHED_FIFOSCHED_RR限制實(shí)時(shí)調(diào)度的調(diào)度策略(real-time scheduler throttling)。

紅帽企業(yè)版實(shí)時(shí)Linux內(nèi)核帶有一種保護(hù)機(jī)制,該機(jī)制使系統(tǒng)管理員可以分配資源配額以供實(shí)時(shí)任務(wù)使用。這個(gè)配額機(jī)制引入,算是一個(gè)保護(hù)機(jī)制。

這個(gè)機(jī)制用/proc文件系統(tǒng)中的兩個(gè)參數(shù)控制。

/proc/sys/kernel/sched_rt_period_us定義時(shí)間周期,以微秒為單位,相當(dāng)于100%的CPU資源帶寬。默認(rèn)值為1,000,000μs(1秒)。謹(jǐn)慎更改該時(shí)間段,時(shí)間段過(guò)長(zhǎng)或太小都將危險(xiǎn)。

/proc/sys/kernel/sched_rt_runtime_us定義所有實(shí)時(shí)任務(wù)可用的總帶寬。默認(rèn)值為950,000μs(0.95 s),即CPU帶寬的95%。將該值設(shè)置為-1意味著實(shí)時(shí)任務(wù)最多可能占用100%的CPU時(shí)間。僅當(dāng)在特殊場(chǎng)景實(shí)時(shí)任務(wù)經(jīng)過(guò)精心設(shè)計(jì)并且沒(méi)有明顯的隱患(比如沒(méi)有無(wú)限制的輪詢循環(huán))時(shí),才可以這樣配置。

對(duì)于實(shí)時(shí)調(diào)節(jié)機(jī)制的默認(rèn)值定義的CPU時(shí)間的95%,意思是95%的cpu時(shí)間片可以通過(guò)實(shí)時(shí)任務(wù)中使用。剩余的5%將用于非實(shí)時(shí)任務(wù)(在SCHED_OTHER類似的調(diào)度策略下運(yùn)行的任務(wù))。而且需要注意,如果單個(gè)實(shí)時(shí)任務(wù)占用了95%的CPU時(shí)隙,則該CPU上剩余的實(shí)時(shí)任務(wù)將不會(huì)運(yùn)行。剩下的5%的CPU時(shí)間僅由非實(shí)時(shí)任務(wù)使用。

默認(rèn)值的設(shè)置帶來(lái)兩個(gè)好處:流氓實(shí)時(shí)任務(wù)不會(huì)通過(guò)不允許非實(shí)時(shí)任務(wù)運(yùn)行來(lái)鎖定系統(tǒng),另一方面,實(shí)時(shí)任務(wù)最多具有95%的CPU他們的可用時(shí)間,可能會(huì)最大化效能。

聰明做法RT_RUNTIME_GREED

盡管SCHED_FIFOSCHED_RR/實(shí)時(shí)節(jié)流機(jī)制的工作原理是避免實(shí)時(shí)任務(wù)可能導(dǎo)致系統(tǒng)掛起,但是高級(jí)用戶可能希望在沒(méi)有非實(shí)時(shí)任務(wù)匱乏的情況下允許實(shí)時(shí)任務(wù)繼續(xù)運(yùn)行, 避免系統(tǒng)閑置。

啟用后,此功能會(huì)在限制實(shí)時(shí)任務(wù)之前檢查非實(shí)時(shí)任務(wù)是否餓死。如果實(shí)時(shí)任務(wù)被限制,則在系統(tǒng)空閑時(shí)或下一個(gè)周期開(kāi)始時(shí)(以先到者為準(zhǔn)),它將立即取消限制。

RT_RUNTIME_GREED通過(guò)以下命令 啟用:

#echo RT_RUNTIME_GREED> /sys/kernel/debug/sched_features

要使所有CPU核都具有相同的rt_runtime,請(qǐng)禁用NO_RT_RUNTIME_SHARE邏輯:

#echo NO_RT_RUNTIME_SHARE> /sys/kernel/debug/sched_features

設(shè)置了這兩個(gè)選項(xiàng)后,用戶將保證所有CPU上的非RT任務(wù)都有一定的運(yùn)行時(shí)間,同時(shí)使實(shí)時(shí)任務(wù)盡可能多地運(yùn)行。

希望這個(gè)冷知識(shí)對(duì)大家有所幫助,對(duì)Linux感興趣的同學(xué)可以看一下教程:

Linux教程:http://m.hgci.cn/linux/

Linux微課:http://m.hgci.cn/minicourse/play/linuxcourse

Linux就該這么學(xué):http://m.hgci.cn/linuxprobe/

0 人點(diǎn)贊