Linux kernel内存分配基础

结合工作中的实战经验,以及工作中常用的内存管理知识点。想写一篇文章,介绍一下kernel的内存分配基础知识。让大家对kernel内存管理有一个基本的认识。

基本概念

Node Zone Page

Memblock Buddy Slub

Malloc

Linux kernel内存分配基础_第1张图片

缺页异常

Linux kernel内存分配基础_第2张图片

分配匿名页

Linux kernel内存分配基础_第3张图片

内核触发页面回收的机制

1.直接页面回收机制(执行页面回收时进程本身,同步回收,阻塞调用者进程执行)

alloc_pages(),由于系统内存短缺,不能满足分配请求,内核会直接进入页面回收机制尝试回收内存解决当前燃眉之急

2.周期性回收内存机制(与调用者关系时异步,调用者进程会继续尝试其他办法分配内存,如直接页面回收)

alloc_pages(),由于系统内存短缺,没法再低水位情况下分配内存,因此会唤醒ksawapd内核线程来异步回收内存

3.slab shrinker机制

回收slab对象,当内存短缺时,直接页面回收和周期性回收内存两种机制都会调用slab shrinker回收slab对象

Slow Path

Linux kernel内存分配基础_第4张图片

 

Shrink node

Linux kernel内存分配基础_第5张图片

 

Kswap线程

Linux kernel内存分配基础_第6张图片

 

Slab shrink

Linux kernel内存分配基础_第7张图片

 

Zone水位管理流程

Linux kernel内存分配基础_第8张图片

 

Zram

The zram module creates RAM based block devices named /dev/zram

( = 0, 1, ...). Pages written to these disks are compressed and stored

in memory itself.

zram使用状态

#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

swappiness

具体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

};

do_swap_page

Linux kernel内存分配基础_第9张图片

 


 

配置

如何配置开启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

你可能感兴趣的:(#,内存管理,内核,kernel,Linux)