前言
本文记录基于linux系统进行测试时出现物理内存不足,使用交换分区临时解决使进程得以继续执行;
一、问题现象
[ 1727.555786] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,task=sgcc_base.mytes,pid=752,uid=0
[ 1727.566788] Out of memory: Killed process 752 (sgcc_base.mytes) total-vm:4759208kB, anon-rss:4729924kB, file-rss:1340kB, shmem-rss:0kB, UID:0 pgtables:9356kB oom_score_adj:0
运行一个程序提示内存不足;
二、解决方法
我们在非易失性存储器中创建一段交换,可能是EMMC, NAND等存储设备,本人使用的为EMMC有几十G大小,创建了几个分区并进行了挂在,如下:
root@vmachine:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 2.0G 701M 1.2G 39% /
/dev/mmcblk0p1 115M 58M 49M 55% /boot
/dev/mmcblk0p2 974M 24K 907M 1% /mnt1
/dev/mmcblk0p3 974M 24K 907M 1% /mnt2
/dev/mmcblk0p5 53G 29G 22G 57% /mnt3
我们选最大的分区挂载目录,在其中创建交换分区:
cd /mnt3
sudo dd if=/dev/zero of=swapfile bs=1M count=4096
sudo mkswap swapfile
swapon swapfile
sudo chmod 600 swapfile
sudo chown root:root swapfile
查看创建情况:
free会显示 Swap的分配和使用情况
三、优缺点
原理:交换分区的原理为当内存不足时,会触发内存警戒,内核的内存管理机制会检查如果设置了交换分区,会将内存中暂时不用的数据放到非易失性存储器中从而释放一部分内存;
缺点:如果换出去的数据随后又继续被程序需要会被再次从非易失性存储器调回内存,涉及到数据的备份、恢复等处理,会耗费时间;
优点:为了验证某个功能的整体功能在内存不足又想节省时间不去重新更新硬件配置时,可以先考虑此方法;