浅谈swap

  之前有一次zabbix发出的swap报警,由于没有引发业务故障,故选择第二天进行处理。(一部分原因是睡着了,囧~)

  swap是干什么的?在Linux中,当物理内存耗尽时如果有新的内存请求,此时内存中不活跃的页,会被移到swap空间中。swap一般是磁盘分区时分出来的一小部分磁盘空间。显然这部分放在swap中的数据对应的业务,跟放在物理内存中相比,会造成体验的下降。但swap会在系统崩溃时提供安全机制,或者会在内存耗尽的情况下阻止操作系统kill掉进程。因为一旦swap也被耗尽了,就会触发OOM(Out Of Memory)killer机制,这个机制通过一系列复杂的判断,默认的话是杀掉占用内存最多的进程!在系统安装过程中,不选择swap会提示警告,可以忽略警告继续安装。但我们自己可控的生产环境还是建议设置适当大小swap来保证稳定性。不过现在一些云主机都舍去了swap,比如自己春节期间购买的良心云和小伙伴手里的套路云,swap大小都是0;而vultr上的则是正常swap。(国内搞技术的胆子就是大啊,笑)

  这里是red hat官方给出的swap大小设置建议:

  怎样查看当前系统的swap消耗情况呢,除了使用free -m,还可以通过vmstat查看实时状态:

vmstat 1

  其中参数1表示每秒刷新一次,SWAP那一列中,si表示从磁盘swap空间中回到内存的量,so表示目前swap中已经使用的量。较好的情况下我们希望这两个数保持为0:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 511020   2076 382240    0    0     0     0   28   32  0  0 100  0  0
 1  0      0 511020   2076 382240    0    0     0     0   35   29  0  0 100  0  0
 0  0      0 511020   2076 382240    0    0     0     0   26   33  0  0 100  0  0
 0  0      0 511020   2076 382240    0    0     0     0   40   34  0  0 100  0  0
 0  0      0 511020   2076 382240    0    0     0     0   38   35  0  0 100  0  0
 0  0      0 510988   2076 382240    0    0     0     0   25   25  0  0 100  0  0
 0  0      0 511020   2076 382240    0    0     0     0   58   53  0  0 100  0  0

  如果发现swap出现了异常占用,可以考虑通过关闭再开启swap的手段实现刷新:

swapoff -a && swapon -a

  有时候,我们发现就算是内存尚未完全耗尽,也有可能引发swap的使用,这取决于内核中的swappiness参数设置:

[root@localhost ~]# sysctl -a | grep swappiness
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
vm.swappiness = 30
[root@localhost ~]# 

  这里vm.swappiness = 30表示系统有30%的可能性使用swap。我们可以人为降低其概率,那么我们设置到多少合适呢?一般来讲,一项技术的指标衡量在不同的环境下不是绝对的。比如,使用了内存的部分缓存数据库如redis,如果这部分内存跑到了swap中,会带来很糟糕的体验,实际上这种情况下我们可以认为没有swap,直接触发OOM将其干掉反而是好事,毕竟现在都是集群高可用服务,用户不会感知到节点挂掉。但也一定不要降低到0,毕竟0的话会引发未知的不稳定情况,而且swap的存在毕竟是个缓冲,理论上给了我们进程被干掉的缓冲时间。

  比如,我们可以把它设置为10,适当降低发生swap的可能性:

[root@localhost ~]# echo "vm.swappiness = 10" >> /etc/sysctl.conf
[root@localhost ~]# sysctl -p
vm.swappiness = 10
[root@localhost ~]# cat  /proc/sys/vm/swappiness
10
[root@localhost ~]# 

  本文不推荐更改swap的大小,毕竟现在硬盘空间便宜,理论上保留swap对稳定性有一定的好处,而且,有些系统休眠机制也是要用到swap空间的。尤其作为生产环境,为了提升性能减少其使用概率是可以的,但一般不要减少其大小导致不稳定因素。


发表评论

评论列表,共 0 条评论

    暂无评论