swap功能简介
1、概念介绍
swap:系统内存紧张时进行的内存回收操作。
swap分区:在swap内存回收操作中,被回收的匿名页会回写到swap分区。
系统没有swap分区的时候,依旧会进行swap操作,swap操作不一定会操作到swap分区。
2、swap分区介绍
linux系统支持各种块设备、文件作为swap分区,且容量可以叠加。比如同时使用spinor上的swap裸分区和TF卡上的文件叠加作为swap分区。申请成功的swap容量可以通过free命令查看.
代码语言:javascript复制 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分区的裸分区即可。
代码语言:javascript复制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占用率和内存进行平衡。
原贴链接:https://bbs.aw-ol.com/topic/1626/