全志科技
直播中

文小二

2年用户 831经验值
擅长:嵌入式技术 处理器/DSP 控制/MCU
私信 关注

全志V853芯片swap功能简介与tina上swap分区使用方法

V853开发板购买链接:https://www.hqchip.com/p/KFB-V853.html

swap功能简介

1、概念介绍

swap:系统内存紧张时进行的内存回收操作。

swap分区:在swap内存回收操作中,被回收的匿名页会回写到swap分区。

系统没有swap分区的时候,依旧会进行swap操作,swap操作不一定会操作到swap分区。

2、swap分区介绍

linux系统支持各种块设备、文件作为swap分区,且容量可以叠加。比如同时使用spinor上的swap裸分区和TF卡上的文件叠加作为swap分区。申请成功的swap容量可以通过free命令查看.

分区文件版本下载:swap menu

             total       used       free     shared    buffers     cached
Mem:        511776     506952       4824          0        512        836
-/+ buffers/cache:     505604       6172
Swap:         1020         44        976

各存储基于TINA SDK使用swap的方法

1、swap分区使用方法

swap分区的使能依赖mkswap命令和swapon命令。对于TINA SDK大部分存储来说。只需要make menuconfig选中mkswap、swapon命令,且在sys_partition(_nor).fex分区表中分配一个作为swap分区的裸分区即可。

root@(none):/# free
             total       used       free     shared    buffers     cached
Mem:        511776      16820     494956          0       1260       2068
-/+ buffers/cache:      13492     498284
Swap:            0          0          0

root@(none):/# mkswap /dev/by-name/swap
Setting up swapspace version 1, size = 1020 KiB
no label, UUID=c714a274-5c8b-44e9-87f0-e6ce39226621

root@(none):/# swapon /dev/by-name/swap
[  223.756712] Adding 1020k swap on /dev/by-name/swap.  Priority:-1 extents:1 across:1020k SS
root@(none):/# free
             total       used       free     shared    buffers     cached
Mem:        511776      16820     494956          0       1356       2128
-/+ buffers/cache:      13336     498440
Swap:         1020          0       1020

2、存储使用差异

大部分存储都可以使用上文介绍的方式来使能swap分区,mkswap的前提是你可以获得一个可读可写的块设备/文件,比如mtdblockn、mmcblk0pn、nandn。

对于ubi nand来说,tina系统默认使用squashfs+ubifs来获得一个可读写的overlay,其中squashfs就依赖于块设备,但对于ubi nand来说,提供给squashfs的ubiblock必须是只读的,只读的ubiblock+只读文件系统squashfs的搭配。所以尽管在用户态可以创建出ubiblock,创建出来的ubiblock也是只读的,不满足mkswap的需求。此时尝试基于可读写的overlay创建文件,利用ubifs上的文件来作为swap,测试发现mkswap可以成功,但是并不能swapon。

基于以上,提出了两种方法:

(1)直接不使用ubi nand的逻辑分区,即不使用mtdblock上的ubiblock,直接使用mtdblock,操作底层的物理块设备,pstore/blk在ubi nand上也是此种做法,但是这种做法的风险点在于,mtdblock并没有磨损平衡,只有坏块处理。所以对应的swap分区寿命不长。

(2)不使用tina squashfs+overlay的做法,直接使用mkfs.ubifs制作一个可读可写的rootfs,内核关闭readonly-ubi块的配置,让系统可以顺利创建出可读可写的ubiblock。但是需要牺牲根文件系统只读的功能,在掉电等存储不稳定的场景下,根文件系统有可能被损坏。在保证存储稳定性的情况下,这种方法应该是优选。

小知识

1、swap分区没有被用完,为什么依旧会oom

内核触发kswapd进行内存回收时,会对匿名页和文件页进行回收(有更多仲裁方法,不展开叙述),其中文件页的回收方法是清除缓存的文件内容,并不需要回写flash,因为文件页的实际文件一直保存在flash中,下一次读文件时,需要重新从flash中读回文件,无法直接从缓存中获取文件内容;匿名页的回收方法是写到swap分区(当存在swap分区的时候)。所以当你内存临界,且在系统仲裁下已经没有可以回收的匿名页时,尽管swap分区没有用完,依旧会触发oom。

2、CPU占用率和内存的取舍

/proc/sys/vm/swappiness节点描述系统对swap分区的使用原则,0表示最大限度使用物理内存,100表示最大限度使用swap分区。在内存紧张的情况下,可以使用swap分区,但是频繁使用swap分区必然导致CPU占用率的升高,此时可以通过调节swappiness节点来对CPU占用率和内存进行平衡。

更多回帖

发帖
×
20
完善资料,
赚取积分