DigitalOcean:如何在CentOS中添加Swap

技术 8527 次围观 27 次吐槽

Swap

使用 DigitalOcean 有很长一段时间了,前几天在编译 PHP 的时候出现了进程被 killed 的状况,经过我的吐槽以及和别人交流后发现,是内存耗尽的缘故。其实是因为当时开着 MySQL 进程消耗了不少内存,后来觉得有必要手动添加一下 Swap(交换分区),这样以免以后再编译什么的时候进程被K 。
关于 Linux 中 Swap(交换分区),类似于 Windows 的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。
那么如何在 CentOS 中手动添加 Swap 呢?

1、检查 Swap 空间
在设置 Swap 文件之前,有必要先检查一下系统里有没有既存的 Swap 文件。
运行以下命令:

swapon -s

如果返回的信息概要是空的,则表示 Swap 文件不存在。

2、检查文件系统
在设置 Swap 文件之前,同样有必要检查一下文件系统,看看是否有足够的硬盘空间来设置 Swap 。运行以下命令:

df -hal

检查返回的信息,还剩余足够的硬盘空间即可。

3、创建并允许 Swap 文件
下面使用 dd 命令来创建 Swap 文件。

dd if=/dev/zero of=/tmp/swapfile bs=1024 count=1024k

参数解读:
if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
bs=bytes:同时设置读入/输出的块大小为bytes个字节
count=blocks:仅拷贝blocks个块,块大小等于bs指定的字节数。

4、格式化并激活 Swap 文件
上面已经创建好 Swap 文件,还需要格式化后才能使用。运行命令:

mkswap /tmp/swapfile

激活 Swap ,运行命令:

swapon /tmp/swapfile

以上步骤做完,再次运行命令:

swapon -s

你会发现返回的信息概要:

Filename                    Type        Size    Used    Priority
/tmp/swapfile               file        524284    0     -1

如果要机器重启的时候自动挂载 Swap ,那么还需要修改 fstab 配置。
用 vim 打开 /etc/fstab 文件,在其最后添加如下一行:

/tmp/swapfile           swap                    swap    defaults        0 0

最后,赋予 Swap 文件适当的权限:

chown root:root /tmp/swapfile 
chmod 600 /tmp/swapfile

同时,我们还可以修改 Linux Swap 空间的 swappiness ,降低对硬盘的缓存。
Linux 会使用硬盘的一部分做为 Swap 分区,用来进行进程调度–进程是正在运行的程序–把当前不用的进程调成‘等待(standby)’,甚至‘睡眠(sleep)’,一旦要用,再调成‘活动(active)’,睡眠的进程就会在 Swap 分区,把内存空出来让给‘活动’的进程。
如果内存够大,应当告诉 Linux 不必太多的使用 Swap 分区,可以通过修改 swappiness 的参数来设置。swappiness=0 的时候表示最大限度使用物理内存,然后才是 Swap 空间,swappiness=100 的时候表示积极的使用 Swap 分区,并且把内存上的数据及时的搬运到 Swap 空间里面。
在 CentOS 中,swappiness 的默认值是60。
通过以下命令可以看到:

cat /proc/sys/vm/swappiness

返回值60

我们可以调整 swappiness 的值到一个合适的参数,从而达到最优化使用 Swap 的目的。这里我们将其设为10。
使用 sysctl 命令:

sysctl vm.swappiness=10

但是这只是临时性的修改,在你重启系统后会恢复默认的60,要永久设置,还需要在 vim 中修改sysctl.conf:

vi /etc/sysctl.conf

在这个文档的最后加上这样一行:

# Search for the vm.swappiness setting.  Uncomment and change it as necessary.
vm.swappiness=10

输入:x,保存退出 vim 。

这样一来,Swap 分区重启后都会生效了。

参考链接:
https://www.digitalocean.com/community/articles/how-to-add-swap-on-centos-6

转载请注明:秋水逸冰 » DigitalOcean:如何在CentOS中添加Swap

发表评论
取消评论
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
表情

