结合工作中的实战经验,以及工作中常用的内存管理知识点。想写一篇文章,介绍一下kernel的内存分配基础知识。让大家对kernel内存管理有一个基本的认识。
Node Zone Page
Memblock Buddy Slub
1.直接页面回收机制(执行页面回收时进程本身,同步回收,阻塞调用者进程执行)
alloc_pages(),由于系统内存短缺,不能满足分配请求,内核会直接进入页面回收机制尝试回收内存解决当前燃眉之急
2.周期性回收内存机制(与调用者关系时异步,调用者进程会继续尝试其他办法分配内存,如直接页面回收)
alloc_pages(),由于系统内存短缺,没法再低水位情况下分配内存,因此会唤醒ksawapd内核线程来异步回收内存
3.slab shrinker机制
回收slab对象,当内存短缺时,直接页面回收和周期性回收内存两种机制都会调用slab shrinker回收slab对象
The zram module creates RAM based block devices named /dev/zram
(
in memory itself.
#dumpsys meminfo
Total RAM: 7,351,896K (status normal)
Free RAM: 4,243,523K ( 390,395K cached pss + 2,729,028K cached kernel + 1,124,100K free)
DMA-BUF: 258,844K ( 7,016K mapped + 251,828K unmapped)
DMA-BUF Heaps: 258,844K
DMA-BUF Heaps pool: 0K
GPU: 464,200K ( 464,200K dmabuf + 0K private)
Used RAM: 4,078,703K (3,057,987K used pss + 1,020,716K kernel)
Lost RAM: 1,009,277K
ZRAM: 390,472K physical used for 1,917,952K in swap (6,291,452K total swap)
Tuning: 256 (large 512), oom 322,560K, restore limit 107,520K (high-end-gfx)
#cat /proc/meminfo
SwapTotal: 6291452 kB
SwapFree: 4512508 kB
具体kernel函数实现:
get_scan_count(lruvec, sc, nr);
swappiness参数是内核倾向于回收匿名页到swap的积极程度,内核范围是0~100, 参数值越大, 表示回收匿名页到swap的比例就越大。
如果配置为0, 表示仅回收文件页,不回收匿名页。默认值为60,项目配置100。
cat /proc/sys/vm/swappiness
echo xx > /proc/sys/vm/swappiness
三部分:
数据流操作:提供串行或者并行的压缩和解压操作。
内存压缩算法:每种压缩算法提供压缩和解压缩的具体实现回调接口供数据操作调用。
Zram驱动:创建一个基于ram的块设备, 并提供IO请求处理接口。
drivers/block/zram/zram_drv.c
static int __init zram_init(void)
{
ret = cpuhp_setup_state_multi(CPUHP_ZCOMP_PREPARE, "block/zram:prepare",
zcomp_cpu_up_prepare, zcomp_cpu_dead);
ret = class_register(&zram_control_class);
zram_major = register_blkdev(0, "zram");
ret = zram_add();
}
static const struct block_device_operations zram_wb_devops = {
.open = zram_open,
.submit_bio = zram_submit_bio,
.swap_slot_free_notify = zram_slot_free_notify,
.owner = THIS_MODULE
};
如何配置开启zRAM
使能zram
swapon /dev/zram0
关闭
adb shell sysctl -w vm.swappiness=0
adb shell swapoff /dev/block/zram0
配置内存压缩算法
echo lz4 > /sys/block/zram0/comp_algorithm
cat /sys/block/zram0/comp_algorithm
配置ZRAM大小
echo xxxx > /sys/block/zram0/disksize
其他参数:
zeus:/sys/block/zram0 # ls
alignment_offset bdi debug_stat events hidden inflight mem_limit new_stat queue ro subsystem writeback
avg_size capability dev events_async holders initstate mem_used_max origin_pages_max range size time_list writeback_limit
backing_dev comp_algorithm discard_alignment events_poll_msecs idle io_stat mm_stat pages_life removable slaves uevent writeback_limit_enable
bd_stat compact disksize ext_range idle_stat max_comp_streams new power reset stat wb_pages_max
参考:https://www.kernel.org/doc/Documentation/blockdev/zram.txt
http://www.wowotech.net/memory_management/zram.html