日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

linux內(nèi)核主流的內(nèi)存壓縮技術介紹

454398 ? 來源:蝸窩科技 ? 作者:OPPO內(nèi)核團隊 ? 2020-09-18 15:40 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1.技術背景

說到壓縮這個詞,我們并不陌生,應該都能想到是降低占用空間,使同樣的空間可以存放更多的東西,類似于我們平時常用的文件壓縮,內(nèi)存壓縮同樣也是為了節(jié)省內(nèi)存。

盡管當前android手機6GB,8GB甚至12GB的機器都較為常見了,但內(nèi)存無論多大,總是會有不夠用的時候。當系統(tǒng)內(nèi)存緊張的時候,會將文件頁丟棄或回寫回磁盤(如果是臟頁),還可能會觸發(fā)LMK殺進程進行內(nèi)存回收。這些被回收的內(nèi)存如果再次使用都需要重新從磁盤讀取,而這個過程涉及到較多的IO操作。就目前的技術而言,IO的速度遠遠慢于這RAM操作速度。因此,如果頻繁地做IO操作,不僅影響flash使用壽命,還嚴重影響系統(tǒng)性能。內(nèi)存壓縮是一種讓IO過程平滑過渡的做法, 即盡量減少由于內(nèi)存緊張導致的IO,提升性能。

2.主流內(nèi)存壓縮技術

目前linux內(nèi)核主流的內(nèi)存壓縮技術主要有3種:zSwap, zRAM, zCache。

2.1zSwap

zSwap是在memory與flash之間的一層“cache”,當內(nèi)存需要swap出去磁盤的時候,先通過壓縮放到zSwap中去,zSwap空間按需增長。達到一定程度后則會按照LRU的順序(前提是使用的內(nèi)存分配方法需要支持LRU)將就最舊的page解壓寫入磁盤swap device,之后將當前的page壓縮寫入zSwap。

zswap本身存在一些缺陷或問題:

1) 如果開啟當zswap滿交換出backing store的功能, 由于需要將zswap里的內(nèi)存按LRU順序解壓再swap out, 這就要求內(nèi)存分配器支持LRU功能。

2) 如果不開啟當zswap滿交換出backing store的功能, 和zRam是類似的。

2.2zRram

zRram即壓縮的內(nèi)存, 使用內(nèi)存模擬block device的做法。實際不會寫到塊設備中去,只會壓縮后寫到模擬的塊設備中,其實也就是還是在RAM中,只是通過壓縮了。由于壓縮和解壓縮的速度遠比讀寫IO好,因此在移動終端設備廣泛被應用。zRam是基于RAM的block device, 一般swap priority會比較高。只有當其滿,系統(tǒng)才會考慮其他的swap devices。當然這個優(yōu)先級用戶可以配置。

zRram本身存在一些缺陷或問題:

1) zRam大小是可靈活配置的, 那是不是配置越大越好呢? 如果不是,配置多大是最合適的呢?

2) 使用zRam可能會在低內(nèi)存場景由于頻繁的內(nèi)存壓縮導致kswapd進程占CPU高, 怎樣改善?

3) 增大了zRam配置,對系統(tǒng)內(nèi)存碎片是否有影響?

要利用好zRam功能, 并不是簡單地配置了就OK了, 還需要對各種場景和問題都做好處理, 才能發(fā)揮最優(yōu)的效果。

2.3zCache

zCache是oracle提出的一種實現(xiàn)文件頁壓縮技術,也是memory與block dev之間的一層“cache”,與zswap比較接近,但zcache目前壓縮的是文件頁,而zSwap和zRAM壓縮是匿名頁。

zcache本身存在一些缺陷或問題:

1) 有些文件頁可能本身是壓縮的內(nèi)容, 這時可能無法再進行壓縮了

2) zCache目前無法使用zsmalloc, 如果使用zbud,壓縮率較低

3) 使用的zbud/z3fold分配的內(nèi)存是不可移動的, 需要關注內(nèi)存碎片問題

3.內(nèi)存壓縮主流的內(nèi)存分配器

3.2.1Zsmalloc

zsmalloc是為ZRAM設計的一種內(nèi)存分配器。內(nèi)核已經(jīng)有slub了, 為什么還需要zsmalloc內(nèi)存分配器?這是由內(nèi)存壓縮的場景和特點決定的。zsmalloc內(nèi)存分配器期望在低內(nèi)存的場景也能很好地工作,事實上,當需要壓縮內(nèi)存進行zsmalloc內(nèi)存分配時,內(nèi)存一般都比較緊張且內(nèi)存碎片都比較嚴重了。如果使用slub分配, 很可能由于高階內(nèi)存分配不到而失敗。另外,slub也可能導致內(nèi)存碎片浪費比較嚴重,最壞情況下,當對象大小略大于PAGE_SIZE/2時,每個內(nèi)存頁接近一般的內(nèi)存將被浪費。

