CentOS 7官方指导:系统增加swap

2020年10月30日 由 admin

swap是位于磁盘上的特殊文件(或分区),属于“虚拟内存”的一部分。通俗点就是内存的备胎,内存充足的情况下,基本上没swap什么事(和设置有关);内存不够用时系统便将内存中的部分数据腾挪到swap中,为正在运行的程序腾出内存。

使用swap能让系统运行更多或更大型的程序,但由于swap的读写速度远逊于内存,频繁使用swap可能让系统和程序有延迟卡顿。

本文介绍CentOS 7系统增加swap的操作步骤,该方法同样适用于CentOS 8系统。

大内存计算机swap有必要吗?

对于内存较小的计算机,swap是非常有必要的。swap的存在能让执行吃内存程序变得可能,执行慢总比不能运行或者奔溃强。但现代计算机动辄8G以上的内存,如非运行大型或专业软件,内存足够日常使用。这种情况下,swap有存在的必要吗?

答案还是看使用场景。个人电脑上运行桌面版Linux并且开启休眠功能,则应该划分不小于内存的swap分区;如果是内存足够大且常年不关机的服务器,没有swap也毫无问题。

ssd硬盘要不要设置swap?

之前的ssd硬盘有读写寿命的问题,因此不建议将swap文件或分区放到ssd硬盘上。

目前的ssd硬盘技术已经升级换代更智能,如果有swap需求,放在ssd硬盘上也没什么问题。

swap设置多大好?

  1. 如果开启休眠功能,
    1. 应该划分swap分区,并且
    2. 分区大小不能小于内存,建议的值是“内存大小+2G”。
  2. 不用休眠功能的服务器,
    1. swap可以为文件,一种确定swap大小的实用方法是:
      • 1G内存及以下,swap大小为内存的两倍;(512M,swap=1024M)
      • 2-4G内存,与内存同等大小;
      • 5-16G内存,swap可固定为4G;
      • 17-32G内存,8G swap;
      • 33 G及以上,固定为16G swap。

上述方法不绝对,有特殊需求可酌情增减swap大小。

怎样增加swap?

安装操作系统时候可以分区(单独挂载点)形式指定swap,也可以在系统安装完成后动态添加和删除。

查看swap

free命令可以查看系统活动的swap信息,例如:

$ free -m
# 输出如下
#               total        used        free      shared  buff/cache   available
# Mem:           7976        4979         328         124        2669        2703
# Swap:             0           0           0

第二行是swap信息,可以看到没有活动的swap。

也可以用swapon命令查看活动的swap,例如:

$ swapon -s
# 没有swap信息,所以无输出
# 有swap的输出为
# Filename              Type        Size    Used    Priority
# /swap                                     file    2097148 281052  -2

增加swap

假设我们打算运行一个非常占用内存的程序,8G物理内存不够,便可借助swap增加系统可用的虚拟内存。操作方法如下:

  • 选定或创建一个作为swap的文件(也可以用分区),常用创建指定大小文件的命令有fallocatedd。例如创建一个8G大小的文件(1G,也就是1024M是我的配置):
# fallocate创建 
sudo fallocate -l 1024M /swap 
# dd创建 
sudo dd bs=1M count=1024 if=/dev/zero of=/swap 

由于dd有复制的过程执行较慢,实践中建议用fallocate

  • swap文件会存放内存中的数据,出于安全考虑应限制其它用户的访问:sudo chmod 0600 /swap;
  • 将文件格式化为swap文件:sudo mkswap /swap
  • 启用该swap文件:
    1. 启用sudo swapon /swap
    2. 卸载 如果不想使用swap,可用swapoff命令卸载:sudo swapoff /swap
  • 如果希望系统启动后自动加载swap文件,在/etc/fstab文件增加一行:
    • /etc/fstab
    • /swap swap swap sw 0 0

增加swap后,可用swapon -sfree -m命令查看swap信息

swap相关设置

和swap最直接相关,也是影响系统性能的一个设置参数便是vm.swappiness。其值是0-100的整数,指示内存用掉百分之多少时开始使用swap。100表示尽可能使用swap,0则表示只有物理内存不够时才用上swap备胎。对于服务器,建议10-30之间。

  • 设置和更改swappiness的命令是:sudo sysctl vm.swappiness=10
  • 该命令只对当前系统有效,系统重启后又恢复默认值。
  • 查看。利用cat /proc/sys/vm/swappiness来查看当前的%,我的aliyu默认给的是0
  • 如何取得一个最优化的swappiness?更加详细的请看这边 《Linux虚拟内存(swap)调优篇-“swappiness”,“vm.dirty_background_ratio”和“vm.dirty_ratio”》
    • 假设wappiness参数的默认设置为10
    • 服务器内存在使用到100-10=90%的时候,就开始出现有交换分区的使用
    • 按照服务器内存为512M,那么90%的量就是461M,
    • Vol=461M是极限情况下需要按照硬盘读写速度来暂存和交换page最大空间,
    • SSD的W/R速度是B=500M/s那么就需要461×2/500,大概1.85秒才能完成换出换进整个Page,好在大部分时间只需要20~30M的单向调用,历时50ms, 慢也就是1/20秒。
    • 如果要把这个时间缩短到1/10到0.185秒,即185ms
      • 让SSD读取升级到5G/s(USB3.1 Gen2,或者雷电3)
      • 每次调用全部Page的小于46M(小内存的32位系统很容易满足这个要求)
      • 把wappiness默认设置调低,从10%减到1%,物理内存还是512M,每次到99%时,才会调配swap分区,从统计学角度最大可能使用物理内存的同时又保证低频使用的page能不占用优质传输通道
    • 如果要把时间缩短到1/20到75ms,那就把wappiness设为10%
      • 90%的交换发生在物理内存中,总内存487M,
      • 当所需内存需要90%的内存时,swap将会誊写转存低频使用的page到SSD
    • 我的配置=10%,实际上,从上面的截图就知道:
      • 我的物理内存总共只有487M,无访问时占用是301M(这已经占了62%)
      • 这301M都是享用VIP的高速内存吞吐速度,刷新一次占用就从301升到325M甚至331,其中24~30M就是一次突发吞吐,大概就是6%
      • 十个突发吞吐就是大概60%,122%的需求,有22% 的冗余需要置换
      • 暂时放10%来观察系统的稳定度,以后再根据log来微调
  • 要想设置永久生效,在/etc/sysctl.conf中增加或更改对应的设置行:vm.swappiness = 10

参考

  1. https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-centos-7
  2. Linux查看硬盘信息方法总结