www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]本文主要嘗試解釋兩個(gè)問(wèn)題:1. swappiness的確切含義是什么,它對(duì)內(nèi)核進(jìn)行頁(yè)回收機(jī)制的影響。2. swappiness設(shè)置成0,為什么系統(tǒng)仍然可能會(huì)有swap發(fā)生。

本文主要嘗試解釋兩個(gè)問(wèn)題:

1. swappiness的確切含義是什么,它對(duì)內(nèi)核進(jìn)行頁(yè)回收機(jī)制的影響。

2. swappiness設(shè)置成0,為什么系統(tǒng)仍然可能會(huì)有swap發(fā)生。

一. 關(guān)于內(nèi)存分配與頁(yè)回收(page reclaim)

page reclaim發(fā)生的場(chǎng)景主要有兩類(lèi),一個(gè)是kswapd后臺(tái)線程進(jìn)行的活動(dòng),另一個(gè)是direct reclaim,即分配頁(yè)時(shí)沒(méi)有空閑內(nèi)存滿(mǎn)足,需要立即直接進(jìn)行的頁(yè)回收。大體上內(nèi)存分配的流程會(huì)分為兩部分,一部分是fast path,另一部分是slow path,通常內(nèi)存使用非緊張情況下,都會(huì)在fast path就可以滿(mǎn)足要求。并且fast path下的內(nèi)存分配不會(huì)出現(xiàn)dirty writeback及swap等頁(yè)回收引起的IO阻塞情況。

fast path大體流程如下:

1.如果系統(tǒng)掛載使用了memory cgroup,則首先檢查是否超過(guò)cgroup限額,如果超過(guò)則進(jìn)行direct reclaim,通過(guò)do_try_to_free_pages完成。如果沒(méi)超過(guò)則進(jìn)行cgroup的charge工作(charge是通過(guò)兩階段提交完成的,這里不展開(kāi)了)。

2.從本地prefered zone內(nèi)存節(jié)點(diǎn)查找空閑頁(yè),需要判斷是否滿(mǎn)足系統(tǒng)watermark及dirty ratio的要求,如果滿(mǎn)足則從buddy system上摘取相應(yīng)page,否則嘗試對(duì)本地prefered zone進(jìn)行頁(yè)回收,本次fast path下頁(yè)回收只會(huì)回收clean page,即不會(huì)考慮dirty page以及mapped page,這樣就不會(huì)產(chǎn)生任何swap及writeback,即不會(huì)引起任何blocking的IO操作,如果這次回收仍然無(wú)法滿(mǎn)足請(qǐng)求的內(nèi)存頁(yè)數(shù)目則進(jìn)入slow path

slow path大體流程如下:

1. 首先喚醒kswapd進(jìn)行page reclaim后臺(tái)操作。

2. 重新嘗試本地prefered zone進(jìn)行分配內(nèi)存,如果失敗會(huì)根據(jù)請(qǐng)求的GFP相關(guān)參數(shù)決定是否嘗試忽略watermark, dirty ratio以及本地節(jié)點(diǎn)分配等要求進(jìn)行再次重試,這一步中如果分配頁(yè)時(shí)有指定__GFP_NOFAIL標(biāo)記,則分配失敗會(huì)一直等待重試。

3. 如果沒(méi)有__GFP_NOFAIL標(biāo)記,則會(huì)需開(kāi)始進(jìn)行page compact及page direct reclaim操作,之后如果仍然沒(méi)有可用內(nèi)存,則進(jìn)入OOM流程。

相關(guān)內(nèi)容可以參閱內(nèi)核代碼__alloc_pages函數(shù)的邏輯,另外無(wú)論page reclaim是由誰(shuí)發(fā)起的,最終都會(huì)統(tǒng)一入口到shrink_zone,即針對(duì)每個(gè)zone獨(dú)立進(jìn)行reclaim操作,最終會(huì)進(jìn)入shrink_lruvec函數(shù),進(jìn)行每個(gè)zone相應(yīng)page lru鏈表的掃描與回收操作。

