ZRAM SWAP

1.ZRAM

1.1 zram的理解
ZRAM(壓縮內存)的意思是說在內存中開闢一塊區域壓縮數據……就是說假設原來150MB的可用內存現在可以放下180MB的東西……本身不會提高內存容量和運行速度……只是讓後臺程序更少被系統砍掉罷了,爲了能得到更多多任務運行……而且這個壓縮動作會加重CPU負擔……

 

ZRAM是linux的一種內存優化技術,基本工作原理是:通過劃定一片區域,將壓縮過後的硬盤數據放入該區域,以實現高速讀取。

 

zram是內存壓縮,所有寫入內存的東西都會經過壓縮,會少量增加CPU負擔

swap是交換分區,類似於Windows的虛擬內存,就是當內存不足的時候,把一部分硬盤空間虛擬成內存使用,從而解決內存容量不足的情況

 

zram是把RAM劃分一部分出來作爲swap使用,存儲的是壓縮過的內容(不然就毫無意義了),

swap是把flash劃分一部分出來作爲swap使用。

 

zRAM是一個Linux內核驅動,zRAM大體上可以看成是用內存做一塊虛擬盤,拿來作爲Linux的交換分區。和普通的ramdisk不同,zRAM對存放的內容會進行實時的壓縮,以提高實際的容量。

 

利用zRAM並不是減小Android的內存佔用,而是通過zRAM來提供交換空間,從而在內存緊張時釋放出更多的可用內存,同時又避免傳統的交換到文件系統的開銷。

 

zRAM可以分出一塊內存,然後讓系統當作虛擬內存來使用。傳統的虛擬內存是存放在磁盤上的,而zRAM存在內存裏,並會進行壓縮。這樣的虛擬內存訪問速度可以提高很多,內存利用率也會大幅提高。所以對於小內存設備,比如512M內存的Android設備,或者1G內存的電腦,都會有很大幫助。應該和OS X 10.9的內存壓縮效果差不多,而且設計得更爲巧妙。在CPU有較快速度的年代裏,利用CPU的資源對內存進行壓縮,以便在小內存設備裏也能存下更多的後臺進程,是個很不錯的方法。

 

1.2.zram swap內存管理講解

1.2.1 Android內存管理機制

假設你先開了QQ,然後跟A聊天,然後你按了HOME鍵,又開了微信和B聊天,假設這時候系統基本沒有內存了,又按了HOME鍵想打開UC看看微博。Android會怎麼幹哪?他發現QQ最先到後臺,就把QQ給幹掉了。玩了會UC,你又要跟A聊天,這時候android發現又沒有內存了,發現微信半天沒用了,就把微信給幹掉,然後給QQ用。問題來了,你本來想多任務,結果只能同時用兩個程序,打開第三個如果內存不夠就要幹掉之前的。但是你期望的是我如果沒有把他退出去,我希望下次再打開QQ的時候還是在給A聊天的界面。

1.2.2 ZARM SWAP解決方案:

  SWAP最開始的方案就是專門從flash(閃存ROM)上分出一塊區域,每次如果內存(運行存儲RAM)不夠不是吧程序給幹掉,而是把程序佔用內存的數據複製到SWAP分區,等切換回來的時候就直接把這部分複製到內存裏,這樣程序直接就恢復到之前的狀態,譬如QQ上與妹紙A聊天的界面。這樣你就感覺程序還是以前的樣子,沒有被系統幹掉。但是flash壽命有限一般10w次左右,這樣頻繁讀寫很快flash就掛了。於是攻城獅就想到了另外一個辦法,把內存劃分一部分拿出來當SWAP用,但是羊毛出在羊身上,原來你QQ佔用50M內存,你又把他複製到SWAP裏面還是50M,SWAP還是佔用的內從,等於說一點都沒減少內從使用,所以就有了ZRAM SWAP。攻城獅怎麼幹的呢?比如你QQ佔用50M內存,他把他壓縮到20M然後再放到SWAP裏面,這樣SWAP裏面機可以放更多不用的程序,就可以釋放更多的內存給新的程序用,於是你就發現多任務切換終於利索了。這就是 ZRAM SWAP.

舉例說明

總內存:600M= 300M(SWAP) +300 (活動內存)

每個程序佔用30M,壓縮後是10M。

沒有ZRAM SWAP 方案:

你可以同時打開 20 個程序 600/30 = 20

有ZRAM SWAP方案:

SWAP 裏面可以保存 300/10 = 30

活動內存裏可以運行  300/30 = 10

總共你可以同時運行 40 個程序, 這就是差別。

ZARM SWAP 優點

可以讓小內存的設備在多任務的情況下切換自如,提高用戶體驗。

zram把壓縮的page直接交換到內存中,速度遠遠快於io操作。

ZARM SWAP 缺點:

如果在大內存的設備上使用,不僅不會快,反倒因爲不斷複製內存並且CPU反覆壓縮解壓內從而拖慢速度。

往往只有低端設備纔會使用zram技術。

cpu就可能是單核心或性能低,壓縮/解壓會佔用cpu時間,影響性能。

內存小還要再開一塊交換區,也增加了負擔。

 

1.3.安卓手機有必要開zram嗎?
如果你的可用運行內存實在是太小,且CPU性能不是太低端(zRAM會消耗CPU資源),那麼zRAM還是有必要開。

2.SWAP解讀

2.1什麼是SWAP,到底是幹嘛的?

