溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

linux中swappiness參數(shù)有什么用

發(fā)布時(shí)間:2022-02-18 14:05:20 來源:億速云 閱讀:163 作者:小新 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)linux中swappiness參數(shù)有什么用,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

swappiness是Linux的一個(gè)內(nèi)核參數(shù),控制系統(tǒng)在進(jìn)行swap時(shí),內(nèi)存使用的相對(duì)權(quán)重。swappiness參數(shù)值可設(shè)置范圍在0到100之間。 此參數(shù)值越低,就會(huì)讓Linux系統(tǒng)盡量少用swap分區(qū),多用內(nèi)存;參數(shù)值越高就是反過來,使內(nèi)核更多的去使用swap空間。

linux中swappiness參數(shù)有什么用

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

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

fast path大體流程如下:1.如果系統(tǒng)掛載使用了memory cgroup,則首先檢查是否超過cgroup限額,如果超過則進(jìn)行direct reclaim,通過do_try_to_free_pages完成。如果沒超過則進(jìn)行cgroup的charge工作(charge是通過兩階段提交完成的,這里不展開了)。2.從本地prefered zone內(nèi)存節(jié)點(diǎn)查找空閑頁,需要判斷是否滿足系統(tǒng)watermark及dirty ratio的要求,如果滿足則從buddy system上摘取相應(yīng)page,否則嘗試對(duì)本地prefered zone進(jìn)行頁回收,本次fast path下頁回收只會(huì)回收clean page,即不會(huì)考慮dirty page以及mapped page,這樣就不會(huì)產(chǎn)生任何swap及writeback,即不會(huì)引起任何blocking的IO操作,如果這次回收仍然無法滿足請(qǐng)求的內(nèi)存頁數(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)行再次重試,這一步中如果分配頁時(shí)有指定GFP_NOFAIL標(biāo)記,則分配失敗會(huì)一直等待重試。\3. 如果沒有GFP_NOFAIL標(biāo)記,則會(huì)需開始進(jìn)行page compact及page direct reclaim操作,之后如果仍然沒有可用內(nèi)存,則進(jìn)入OOM流程。

相關(guān)內(nèi)容可以參閱內(nèi)核代碼__alloc_pages函數(shù)的邏輯,另外無論page reclaim是由誰發(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)于頁回收的一些背景知識(shí)

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

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

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

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

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

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

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

?

if (!sc->may_swap || (get_nr_swap_pages()

\2. 如果當(dāng)前進(jìn)行的不是全局頁回收(cgroup資源限額引起的頁回收),并且swappiness設(shè)為0,則不進(jìn)行匿名頁鏈表掃描,這個(gè)是沒得商量,這里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. 如果是全局頁回收,并且當(dāng)前空閑內(nèi)存和所有file based鏈表page數(shù)目的加和都小于系統(tǒng)的high watermark,則必須進(jìn)行匿名頁回收,則必然會(huì)發(fā)生swap,可以看到這里swappiness的值如何設(shè)置是完全無關(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

\5. 如果系統(tǒng)inactive file鏈表比較充足,則不考慮進(jìn)行匿名頁的回收,即不進(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à)值來綜合決定file和anon鏈表掃描的比例,這時(shí)如果swappiness設(shè)置成0,則也不會(huì)掃描anon鏈表,即不進(jìn)行swap,代碼比較多,不再貼出。

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

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

實(shí)際這個(gè)值的計(jì)算是通過sysctl里的vm.min_free_kbytes來決定的,大體的計(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管理頁面的比例算出zone的min_watermark,然后再加min的1/4就是low,加1/2就是high了

關(guān)于“l(fā)inux中swappiness參數(shù)有什么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI