一文讀懂linux 下zram

2021-08-29 05:24:05 字數 3805 閱讀 3964

本文**

zram 技術的由來:

3.15 之前版本的 kernel

device drivers -> staging drivers (staging [=y])

3.15 及之後版本的 kernel

device drivers -> block devices -> compressed ram block device support

具體的配置項如下:

config_resource_counters=y

config_memcg=y

config_memcg_swap=y

config_memcg_swap_enabled=y

config_memcg_kmem=y

config_zram=y

config_toi_zram_support=y

config_zram_debug=y

zram 塊裝置個數設定

如果是將 zram 編譯成模組,則可以使用下面命令動態載入,這個命令會建立 4 個裝置 /dev/zram

modprobe zram num_devices=4

如果是直接將 zram 編譯到核心,那只能在**裡面直接修改 num_devices,3.15 之前的版本**路徑是 drivers/staging/zram/zram_drv.c,3.15 及之後的版本**路徑是 ./drivers/block/zram/zram_drv.c ,預設 zram 裝置個數是乙個。

壓縮流的最大個數設定

這個是 3.15 版本及以後的 kernel 新加入的功能,3.15 版本之前的 zram 壓縮都是使用乙個壓縮流(快取 buffer 和演算法私有部分)實現,每個寫(壓縮)操作都會獨享壓縮流,但是單壓縮流如果出現資料奔潰或者卡住的現象,所有的寫(壓縮)操作將一直處於等待狀態,這樣效率非常低;而多壓縮流的架構會讓寫(壓縮)操作可以並行去執行,大大提高了壓縮的效率和穩定性

檢視壓縮流的最大個數,預設是 1

cat /sys/block/zram0/max_comp_streams

設定壓縮流的最大個數

echo 3 > /sys/block/zram0/max_comp_streams

壓縮演算法選擇

檢視目前支援的壓縮演算法

cat /sys/block/zram0/comp_algorithm

lzo [lz4]

修改壓縮演算法

echo lzo > /sys/block/zram0/comp_algorithm

zram 記憶體大小設定

分配部分記憶體作為 zram ,大小建議為總記憶體的 10%-25%

可以使用數值直接設定記憶體大小,單位是 bytes

echo $((51210241024)) > /sys/block/zram0/disksize

也可以使用帶記憶體單位作為字尾的方式設定記憶體大小

echo 256k > /sys/block/zram0/disksize

echo 512m > /sys/block/zram0/disksize

echo 1g > /sys/block/zram0/disksize

啟用 zram 裝置為 swap

mkswap /dev/zram0

swapon /dev/zram0

具體的 zram 相關對外介面說明

name access description

disksize rw 顯示和設定該塊裝置的記憶體大小

initstate ro 顯示裝置的初始化狀態

reset wo 重置裝置

num_reads ro 讀資料的個數

failed_reads ro 讀資料失敗的個數

num_write ro 寫資料的個數

failed_writes ro 寫資料失敗的個數

invalid_io ro 非頁面大小對齊的i/o請求的個數

max_comp_streams rw 最大可能同時執行壓縮操作的個數

comp_algorithm rw 顯示和設定壓縮演算法

notify_free ro 空閒記憶體的通知個數

zero_pages ro 寫入該塊裝置的全為的頁面的個數

orig_data_size ro 儲存在該塊裝置中沒有被壓縮的資料的大小

compr_data_size ro 儲存在該塊裝置中已被壓縮的資料的大小

mem_used_total ro 分配給該塊裝置的總記憶體大小

mem_used_max rw 該塊裝置已用的記憶體大小,可以寫 1 重置這個計數引數到當前真實的統計值

mem_limit rw zram 可以用來儲存壓縮資料的最大記憶體

pages_compacted ro 在壓縮過程中可用的空閒頁面的個數

compact wo 觸發記憶體壓縮

reset zram

reset zram後,zram的大小就會變為0,在使用之前必須需要設定大小

echo 1 > /sys/block/zram0/reset

改變zram的大小

如果zram的大小比較小,不能滿足需要。需要就該zram的大小。

root@test:/data # echo $((51210241024)) > /sys/block/zram0/disksize

sh: echo: write error: device or resource busy

如果直接設定新的大小,就會提示設定失敗,裝置正在使用。所以先需要關閉裝置。

root@test:/data # cat /proc/swaps

filename type size used priority

/dev/zram0 partition 409596 4456 -1

root@test:/data # swapoff /dev/zram0

root@test:/data # cat /proc/swaps

filename type size used priority

root@test:/data #

可以發現zram0已經不屬於交換分割槽了。接著繼續設定大小

root@test:/data # echo $((5121024*1024)) > /sys/block/zram0/disksize

sh: echo: write error: device or resource busy

root@test:/data #

於是發現還是設定失敗,裝置正在使用。檢視zram的驅動。

static ssize_t disksize_store(struct device *dev,

struct device_attribute *attr, const char *buf, size_t len)

}可以發現init_done條件不成立,檢視init_done函式。

static inline int init_done(struct zram *zram)

所以想要重新設定大小,在驅動中檢視zram->meta在什麼情況下為null

static void zram_reset_device(struct zram zram, bool reset_capacity)

所以設定大小之前還需要執行reset操作。

root@test:/data # echo 1 > /sys/block/zram0/reset

root@test:/data # echo $((51210241024)) > /sys/block/zram0/disksize

root@test:/data #

一文讀懂Nginx

問 nginx的負載均衡演算法有什麼?預設是什麼演算法?答 1 輪詢 按請求的時間輪詢查空閒的後端伺服器 2 指定輪詢機率 機率的原因是後端伺服器的效能不均勻,好的多分點,差的少分點 3 固定ip繫結固定伺服器 預設是加權輪詢,就是優先訪問權重高的伺服器 問 nginx是單執行緒的嗎?答 是單執行緒...

一文讀懂SpringMVC

主要講的是dispatcherservlet這個類 ioc其實是乙個map,工程啟動後掃瞄路徑,根據類的全限定名建立bean 問 怎麼根據路徑找到方法?map還存key為 aaa value為該controller例項 問 autowired原理?自定義註解,在載入的時候,掃瞄controller層...

堆疊 一文讀懂

堆疊 stack 是一種先進後出的 操作受限的線性表,也可以直接稱為棧。可以把棧想象成乙個桶一樣,往這個桶裡面一層一層的放東西,先放進去的在裡面,後放進去的東西依次在外面。但取東西的時候就是先取靠近外面的,再依次一層層取裡面的。這就是 後進先出 last in first out 的原則。因此 棧 ...