已有评论 (27)

  1. 执行了swapon /tmp/swapfile 但是显示swapon: /tmp/swapfile: insecure permissions 0644, 0600 suggested. swapon: /tmp/swapfile: swapon failed: Invalid argument 要如何解决? 之前我是按照您的方法成功了,但是重启后就发现无法挂载了。
    fyleis7个月前 (2017-03-26)回复
    • 那么在执行这一步操作之前,先改变文件权限为 600 chmod 600 /tmp/swapfile
      秋水逸冰7个月前 (2017-03-26)回复
      • 谢谢博主解惑
        fyleis7个月前 (2017-03-28)回复
  2. 升级内核会不会对现有的软件有什么影响 比如lnmp和ss这些
    xiaoshangmin1年前 (2016-05-30)回复
  3. 其实关于Linux的内存,一直很想请教一下,它的缓存占用(cache)随着系统使用时间的延长会越来越大,而且貌似不会自动释放,这是需要一个需要解决的问题吗?还是顺其自然? 我1G的内存就装了您的LAMP和一个WordPress,在升级php时竟然都出现内存不足的情况,会不会与缓存占用太大有关?
    弈兰2年前 (2016-02-12)回复
    • 你在升级 PHP 的时候并没有关掉 MySQL 吧。其实主要就是 MySQL 占内存大。
      秋水逸冰2年前 (2016-02-12)回复
      • 的确没关,当然也是没有swap的缘故。平时的话1G内存完全足够,但应对突发情况的话,swap还是很有用的。 顺便问一下,您有设置回复邮件提醒吗?我完全不知道您已经回复了我。
        弈兰2年前 (2016-02-16)回复
  4. 用 vim 打开 /etc/fstab 文件,在其最后添加如下一行: /swapfile swap swap defaults 0 0 请问这里前两项是不是顺序反了呀? 从fstab中默认的设置来看,第一项是设备名称,第二项是挂载点。是不是应该是改成 swap / swapfile swap defaults 0 0 呢? 谢谢
    auooo2年前 (2015-07-12)回复
  5. 博主我有一个问题。我的swap空间被占用了以后我发现当内存很空闲的时候这部分空间也不会被释放,我查了一下可以通过关闭再开启swap来解决,对于按照您这篇教程设置的swap来讲我是不是通过swapoff /swapfile然后再swapon /swapfile就可以了? 谢谢
    Rladmsrl2年前 (2015-07-02)回复
    • 没必要,系统会自己控制。 不要有强迫症觉得内存剩的越多越好。内存就是拿来用的。同理,swap也是。
      秋水逸冰2年前 (2015-07-04)回复
  6. 请问大大,我的VPS系统是CentOS 6.5 x64,按照教程对SS进行TCP优化设置后,运行 sysctl -p报错如下,请问是什么问题导致的: sysctl -p error: "s.file-max" is an unknown key net.core.rmem_max = 67108864 net.core.wmem_max = 67108864 net.core.netdev_max_backlog = 250000 net.core.somaxconn = 4096 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 0 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1200 net.ipv4.ip_local_port_range = 10000 65000 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_max_tw_buckets = 5000 error: "net.ipv4.tcp_fastopen" is an unknown key net.ipv4.tcp_rmem = 4096 87380 67108864 net.ipv4.tcp_wmem = 4096 65536 67108864 net.ipv4.tcp_mtu_probing = 1 net.ipv4.tcp_congestion_control = hybla
    月夜2年前 (2015-06-30)回复
    • net.ipv4.tcp_fastopen 不被支持。 这个功能需要在 Linux 内核为 3.7+ 才行。 CentOS 6.5 默认内核版本是 2.6.32
      秋水逸冰2年前 (2015-06-30)回复
      • 谢谢大大答疑,原来是这样,难怪看有的教程上说要CentOS 7.0的才能开启这个优化,或者自己升级内核。那我CentOS 6.5的不能开TCP优化,开锐速是不是一样的效果?
        月夜2年前 (2015-06-30)回复
        • 没错,锐速确实也是可以的。 但需要注意的是,Openvz虚拟的 vps 是不支持的。
          秋水逸冰2年前 (2015-06-30)回复
          • 好的,谢谢你,你人真好,多保重。
            月夜2年前 (2015-07-02)回复
  7. 博主你好 我按教程操作 向vultr VPS内添加了1.5G的swap区 但是无论内存占用多少 swap的使用率始终是0% 能麻烦帮看看吗?anoneko.com/p.php
    Shino2年前 (2015-05-24)回复
    • swap 就相当于虚拟内存,用不到说明你的内存够用,这是好事。
      秋水逸冰2年前 (2015-05-25)回复
  8. sfo1终于支持ipv6了
    pirlo3年前 (2015-02-17)回复
  9. 你好,我的网站也是do的洛杉矶机房,为啥我觉得我的网站访问起来很慢,而你的很快呀?基本的优化我也都做了, 可速度还是起不来。
    pirlo3年前 (2015-01-28)回复
    • Do 没有洛杉矶,只有旧金山。我这个是 13 年初就开的 Droplet ,同时网站做了静态缓存,以及七牛的 CDN。供参考。
      秋水逸冰3年前 (2015-01-28)回复
      • 额,我用的是super cache做的静态化,不过我的cdn是用的cdn.net,因为我的是英文站。
        pirlo3年前 (2015-02-04)回复
  10. 请问如何设置SWAP的大小?
    Tonly3年前 (2014-11-23)回复
  11. 我按照步骤来了发现有SWAP,但是没有在使用。。。好忧伤
    地球人3年前 (2014-09-05)回复
    • 执行命令:free -m 就能看到到底有没有 swap 了。
      秋水逸冰3年前 (2014-09-05)回复
  12. 这篇文章对我有帮助,直接把链接放到我博客里面了。
    腾飞软件4年前 (2014-05-04)回复