Ubuntu16.04如何开启swap分区

友情提醒:本文最后更新于 1903 天前,文中所描述的信息可能已发生改变,请谨慎使用。

一. 什么是swap分区?

    Swap分区即交换分区,是在系统的物理内存不够用的时候,把物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap分区中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。

二. 为什么要用swap

    1. 对于一些大型的应用程序(如LibreOffice、video editor等),在启动的过程中会使用大量的内存,但这些内存很多时候只是在启动的时候用一下,后面的运行过程中很少再用到这些内存。有了swap后,系统就可以将这部分不这么使用的内存数据保存到swap上去,从而释放出更多的物理内存供系统使用。

    2. 很多发行版(如ubuntu)的休眠功能依赖于swap分区,当系统休眠的时候,会将内存中的数据保存到swap分区上,等下次系统启动的时候,再将数据加载到内存中,这样可以加快系统的启动速度,所以如果要使用休眠的功能,必须要配置swap分区,并且大小一定要大于等于物理内存

    3. 在某些情况下,物理内存有限,但又想运行耗内存的程序怎么办?这时可以通过配置足够的swap空间来达到目标,虽然慢一点,但至少可以运行。

    4. 虽然大部分情况下,物理内存都是够用的,但是总有一些意想不到的状况,比如某个进程需要的内存超过了预期,或者有进程存在内存泄漏等,当内存不够的时候,就会触发内核的OOM killer,根据OOM killer的配置,某些进程会被kill掉或者系统直接重启(默认情况是优先kill耗内存最多的那个进程),不过有了swap后,可以拿swap当内存用,虽然速度慢了点,但至少给了我们一个去debug、kill进程或者保存当前工作进度的机会。

    5. 如果看过Linux内存管理,就会知道系统会尽可能多的将空闲内存用于cache,以加快系统的I/O速度,所以如果能将不怎么常用的内存数据移动到swap上,就会有更多的物理内存用于cache,从而提高系统整体性能。

三. swap有什么缺点

    上面其实是介绍了swap的优点,那swap的缺点呢?swap是存放在磁盘上的,磁盘的速度和内存比较起来慢了好几个数量级,如果不停的读写swap,那么对系统的性能肯定有影响,尤其是当系统内存很吃紧的时候,读写swap空间发生的频率会很高,导致系统运行很慢,像死了一样,这个时候添加物理内存是唯一的解决办法。

四. 如何开启和关闭swap分区

1.查看当前系统是否已经启用分区

cat /proc/swaps  # 等价于 swapon -s

2.如果没有启用,则新建一个文件用于swap分区

dd if=/dev/zero of=/data/swap bs=512 count=8388616

注:此文件的大小是count的大小乘以bs大小,上面命令的大小是4294971392,即4GB

3.通过mkswap命令将上面新建出的文件做成swap分区

mkswap /data/swap

4.查看内核参数vm.swappiness中的数值是否为0,如果为0则根据实际需要调整成30或者60

cat /proc/sys/vm/swappiness   
sysctl -a | grep swappiness    
sysctl -w vm.swappiness=60

注:1.若想永久修改,则编辑/etc/sysctl.conf文件

    2.swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面

5.启用此交换分区的交换功能

swapon /data/swap   
echo "/data/swap swap swap defaults    0  0" >> /etc/fstab

6.如何关闭swap分区

swapoff /data/swap   
swapoff -a >/dev/null

五.关于swap分区大小的建议(非绝对)

下面是详细的不同物理内存情况下的swap分区大小的建议:

物理内存(MB)  不需要休眠  需要休眠  最大值
 256          256       512     512
 512          512       1024    1024
 1024         1024      2048    2048

物理内存(GB)  不需要休眠  需要休眠  最大值
  1          1         2        2
  2          1         3        4
  3          2         5        6
  4          2         6        8
  5          2         7        10
  6          2         8        12
  8          3         11       16
  12         3         15       24
  16         4         20       32
  24         5         29       48
  32         6         38       64
  64         8         72       128
  128        11       139       256


相关链接:

https://segmentfault.com/a/1190000008125116

https://yq.aliyun.com/articles/52098

上一篇:python编码规范

下一篇:理解Python中的if __name__ == '__main__':