二. 關(guān)于頁(yè)回收的一些背景知識(shí)

頁(yè)回收大體流程會(huì)先在每個(gè)zone上掃描相應(yīng)的page鏈表,主要包括inactive anon/active anon(匿名頁(yè)鏈表)以及inactive file/active file鏈表(file cache/映射頁(yè)鏈表),一共四條鏈表,我們所有使用過(guò)的page在被回收前基本是保存在這四條鏈表中的某一條中的(還有一部分在unevictable鏈表中,忽略),根據(jù)其被引用的次數(shù)會(huì)決定其處于active還是inactive鏈表中,根據(jù)其類(lèi)型決定處于anon還是file鏈表中。

頁(yè)回收總體會(huì)掃描逐個(gè)內(nèi)存節(jié)點(diǎn)的所有zone,然后先掃描active,將不頻繁訪問(wèn)的頁(yè)挪到inactive鏈表中,隨后掃描inactive鏈表,會(huì)將其中被頻繁引用的頁(yè)重新挪回到active中,確認(rèn)不頻繁的頁(yè)則最終被回收,如果是file based的頁(yè)則根據(jù)是否clean進(jìn)行釋放或回寫(xiě)(writeback,filecache則直接釋放),如果是anon則進(jìn)行swap,所以本文實(shí)際關(guān)心的是swappiness參數(shù)對(duì)anon鏈表掃描的影響。

另外還需要了解前面描述的四個(gè)鏈表原來(lái)是放在zone數(shù)據(jù)結(jié)構(gòu)上的,后來(lái)引入了mem_cgroup則,重新定義了一組mem_cgroup_per_zone/mem_cgroup_per_node的數(shù)據(jù)結(jié)構(gòu),這四個(gè)鏈表同時(shí)定義在這組數(shù)據(jù)結(jié)構(gòu)上,如果系統(tǒng)開(kāi)啟了mem cgroup則使用后者,否則用前者。

另外再重點(diǎn)說(shuō)下swap只是page reclaim的一種處理措施,主要針對(duì)anon page,我們最終來(lái)看下swappiness的確切含義

三. swappiness對(duì)page reclaim的確切影響

page reclaim邏輯中對(duì)前面所述四個(gè)鏈表進(jìn)行掃描的邏輯在vmscan.c中的get_scan_count函數(shù)內(nèi),該函數(shù)大部分邏輯注釋寫(xiě)得非常清楚,我們簡(jiǎn)單梳理下,主要關(guān)注scan_balance變量的取值:

1. 首先如果系統(tǒng)禁用了swap或者沒(méi)有swap空間,則只掃描file based的鏈表,即不進(jìn)行匿名頁(yè)鏈表掃描

代碼如下:

if (!sc->may_swap || (get_nr_swap_pages() <= 0)) {

scan_balance = SCAN_FILE;

goto out;

}

2. 如果當(dāng)前進(jìn)行的不是全局頁(yè)回收(cgroup資源限額引起的頁(yè)回收),并且swappiness設(shè)為0,則不進(jìn)行匿名頁(yè)鏈表掃描,這個(gè)是沒(méi)得商量,這里swappiness值直接決定了是否有swap發(fā)生,設(shè)成0則肯定不會(huì)發(fā)生,另外需要注意,這種情況下需要設(shè)置的是cgroup配置文件memory.swappiness,而不是全局的sysctl vm.swappiness

代碼如下:

if (!global_reclaim(sc) && !vmscan_swappiness(sc)) {

scan_balance = SCAN_FILE;

goto out;

}

3. 如果進(jìn)行鏈表掃描前設(shè)置的priority(這個(gè)值決定掃描多少分之一的鏈表元素)為0,且swappiness非0,則可能會(huì)進(jìn)行swap

代碼如下:

