Linux kernel内存分配基础

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

目录

基本概念

Malloc

缺页异常

分配匿名页

内核触发页面回收的机制

Slow Path

Shrink node

Kswap线程

Slab shrink

Zone水位管理流程

Zram

zram使用状态

swappiness

驱动实现

do_swap_page

配置

参考


基本概念

Node Zone Page

Memblock Buddy Slub

Malloc

缺页异常

分配匿名页

内核触发页面回收的机制

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

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

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

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

3.slab shrinker机制

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

Slow Path

Shrink node

Kswap线程

Slab shrink

Zone水位管理流程

Zram

The zram module creates RAM based block devices named /dev/zram<id>

(<id> = 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


 

配置

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

repinkply

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值