Linux - swap
场景
在一个内存只有 700M 左右的服务器上面使用 git push 一个带 submodule 的项目的时候,出错:
1 | fatal: Out of memory, malloc failed (tried to allocate 79691777 bytes) |
当停止一些占用内存的服务之后,发现又可以正常 push。Stackoverflow 之后,解决办法有:添加内存或添加 swap 空间。cat /proc/swaps
之后发现服务器没有设置 swap 空间。
swap 简介
计算机的内存分为物理内存和虚拟内存。物理内存,即实际内存大小(RAM);虚拟内存,是由磁盘虚拟出来的,在内存不够的时候可以起到一个代替物理内存的作用,也就是 swap。
当产生一个新进程的时候,机器会判断当前物理内存是否有空闲运行该进程,如果没有,则会根据优先级将物理内存中运行的一个或多个进程挂起,并将挂起的进程放到 swap 中等待,然后,把这个新进程放入物理内存中运行。等到物理内存中有进程结束释放空间之后,再将在 swap 中挂起等待的进程调到物理内存中运行。
当物理内存使用达到一个比例之后,机器就会使用 swap 作为临时内存使用。这个比例保存在 /proc/sys/vm/swappiness
中,大小从 0 到 100。0,表示最大限度使用内存。更改该比例的大小:
1 | echo 60 > /proc/sys/vm/swappiness |
当物理内存和 swap 内存都使用完的时候,就会出现 out of memory
之类的错误。
添加/开启/关闭 swap
创建一个 swap 文件
1
dd if=/dev/zero of=/root/swap1 bs=1M count=1024
执行完之后就会产生文件
/root/swap1
为了安全起见,设置一下文件的权限
1
chmod 600 /root/swap1
将文件变为 swap 文件
1
mkswap /root/swap1
开启 swap
1
swapon /root/swap1
该命令还可以有其它参数,如
-p
设定 swap 的优先级。使 swap 开机生效
/etc/fstab
文件主要存放文件系统的静态信息。在文件中添加:1
/root/swap1 none swap defaults 0 0
各个参数之间可以用空格或 tab 键隔开。
关闭 swap
1
swapoff /root/swap1