if (!sc->priority && vmscan_swappiness(sc)) {

scan_balance = SCAN_EQUAL;

goto out;

}

4. 如果是全局頁(yè)回收,并且當(dāng)前空閑內(nèi)存和所有file based鏈表page數(shù)目的加和都小于系統(tǒng)的high watermark,則必須進(jìn)行匿名頁(yè)回收,則必然會(huì)發(fā)生swap,可以看到這里swappiness的值如何設(shè)置是完全無(wú)關(guān)的,這也解釋了為什么其為0,系統(tǒng)也會(huì)進(jìn)行swap的原因,另外最后我們會(huì)詳細(xì)解釋系統(tǒng)page watermark是如何計(jì)算的。

代碼如下:

anon = get_lru_size(lruvec, LRU_ACTIVE_ANON) +

get_lru_size(lruvec, LRU_INACTIVE_ANON);

file = get_lru_size(lruvec, LRU_ACTIVE_FILE) +

get_lru_size(lruvec, LRU_INACTIVE_FILE);

if (global_reclaim(sc)) {

free = zone_page_state(zone, NR_FREE_PAGES);

if (unlikely(file + free <= high_wmark_pages(zone))) {

scan_balance = SCAN_ANON;

goto out;

}

}

5. 如果系統(tǒng)inactive file鏈表比較充足,則不考慮進(jìn)行匿名頁(yè)的回收,即不進(jìn)行swap

代碼如下:

if (!inactive_file_is_low(lruvec)) {

scan_balance = SCAN_FILE;

goto out;

}

6. 最后一種情況則要根據(jù)swappiness值與之前統(tǒng)計(jì)的file與anon哪個(gè)更有價(jià)值來(lái)綜合決定file和anon鏈表掃描的比例,這時(shí)如果swappiness設(shè)置成0,則也不會(huì)掃描anon鏈表,即不進(jìn)行swap,代碼比較多,不再貼出。

四. 系統(tǒng)內(nèi)存watermark的計(jì)算

前面看到系統(tǒng)內(nèi)存watermark對(duì)頁(yè)回收機(jī)制是有決定影響的,其實(shí)在內(nèi)存分配中也會(huì)頻繁用到這個(gè)值,確切的說(shuō)它有三個(gè)值,分別是low,min和high,根據(jù)分配頁(yè)時(shí)來(lái)指定用哪個(gè),如果系統(tǒng)空閑內(nèi)存低于相應(yīng)watermark則分配會(huì)失敗,這也是進(jìn)入slow path或者wakeup kswapd的依據(jù)。

實(shí)際這個(gè)值的計(jì)算是通過(guò)sysctl里的vm.min_free_kbytes來(lái)決定的,大體的計(jì)算公式如下:

pages_min = min_free_kbytes >> (PAGE_SHIFT – 10);

tmp = (u64)pages_min * zone->managed_pages;

do_div(tmp, lowmem_pages);

zone->watermark[WMARK_MIN] = tmp;

zone->watermark[WMARK_LOW] = min_wmark_pages(zone) + (tmp >> 2);

zone->watermark[WMARK_HIGH] = min_wmark_pages(zone) + (tmp >> 1);

即根據(jù)min_free_kbytes的值按照每個(gè)zone管理頁(yè)面的比例算出zone的min_watermark,然后再加min的1/4就是low,加1/2就是high了

總結(jié):

swappiness的值是個(gè)參考值,是否會(huì)發(fā)生swap跟當(dāng)前是哪種page reclaim及系統(tǒng)當(dāng)前狀態(tài)都有關(guān)系,所以設(shè)置了swappiness=0并不代表一定沒(méi)有swap發(fā)生,同時(shí)設(shè)為0也確實(shí)會(huì)可能發(fā)生OOM。

個(gè)人仍然認(rèn)為線上環(huán)境設(shè)置swappiness=0是沒(méi)有任何問(wèn)題的。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶(hù)體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