Android手機實測發(fā)現(xiàn),anon pages的平均壓縮比大約在1:3左右,所以compressed anon page size很多在1.2K左右。如果是Slub,為了分配大量1.2K的內(nèi)存,可能內(nèi)存浪費嚴重。zsmalloc分配器嘗試將多個相同大小的對象存放在組合頁(稱為zspage)中,這個組合頁不要求物理連續(xù),從而提高內(nèi)存的使用率。

需要注意的是, 當前zsmalloc不支持LRU功能, 舊版本內(nèi)核分配的不可移動的頁, 對內(nèi)存碎片影響嚴重, 但最新版本內(nèi)核已經(jīng)是支持分配可移動類型內(nèi)存了。

3.2.2 Zbud

zbud是一個專門為存儲壓縮page而設計的內(nèi)存分配器。用于將2個objects存到1個單獨的page中。zbud是可以支持LRU的, 但分配的內(nèi)存是不可移動的。

3.2.3 Z3fold

z3fold是一個較新的內(nèi)存分配器, 與zbud不同的是, 將3個objects存到1個單獨的page中,也就是zbud內(nèi)存利用率極限是1:2, z3fold極限是1:3。同樣z3fold是可以支持LRU的, 但分配的內(nèi)存是不可移動的。

4.內(nèi)存壓縮技術與內(nèi)存分配器組合對比分析

結(jié)合上面zSwap / zRam /zCache的介紹, 與zsmalloc/zbud/z3fold分別怎樣組合最合適呢?

下面總結(jié)了一下, 具體原因可以看上面介紹的時候各類型的特點。

5.zRAM技術原理

本文重點介紹zRam內(nèi)存壓縮技術,它是目前移動終端廣泛使用的內(nèi)存壓縮技術。

5.1軟件框架

下圖展示了內(nèi)存管理大體的框架, 內(nèi)存壓縮技術處于內(nèi)存回收memory reclaim部分中。

linux內(nèi)核主流的內(nèi)存壓縮技術介紹

再具體到zRam, 它的軟件架構(gòu)可以分為3部分, 分別是數(shù)據(jù)流操作,內(nèi)存壓縮算法 ,zram驅(qū)動。

數(shù)據(jù)流操作:提供串行或者并行的壓縮和解壓操作。

內(nèi)存壓縮算法:每種壓縮算法提供壓縮和解壓縮的具體實現(xiàn)回調(diào)接口供數(shù)據(jù)操作調(diào)用。

Zram驅(qū)動:創(chuàng)建一個基于ram的塊設備, 并提供IO請求處理接口。

5.2實現(xiàn)原理

Zram內(nèi)存壓縮技術本質(zhì)上就是以時間換空間。通過CPU壓縮、解壓縮的開銷換取更大的可用內(nèi)存空間。

我們主要描述清楚下面這2個問題:

1) 什么時候會進行內(nèi)存壓縮?

2) 進行內(nèi)存壓縮/解壓縮的流程是怎樣的?

進行內(nèi)存壓縮的時機:

1) Kswapd場景:kswapd是內(nèi)核內(nèi)存回收線程, 當內(nèi)存watermark低于low水線時會被喚醒工作, 其到內(nèi)存watermark不小于high水線。

2) Direct reclaim場景:內(nèi)存分配過程進入slowpath, 進行直接行內(nèi)存回收。

下面是基于4.4內(nèi)核理出的內(nèi)存壓縮、解壓縮流程。

內(nèi)存回收過程路徑進行內(nèi)存壓縮。會將非活躍鏈表的頁進行shrink, 如果是匿名頁會進行pageout, 由此進行內(nèi)存壓縮存放到ZRAM中, 調(diào)用路徑如下:

在匿名頁換出到swap設備后, 訪問頁時, 產(chǎn)生頁訪問錯誤, 當發(fā)現(xiàn)“頁表項不為空, 但頁不在內(nèi)存中”, 該頁就是已換到swap區(qū)中,由此會開始將該頁從swap區(qū)中重新讀取, 如果是ZRAM, 則是解壓縮的過程。調(diào)用路徑如下:

5.3內(nèi)存壓縮算法

