999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于主動回收的Linux頁緩存限制方法

2024-02-15 00:00:00王磊張波謝鐵民
無線互聯科技 2024年24期

摘要:Linux操作系統使用頁緩存機制來對塊設備上的文件進行緩存,頁緩存可以無限增大,直到物理內存達到內存水線。在這種情況下,當頁緩存使用過多的時候,內核中一些原子性的內存申請會失敗,導致一些業務執行延時甚至失敗。文章通過對內核中內存管理模塊進行改造,對頁緩存的申請進行控制,使得頁緩存使用有最高限度。如果達到最高限度,新的頁緩存申請會替換掉頁緩存里舊的頁面。

關鍵詞:Linux操作系統;頁緩存;主動回收

中圖分類號:TP31" 文獻標志碼:A

0 引言

Linux內核中有很多種類的內存緩存,用于緩存各種需要頻繁從外設(如塊設備的磁盤等)進行訪問的資源(如文件、inode等),以減少外設的訪問,提高系統響應時間,本文涉及的頁緩存機制就是其中之一[1。

很明顯這些緩存方式都是屬于以空間來換取時間的設計,那么就一定會在邏輯上存在一個問題,就是當空間也在某種場景下成為一種瓶頸的時候,那么該如何平衡空間和時間。

本文從Linux的內存機制尤其是緩存機制的分析開始,指出在何種場景下會出現頁緩存帶來的內存不足的問題,提出一種基于主動回收的頁緩存限制方法來解決此類問題。

1 Linux內核的內存管理

1.1 頁框管理及回收機制

Linux的物理內存按頁來進行管理,每個頁都需要有一個頁描述符,類型為struct page,所有的頁描述符都存放在mem_map數組中。此數組在pg_data節點初始化時由初始內存分配器alloc_bootmem_node接口分配占用空間[2。

在不考慮非一致內存的情況下,整個內存情況被描述成一個內存節點pg_data,這個內存節點被分為3個管理區:DMA區、NORMAL區、HIGHMEM區。每個區管理本區地址范圍內的所有頁面,尤其是空閑頁面,空閑頁面按照伙伴算法進行分配和釋放。每個內存區有3個水平值:pages_high、pages_low、pages_min。用這3個閾值來判定目前空閑頁面的水平,從而決定需要做何動作。內存頁面回收時機如圖1所示。

圖1說明了在申請內存時,空閑內存到達哪個水平時,需要做的動作。當空閑頁面小于page_low時,喚醒回收線程kswapd;當小于page_min時,同步調用回收過程try_to_free_pages;當空閑頁面回到page_low水平時,kswapd線程再度睡眠。

1.2 Linux的磁盤緩存機制

磁盤上的數據需要被用到時,都需要先讀到內存里,這就是磁盤緩存的作用。Linux下的磁盤緩存有:目錄項高速緩存、索引節點inode高速緩存,塊緩存和頁緩存[3。前兩者比較專用且數據量也并不大,因此本節只討論后兩者。

塊設備是指最小存儲訪問粒度為塊的設備。一般最小的IO和存儲單位為塊,比如硬盤扇區,一般為512字節,因此塊設備的緩存也是以塊為單位的,這就是塊緩存,早期的Linux內核和Unix內核都只有塊緩存。

但現代的塊設備一般可以支持直接按頁面(4k)的IO粒度,比如:在塊設備IO請求結構BIO中,是直接可以指定一個頁面的,而且內核下物理內存的管理也是以頁面為粒度[4。這樣,對塊設備的緩存不如以頁為單位。以頁為單位的緩存就是頁緩存。目前,Linux內核主要使用頁緩存機制,但塊緩存機制仍然需要保留,理由如下。

(1)在磁盤空間比較緊張的情況下,碎片也比較多,有些文件可能不能連續存儲在相鄰的塊里,這樣會使得頁緩存粒度太大,必須使用塊緩存,因為塊設備的最小存儲單位是塊。

(2)文件系統的super block超級塊和inode塊,只能按塊來訪問。另外,對于不利用文件系統而直接訪問設備塊的軟件,也要提供接口。

塊緩存雖然比頁小,但由于物理內存以頁為單位管理,因此塊緩存也放在頁里,這種頁叫做緩存區頁;塊緩存因為以塊為單位,因此不需要跟文件關聯,需要跟塊設備關聯,如圖2所示。

一個緩沖區頁的private字段指向頁內塊緩存的頭,本頁所有塊緩存的頭是一個單鏈表,每個塊緩存頭的b_page字段指向緩存區頁,塊緩存頭的b_bdev字段指向塊設備描述符,這樣可以完整地把塊緩存組織起來。

頁緩存和塊緩存所占用物理頁框也都被鏈接入內核active和inactive隊列,以用于內存回收。

磁盤上需要有磁盤文件,系統才能進行文件的存放和讀取。因此,在討論塊設備的緩存時,需要考慮不同文件系統的實現。

嵌入式系統下可執行文件一般直接放入Linux的根文件系統中,Linux的根文件系統用到了如下3種文件系統:Ramfs、Jffs2和Squashfs。Ramfs是基于內存的文件系統,本項目一般使用initrd形式的根文件系統。后兩者則都是基于Flash的文件系統,Linux直接加載Flash上已經被燒結好的Jffs2/Squashfs文件系統分區作為根文件系統。

Ramfs:Ramfs的存儲介質就是內存,所有文件系統的數據都直接存放在頁緩存里面,或者換句話說,頁緩存就是Ramfs的最終存放介質。因此,Ramfs系統只用到了頁緩存。

Squashfs:只讀并且壓縮的文件系統,即存放在Flash上的數據是經過壓縮的,在讀到內存中被系統使用之前要經過解壓縮,同樣被寫進去之前也要經過壓縮。Squashfs把Flash上的未解壓的裸數據先讀到塊緩存中,然后解壓到頁緩存中被系統使用,寫時反之。因此,Squashfs既使用了頁緩存,也使用了塊緩存。

Jffs2:常用于Flash上的日志型文件系統,也可以壓縮,但其解壓和壓縮過程直接使用Kmalloc申請內存進行,不使用塊緩存。因此,Jffs2文件系統只使用了頁緩存。

1.3 頁緩存管理

頁緩存機制是Linux內核對塊設備上存儲文件的一種內存緩存機制,在Linux內核需要讀取塊設備上的文件時,先將文件內容緩存在頁緩存的頁面中,后續再使用該文件時則不需要從塊設備上重新讀取,從而節省時間[5。

圖3列出了一個用戶態進程的2個線性區(分別為代碼段和數據段)共同映射了一個文件的情況。2個線性區數據結構vm_area共同指向一個文件數據結構file,file結構的address_space結構里含有所有本文件已經被讀入內存的頁框數據結構page,只要把vm_area線性區中的線性地址與物理頁框的映射關系加入進程頁表,就可以直接訪問了。其中,文件的數據,即文件的代碼和全局數據,存放在頁緩存的物理頁框中[6。

頁緩存是文件的緩存,需要與某個文件相關,這是依靠一個address_space對象來實現,而且一個文件一般也會有很多頁緩存存在,一個文件所擁有的所有頁緩存是通過一個基數樹來管理的,如圖4所示。

圖4是Linux的頁緩存機制基本原理,Linux內核設計頁緩存可以使用所有剩余物理內存空間,如果內存不足時,依靠回收機制進行回收,一般有2種回收時機。(1)在內存申請的時候,如果空閑內存低于低水線(page_low)時,則喚醒回收線程kswapd進行異步回收。(2)在內存申請的時候,如果空閑內存低于最小水線(page_min)時,申請內存的上下文可以等待的話,則進行同步調用和同步回收。

因此,可以看到,Linux對于頁緩存的設計是非常靈活高效的。但同時它也存在很大的問題,頁緩存可以無限增大,直到物理內存達到內存水線,此時內核中一些原子性的內存申請(因為其不能直接進行內存回收)就會失敗,導致一些業務執行延時甚至失敗。這在一些對可靠性要求較高的網絡通信設備中可能是無法接受的。

2 Linux頁緩存機制的問題

2.1 頁緩存機制帶來的問題

Linux的頁緩存機制可以使用所有剩余物理內存,以提高文件訪問效率,但也會有一些不合適的場景,尤其是在一些嵌入式的Linux環境中。

例如:在一些家庭網關或家用路由器應用中,開啟了UPNP媒體業務的情況下,媒體掃描業務需要讀取磁盤上的大量媒體文件,從而占用大量的頁緩存空間,最終將物理內存占滿。在內存水線配置較低的情況下,內核中的原子性(不能睡眠)內存分配因為內存不足而失敗,如下為內存失敗時的內核日志:

sirq-tasklet/0: page allocation failure. order:0, mode:0x20

Call Trace:[lt;80008aacgt;]…

Mem-info:

DMA per-cpu:

CPU 0: Hot: hi: 0, btch: 1 usd: 0 Cold: hi: 0, btch: 1 usd: 0

Normal per-cpu:

CPU 0: Hot: hi: 0, btch: 1 usd: 0 Cold: hi: 0, btch: 1 usd: 0

Active:1698 inactive:2649 dirty:0 writeback:0 unstable:0

free:33 slab:1417 mapped:233 pagetables:113 bounce:0

DMA free:96kB min:88kB low:720kB high:808kB active:2588kB inactive:4036kB present:16256kB pages_scanned:0 all_unreclaimable? no

lowmem_reserve[]: 0 15

Normal free:36kB min:88kB low:720kB high:808kB active:4204kB inactive:6560kB present:16256kB pages_scanned:0 all_unreclaimable? no

lowmem_reserve[]: 0 0

DMA: 0*4kB 0*8kB 0*16kB 1*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 96kB

Normal: 1*4kB 0*8kB 0*16kB 1*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 36kB

Free swap: 0kB

8192 pages of RAM

0 pages of HIGHMEM

1055 reserved pages

1893 pages shared

0 pages swap cached

如上,出現內存不足時,內存幾乎被耗盡,原因是頁緩存占用內存較多(Active:1698 inactive:2649),內存水線設置也比較接近,回收不及時,導致內核中原子性的(mode:0x20)內存申請失敗。

2.2 傳統規避方法和局限性

要解決上述問題,在原生的Linux系統條件下,有以下2種方法。方法一:內核文件/proc/sys/vm/drop_caches中寫入1,可以觸發內核主動進行page cache的回收;方法二:提高內存水線設置,更加提前觸發內核進行內存回收。方法一可以回收所有不用的頁緩存,但也存在2個問題,(1)回收的時機無法準確確定;(2)釋放全部過期緩存,對性能也有影響。方法二是被動方法,加快回收,但水線設置值很難抉擇,而且影響全局,設置不好也會導致系統忙于回收等效率問題??梢?,以上2種現有辦法都無法完美解決上述問題。

3 基于主動回收的Linux頁緩存限制方法

3.1 頁緩存限制方法和主動回收

如果對頁緩存有主動限制辦法,比如限制頁緩存最多能使用多少內存,問題就比較容易解決了。為此設計如下改造方法,其原理如下:增加一個內核sysfs文件/proc/sys/vm/pagecache_ratio,此文件設置一個百分比,含義為最多頁緩存可以占用物理內存的比率;內存管理系統初始化的時候,根據上述比率計算每個區域能使用的最多頁緩存頁數;增加一種內存頁面申請標志GFP_PAGECACHE,只要是申請頁緩存頁面的動作都標注此標志,但要除去比如ramfs,tmpfs等必須占用頁緩存的內存文件系統申請;在頁面申請操作中,如果是GFP_PAGECACHE類型的申請,判斷頁緩存是否超過預定限制。如果超過,則不能申請到,觸發內存回收;內存回收時,如果發現只是頁緩存超限,則只回收頁緩存頁面,不回收匿名頁面;如上,限制的基本原理就是利用現有的內存回收機制,單獨提前為頁緩存進行控制。

另外,在各使用場景中,需要根據自身情況多加考慮。標注申請頁緩存頁面的動作一般是由各文件系統決定的,因此,需要考量所在系統都使用了哪些文件系統,這些文件系統的頁緩存頁面操作是使用的什么接口,保證在申請時加入GFP_PAGECACHE標志。

3.2 試驗結果分析

修改Linux內核源碼,加入上述的頁緩存限制功能后,在一個小內存(32 M)的家用路由器設備上進行試驗。

(1)對頁緩存限制進行配置。

# cat /proc/sys/vm/pagecache_ratio

32

如上,表示配置頁緩存最多能使用物理內存的32%;

計算后系統內存的數量和頁緩存的限制如下。

pages" present 8128

max pagecache pages: 2600

pagecaches alloc failed: 48

總內存大小為8128頁面,頁緩存最大限制為2600/8128=32%,符合上面的設置。

(2)上電后查看free內存和頁緩存使用內存。

Free內存:

MemFree:" 2860 kB

nr_file_pages 2275

nr_file_ramfs 0

nr_file_tmpfs 0

pagecaches alloc failed: 48

2275個頁面(須減去ramfs和tmpfs的占用數)小于2600的限制,頁緩存申請失敗次數不為0,說明限制生效。

如上,通過對頁緩存的限制,限制了系統緩存的最大峰值,保證了剩余內存的數量,極大地減少了內核中緊急業務原子性申請內存失敗的情況。

在上述家用路由器設備的實際測試過程中,未限制之前,開啟媒體解析和播放服務后,啟動數據業務必然出現原子內存申請失敗告警現象,導致媒體服務無法交付使用。使用頁緩存限制后,同樣開啟媒體服務,啟動內核數據業務,大負荷運行若干天,不再出現原子內存分配失敗告警問題。

4 結語

綜上所述,利用本文提出的頁緩存限制方法后,對空閑內存缺少導致的原子內存申請失敗問題有根本性的改善。根據內存壓力情況和文件讀取效率進行限制比率調整:如果內存壓力較大,可以調低頁緩存限制比率,這樣頁緩存占用內存會降低;如果文件讀取效率降低,但是內存壓力較小,可以調高頁緩存限制比率,這樣頁面替換速度會降低,提高文件讀取命中效率。

在嵌入式設備中,內存資源一般都是有限的。在這種情況下,出現內存壓力時,在顯式的內存裁剪不再奏效時,應該首先考慮對系統緩存進行限制,以可以接受的效率降低來換取更大的空間。

參考文獻

[1]汪敏.Linux中多種內存共享機制及其應用探究[J].無線互聯科技,2023(4):1-4,22.

[2]吳懿.基于ARM的嵌入式Linux的內存優化技術研究與實現[D].南京:南京航空航天大學,2011.

[3]趙興華.開啟Linux新內核特性實現內存管理優化[J].網絡安全和信息化,2024(7):163-165.

[4]楊淵,鄒祖偉.軟硬協同的嵌入式系統存儲可靠性增強設計[J].太赫茲科學與電子信息學報,2024(2):219-226.

[5]俞丁翠,羅龍飛,宋云鵬,等.面向高密度閃存的內存頁大小探索[J].計算機工程與科學,2024(7):1167-1174.

[6]郭鋒,王宏偉,黃保壘,等.嵌入式操作系統中基于MIPS處理器的內存管理機制實現[J].無線互聯科技,2020(11):109-110,118.

(編輯 王永超)

Restriction method of Linux page cache based on active reclaiming

WANG" Lei, ZHANG" Bo, XIE" Tiemin

(Nanjing Branch of Triples (Shenzhen) Communication Technology Co., Ltd., Nanjing 211100, China)

Abstract: The Linux operating system uses a page cache mechanism to cache files on block devices, and the page cache can be infinitely increased until the physical memory reaches the memory watermark. In this case, when the page cache is used excessively, some atomic memory requests in the kernel may fail, resulting in delayed or even failed. The article modifies the memory management module in the kernel to control the use of page cache, so as to maximize the use of page cache. If the maximum limit is reached, the new page cache application will replace the old pages in the page cache.

Key words: Linux operation system; page cache; active reclaiming

主站蜘蛛池模板: 久久精品丝袜| 国产又粗又猛又爽视频| 亚洲国产精品VA在线看黑人| 日韩视频福利| 特级做a爰片毛片免费69| 国产一区二区三区在线观看视频 | 日韩av无码精品专区| 欧美在线视频不卡第一页| 日韩天堂网| 欧美日韩在线亚洲国产人| 狠狠躁天天躁夜夜躁婷婷| 精品国产中文一级毛片在线看 | 在线无码私拍| 五月丁香伊人啪啪手机免费观看| 精品无码一区二区在线观看| 喷潮白浆直流在线播放| 影音先锋丝袜制服| 国产精品无码一区二区桃花视频| 亚洲欧美在线看片AI| 真实国产精品vr专区| 欧美伦理一区| 欧美精品1区2区| a级毛片一区二区免费视频| 欧美一区二区福利视频| 国模私拍一区二区| 亚洲看片网| 久久久国产精品免费视频| 一级成人a毛片免费播放| yjizz视频最新网站在线| 这里只有精品在线播放| 精品国产Ⅴ无码大片在线观看81| 国产亚洲视频免费播放| 2019国产在线| 亚洲成人网在线观看| 欧美成人综合视频| 国产成年无码AⅤ片在线| 2021最新国产精品网站| 美女被操91视频| 色久综合在线| 久久精品丝袜| 99久久无色码中文字幕| 亚洲无码视频图片| 国产精品 欧美激情 在线播放| 91精品人妻一区二区| 中文天堂在线视频| 特级欧美视频aaaaaa| 欧美笫一页| 国外欧美一区另类中文字幕| 黄色网页在线播放| 亚洲天堂网在线视频| 国产日韩欧美中文| 国产毛片高清一级国语 | 欧美色99| 永久天堂网Av| 国产成人精彩在线视频50| 久久精品波多野结衣| 久久综合AV免费观看| 色哟哟国产精品| 亚洲欧美综合另类图片小说区| 小说 亚洲 无码 精品| 日韩午夜伦| 麻豆精品在线| 无码电影在线观看| 久久福利片| 亚洲人成网站日本片| 成人一区在线| 日韩欧美成人高清在线观看| 日韩高清一区 | 国产成人在线无码免费视频| 久久一本日韩精品中文字幕屁孩| 国产成人AV男人的天堂| 国产在线观看高清不卡| 一区二区三区国产精品视频| 97综合久久| 亚州AV秘 一区二区三区| 伊人精品成人久久综合| 国产美女在线免费观看| AV片亚洲国产男人的天堂| 制服无码网站| 国产自无码视频在线观看| 欧美日韩在线国产| 国产夜色视频|