從功能上講,交換分區主要是在內存不夠用的時候,將部分內存上的數據交換到swap空間上,以便讓系統不會因內存不夠用而導致oom或者更致命的情況出現。

所以,當內存使用存在壓力,開始觸發內存回收的行爲時,就可能會使用swap空間。

內核對swap的使用實際上是跟內存回收行爲緊密結合的。

2.1.1爲什麼要進行內存回收

內核之所以要進行內存回收,主要原因有兩個:

①內核需要爲任何時刻突發到來的內存申請提供足夠的內存。所以一般情況下保證有足夠的free空間對於內核來說是必要的。

另外,Linux內核使用cache的策略雖然是不用白不用,內核會使用內存中的page cache對部分文件進行緩存,以便提升文件的讀寫效率。

所以內核有必要設計一個週期性回收內存的機制,以便cache的使用和其他相關內存的使用不至於讓系統的剩餘內存長期處於很少的狀態。

 

②當真的有大於空閒內存的申請到來的時候,會觸發強制內存回收。

所以,內核在應對這兩類回收的需求下,分別實現了兩種不同的機制:

一個是使用 kswapd進程對內存進行週期檢查 ,以保證平常狀態下剩餘內存儘可能夠用。

另一個是 直接內存回收(directpagereclaim) ,就是當內存分配時沒有空閒內存可以滿足要求時,觸發直接內存回收。

這兩種內存回收的觸發路徑不同:

一個是由內核進程kswapd直接調用內存回收的邏輯進行內存回收;

另一個是內存申請的時候進入slow path的內存申請邏輯進行回收。

這兩個方法中實際進行內存回收的過程殊途同歸,最終都是 調用shrink_zone() 方法進行鍼對每個zone的內存頁縮減。

2.2swappiness到底是用來調節什麼的?

很多人應該都知道 /proc/sys/vm/swappiness 這個文件,是個可以用來調整跟swap相關的參數。這個文件的默認值是60,可以的取值範圍是0-100。

這很容易給大家一個暗示:我是個百分比哦!

這個文件的值用來定義內核使用swap的積極程度:

值越高,內核就會越積極的使用swap;

值越低,就會降低對swap的使用積極性。

如果這個值爲0,那麼內存在free和file-backed使用的頁面總量小於高水位標記(high water mark)之前,不會發生交換。

2.3 kswapd什麼時候會進行swap操作?

我們回到kswapd週期檢查和直接內存回收的兩種內存回收機制。

直接內存回收比較好理解,當申請的內存大於剩餘內存的時候,就會觸發直接回收。

那麼kswapd進程在週期檢查的時候觸發回收的條件是什麼呢?

還是從設計角度來看,kswapd進程要週期對內存進行檢測,達到一定閾值的時候開始進行內存回收。

這個所謂的閾值可以理解爲內存目前的使用壓力,就是說,雖然我們還有剩餘內存,但是當剩餘內存比較小的時候,就是內存壓力較大的時候,就應該開始試圖回收些內存了,這樣才能保證系統儘可能的有足夠的內存給突發的內存申請所使用。

2.4、什麼是內存水位標記?(watermark)

那麼如何描述內存使用的壓力呢?

Linux內核使用水位標記(watermark)的概念來描述這個壓力情況。

Linux爲內存的使用設置了三種內存水位標記:high、low、min。他們 所標記的含義分別爲:

剩餘內存在high以上表示內存剩餘較多,目前內存使用壓力不大;

high-low的範圍表示目前剩餘內存存在一定壓力;

low-min表示內存開始有較大使用壓力,剩餘內存不多了;

min是最小的水位標記,當剩餘內存達到這個狀態時,就說明內存面臨很大壓力。

小於min這部分內存,內核是保留給特定情況下使用的,一般不會分配。

內存回收行爲就是基於剩餘內存的水位標記進行決策的:

當系統剩餘內存低於watermark[low]的時候,內核的kswapd開始起作用,進行內存回收。直到剩餘內存達到watermark[high]的時候停止。

如果內存消耗導致剩餘內存達到了或超過了watermark[min]時,就會觸發直接回收(direct reclaim)。

那麼watermark相關值是如何計算的呢?

所有的內存watermark標記都是根據當前內存總大小和一個可調參數進行運算得來的,這個參數是: /proc/sys/vm/min_free_kbyte

QA:

1.一個內存剩餘還比較大的系統中,是否有可能使用swap?

有可能,如果運行中的某個階段出發了這個條件”zonefile+zonefree<=high_wmark_pages(zone) “,就可能會swap。

2.swappiness設置爲0就相當於關閉swap麼?

不是的,關閉swap要使用swapoff命令。swappiness只是在內存發生回收操作的時候用來平衡cache回收和swap交換的一個參數,調整爲0意味着,儘量通過清緩存來回收內存。

3.swappiness設置爲100代表系統會盡量少用剩餘內存而多使用swap麼?

不是的,這個值設置爲100表示內存發生回收時,從cache回收內存和swap交換的優先級一樣。就是說,如果目前需求100M內存,那麼較大機率會從cache中清除50M內存,再將匿名頁換出50M,把回收到的內存給應用程序使用。但是這還要看cache中是否能有空間,以及swap是否可以交換50m。內核只是試圖對它們平衡一些而已。

4.kswapd進程什麼時候開始內存回收?

kswapd根據內存水位標記決定是否開始回收內存,如果標記達到low就開始回收,回收到剩餘內存達到high標記爲止。

5.如何查看當前系統的內存水位標記?

cat /proc/zoneinfo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章