场景

在一个内存只有 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

参考 unix/linux: 2 ways to add swap space