目前比較主流的內(nèi)存算法主要為LZ0, LZ4, ZSTD等。下面截取了幾種算法在x86機器上的表現(xiàn)。各算法有各自特點, 有以壓縮率高的, 有壓縮/解壓快的等, 具體要結(jié)合需求場景選擇使用。

6.zRAM技術應用

本節(jié)描述一下在使用ZRAM常遇到的一些使用或配置,調(diào)試的方法。

6.1如何配置開啟zRAM

1)配置內(nèi)存壓縮算法

下面例子配置壓縮算法為lz4

echo lz4 > /sys/block/zram0/comp_algorithm

2)配置ZRAM大小

下面例子配置zram大小為2GB

echo 2147483648 > /sys/block/zram0/disksize

3)使能zram

mkswap /dev/zram0

swapon /dev/zram0

6.2swappiness含義簡述

swappiness參數(shù)是內(nèi)核傾向于回收匿名頁到swap(使用的ZRAM就是swap設備)的積極程度, 原生內(nèi)核范圍是0~100, 參數(shù)值越大, 表示回收匿名頁到swap的比例就越大。如果配置為0, 表示僅回收文件頁,不回收匿名頁。默認值為60??梢酝ㄟ^節(jié)點“/proc/sys/vm/swappiness”配置。

6.3zRam相關的技術指標

1)ZRAM大小及剩余空間

Proc/meminfo中可以查看相關信息

SwapTotal:swap總大小, 如果配置為ZRAM, 這里就是ZRAM總大小

SwapFree:swap剩余大小, 如果配置為ZRAM, 這里就是ZRAM剩余大小

當然, 節(jié)點 /sys/block/zram0/disksize是最直接的。

2)ZRAM壓縮率

/sys/block/zram/mm_stat中有壓縮前后的大小數(shù)據(jù), 由此可以計算出實際的壓縮率

orig_data_size:壓縮前數(shù)據(jù)大小, 單位為bytes

compr_data_size :壓縮后數(shù)據(jù)大小, 單位為bytes

3)換出/換入swap區(qū)的總量, proc/vmstat中中有相關信息

pswpin:換入總量, 單位為page

pswout:換出總量, 單位為page

6.4zRam關優(yōu)化

上面提到zRam的一些缺陷, 怎么去改善呢?

1) zRam大小是可靈活配置的, 那是不是配置越大越好呢? 如果不是配置多大是最合適的呢?

zRam大小的配置比較靈活, 如果zRam配置過大, 后臺緩存了應用過多, 這也是有可能會影響前臺應用使用的流暢度。另外, zRam配置越大, 也需要關注系統(tǒng)的內(nèi)存碎片化情。因此zRam并不是配置越大越好,具體的大小需要根據(jù)內(nèi)存總大小及系統(tǒng)負載情況考慮及實測而定。

2) 使用zRam,可能會存在低內(nèi)存場景由于頻繁的內(nèi)存壓縮導致kswapd進程占CPU高, 怎樣改善?

zRam本質(zhì)就是以時間換空間, 在低內(nèi)存的情況下, 肯定會比較頻繁地回收內(nèi)存, 這時kswapd進程是比較活躍的, 再加上通過壓縮內(nèi)存, 會更加消耗CPU資源。 改善這種情況方法也比較多, 比如, 可以使用更優(yōu)的壓縮算法, 區(qū)別使用場景, 后臺不影響用戶使用的場景異步進行深度內(nèi)存壓縮, 與用戶體驗相關的場景同步適當減少內(nèi)存壓縮, 通過增加文件頁的回收比例加快內(nèi)存回收等等。

3) 增大了zRam配置,對系統(tǒng)內(nèi)存碎片是否有影響?

使用zRam是有可能導致系統(tǒng)內(nèi)存碎片變得更嚴重的, 特別是zsmalloc分配不支持可移動內(nèi)存類型的時候。新版的內(nèi)核zsmalloc已經(jīng)支持可移動類型分配的, 但由于增大了zRam,結(jié)合android手機的使用特點, 仍然會有可能導致系統(tǒng)內(nèi)存碎片較嚴重的情況,因些內(nèi)存碎片問題也是需要重點關注的。解決系統(tǒng)內(nèi)存碎片的方法也比較多, 可以結(jié)合具體的原因及場景進行優(yōu)化。

7.參考資料

1)https://github.com/lz4/lz4

2) kernel\Documentation\blockdev\zram.txt

3) kernel\Documentation\vm\zswap.txt

