本文**
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 的原則。因此 棧 ...