4) kernel\Documentation\sysctl\vm.txt

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11332

    瀏覽量

    225991
  • Linux
    +關注

    關注

    88

    文章

    11822

    瀏覽量

    219602
  • 內(nèi)存
    +關注

    關注

    9

    文章

    3238

    瀏覽量

    76528
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    如何理解Linux內(nèi)核中的PCIe驅(qū)動

    我們習慣了用 Verilog 去死磕 PCIe 的底層協(xié)議狀態(tài)機。但一旦越過硬件邊界來到操作系統(tǒng)層面,Linux 內(nèi)核是如何接管并驅(qū)動這些 PCI/PCIe 設備的呢?由于不同的 CPU 架構(gòu)實現(xiàn)了
    的頭像 發(fā)表于 04-11 17:22 ?1289次閱讀

    Linux內(nèi)核三大核心模塊深度解析:調(diào)度、內(nèi)存與I/O

    Linux內(nèi)核作為操作系統(tǒng)的核心,其進程調(diào)度、內(nèi)存管理和文件I/O三大模塊共同決定了系統(tǒng)的性能與穩(wěn)定性。無論是多核服務器的高并發(fā)處理,還是嵌入式設備的資源受限場景,深入理解這些底層機制都是進行性能調(diào)
    的頭像 發(fā)表于 03-12 09:00 ?249次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>三大核心模塊深度解析:調(diào)度、<b class='flag-5'>內(nèi)存</b>與I/O

    Linux內(nèi)核驅(qū)動開發(fā)的技術核心精要

    嵌入式Linux驅(qū)動開發(fā)是連接硬件與操作系統(tǒng)的關鍵環(huán)節(jié)。隨著內(nèi)核演進(如Linux 6.13)和硬件復雜度提升,開發(fā)者需掌握并發(fā)控制、中斷分層、內(nèi)存管理、設備樹、調(diào)試工具等核心知識。本
    發(fā)表于 03-10 13:56

    Linux內(nèi)核伙伴系統(tǒng)內(nèi)存申請函數(shù)詳解:從原理到實戰(zhàn)

    Linux 內(nèi)核中,內(nèi)存管理是整個系統(tǒng)穩(wěn)定運行的基石,而伙伴系統(tǒng)(Buddy System) 作為內(nèi)核物理內(nèi)存分配的核心機制,更是驅(qū)動開
    的頭像 發(fā)表于 02-10 16:58 ?3745次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>伙伴系統(tǒng)<b class='flag-5'>內(nèi)存</b>申請函數(shù)詳解:從原理到實戰(zhàn)

    Linux 6.8 內(nèi)核 - 錯誤:找不到 cmdline 扁平化設備樹怎么解決?

    我正在嘗試一個新的 6.8 linux 內(nèi)核,但我在啟動時收到這個錯誤: 從0x44000000到0x40200000的移動圖像,end=41724000 錯誤:未找到 cmdline 扁平化設備樹
    發(fā)表于 02-09 07:13

    Linux系統(tǒng)內(nèi)核參數(shù)調(diào)優(yōu)實戰(zhàn)指南

    Linux 內(nèi)核參數(shù)調(diào)優(yōu)是系統(tǒng)性能優(yōu)化的核心環(huán)節(jié)。隨著云原生架構(gòu)的普及和硬件性能的飛速提升,默認的內(nèi)核參數(shù)配置往往無法充分發(fā)揮系統(tǒng)潛力。在高并發(fā) Web 服務、大數(shù)據(jù)處理、容器化部署等場景下,合理的
    的頭像 發(fā)表于 01-28 14:27 ?759次閱讀

    【「Linux 設備驅(qū)動開發(fā)(第 2 版)」閱讀體驗】+讀深入理解Linux內(nèi)核內(nèi)存分配

    每個內(nèi)存地址是虛擬的,不是直接指向RAM中的任何地址。當用戶訪問內(nèi)存中的存儲單元時,都會進行地址轉(zhuǎn)換以匹配相應的物理內(nèi)存。書籍的第10章討論了五個主題,對Linux
    發(fā)表于 01-16 20:05

    rk基于linux/android內(nèi)存管理

    內(nèi)核對容量的識別), 64 位平臺上認為所有內(nèi)存都可 用。然后通過一系列 reserve_xxx() 接口從內(nèi)存末尾往前預留需要的內(nèi)存,最后把自己 relocate 到某段 reser
    的頭像 發(fā)表于 12-15 10:42 ?301次閱讀
    rk基于<b class='flag-5'>linux</b>/android<b class='flag-5'>內(nèi)存</b>管理

    【書籍評測活動NO.67】成為硬核Linux開發(fā)者:《Linux 設備驅(qū)動開發(fā)(第 2 版)》

    景化應用的完整體系。從Linux內(nèi)核開發(fā)的環(huán)境搭建、模塊編程,到設備樹、總線驅(qū)動,再到內(nèi)存優(yōu)化、DMA 技術,最后到IIO、GPIO、輸入子系統(tǒng)實戰(zhàn),每一篇都以前一篇為基礎,既適合零基
    發(fā)表于 11-17 17:52

    deepin亮相2025中國Linux內(nèi)核開發(fā)者大會

    、騰訊云、OPPO、字節(jié)跳動、vivo、螞蟻集團、龍芯中科等企業(yè)發(fā)起,以“自由,協(xié)作,創(chuàng)新”為理念,以開源技術的推廣和普及為使命,旨在促進Linux內(nèi)核開發(fā)愛好者相互交流、共同進步。
    的頭像 發(fā)表于 11-05 17:59 ?952次閱讀

    RK3506開發(fā)板Xenomai內(nèi)核RT-Linux實時性系統(tǒng)適配教程與性能實測,實測僅7μs穩(wěn)定延時

    本文基于觸覺智能RK3506核心板/開發(fā)板,介紹Xenomai內(nèi)核RT-Linux實時性系統(tǒng)適配,并附性能實測。簡介與實測數(shù)據(jù)Xenomai簡介XEnomai是一個實時子系統(tǒng),可與Linux
    的頭像 發(fā)表于 09-18 14:21 ?1712次閱讀
    RK3506開發(fā)板Xenomai<b class='flag-5'>內(nèi)核</b>RT-<b class='flag-5'>Linux</b>實時性系統(tǒng)適配教程與性能實測,實測僅7μs穩(wěn)定延時

    Linux三大主流文件系統(tǒng)解析

    還在為選擇哪個文件系統(tǒng)而糾結(jié)?作為一名摸爬滾打多年的運維老鳥,我將用最接地氣的方式,帶你徹底搞懂 Linux 三大主流文件系統(tǒng)的奧秘。
    的頭像 發(fā)表于 08-05 17:37 ?1779次閱讀

    內(nèi)存場景下的高效壓縮利器:FastLZ壓縮庫應用實踐指南

    在資源受限環(huán)境中,數(shù)據(jù)壓縮既要追求速度又要節(jié)省內(nèi)存。本文聚焦FastLZ壓縮庫,深入探討其在低內(nèi)存場景下的應用實踐,通過解析其核心算法與優(yōu)化策略,帶您掌握如何利用該庫實現(xiàn)快速
    的頭像 發(fā)表于 07-22 15:13 ?532次閱讀
    低<b class='flag-5'>內(nèi)存</b>場景下的高效<b class='flag-5'>壓縮</b>利器:FastLZ<b class='flag-5'>壓縮</b>庫應用實踐指南

    如何配置和驗證Linux內(nèi)核參數(shù)

    Linux系統(tǒng)運維和性能優(yōu)化中,內(nèi)核參數(shù)(sysctl)的配置至關重要。合理的參數(shù)調(diào)整可以顯著提升網(wǎng)絡性能、系統(tǒng)穩(wěn)定性及資源利用率。然而,僅僅修改參數(shù)是不夠的,如何驗證這些參數(shù)是否生效同樣關鍵。
    的頭像 發(fā)表于 05-29 17:40 ?1403次閱讀

    揭秘,瑞芯微全系擁抱Linux 6.1內(nèi)核的底層邏輯

    近期,瑞芯微(Rockchip)基本完成了旗下產(chǎn)品Linux6.1BSP內(nèi)核更新,引發(fā)了不小的行業(yè)熱議。除了低端RK3506依舊使用Buildroot構(gòu)建系統(tǒng)外,RK3588、RK3576
    的頭像 發(fā)表于 05-16 08:31 ?1532次閱讀
    揭秘,瑞芯微全系擁抱<b class='flag-5'>Linux</b> 6.1<b class='flag-5'>內(nèi)核</b>的底層邏輯
    布拖县| 蓬溪县| 万安县| 松溪县| 十堰市| 绥宁县| 洱源县| 温州市| 西城区| 买车| 长宁县| 周宁县| 新和县| 从化市| 德化县| 习水县| 葵青区| 南安市| 韶山市| 景宁| 青海省| 德昌县| 大竹县| 韶关市| 延津县| 罗源县| 安平县| 九龙坡区| 和田市| 佛冈县| 安阳市| 西宁市| 成武县| 大城县| 丁青县| 论坛| 页游| 长白| 镇康县| 罗城| 库车县|