SWAP常见问题分析和性能调优配置实践小结

前言

SWAP内存交换分区对大家来说是一个经常被忽视的细节,如果大家对SWAP配置不是很熟悉可以参考文章内提到的Red Hat SWAP SPACE最佳实践配置链接。本文主要分享SWAP的基础知识和优化建议,以及如何使用ansible优雅的关闭和增加SWAP交换分区等实践心得。

更新历史

2020年04月27日 - 初稿

阅读原文 - https://wsgzao.github.io/post/swap/


Red Hat SWAP SPACE

Red Hat官方给出的配置建议已经很详细了,我不再做多余介绍

Swap space in Linux is used when the amount of physical memory (RAM) is full. If the system needs more memory resources and the RAM is full, inactive pages in memory are moved to the swap space. While swap space can help machines with a small amount of RAM, it should not be considered a replacement for more RAM. Swap space is located on hard drives, which have a slower access time than physical memory. Swap space can be a dedicated swap partition (recommended), a swap file, or a combination of swap partitions and swap files. Note that Btrfs does not support swap space.

In years past, the recommended amount of swap space increased linearly with the amount of RAM in the system. However, modern systems often include hundreds of gigabytes of RAM. As a consequence, recommended swap space is considered a function of system memory workload, not system memory.

m Swap Space” illustrates the recommended size of a swap partition depending on the amount of RAM in your system and whether you want sufficient memory for your system to hibernate. The recommended swap partition size is established automatically during installation. To allow for hibernation, however, you need to edit the swap space in the custom partitioning stage.

Recommendations in Table 15.1, “Recommended System Swap Space” are especially important on systems with low memory (1 GB and less). Failure to allocate sufficient swap space on these systems can cause issues such as instability or even render the installed system unbootable.

[图片上传失败...(image-2b499e-1587895336707)]

At the border between each range listed in Table 15.1, “Recommended System Swap Space”, for example a system with 2 GB, 8 GB, or 64 GB of system RAM, discretion can be exercised with regard to chosen swap space and hibernation support. If your system resources allow for it, increasing the swap space may lead to better performance. A swap space of at least 100 GB is recommended for systems with over 140 logical processors or over 3 TB of RAM.

Note that distributing swap space over multiple storage devices also improves swap space performance, particularly on systems with fast drives, controllers, and interfaces.

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/storage_administration_guide/ch-swapspace

SWAP预备知识

什么是swap

swap当我们指的名词的时候,它可以是一个分区,也可以是一个文件,是操作系统中一个存放从内存中置换出的数据的地方。
当我们指的是一个动词时候,代表的是从物理内存交换数据到swap分区这个动作。

为什么会swap

  1. 当物理内存不够用时候,会根据特定的算法,把一部分内存交换到swap分区(此时还会伴随着高IO)。但是并不是所有的内存都可以被交换到swap分区。
  2. kswapd进程周期性对内存进行检查,如果发现高于水位线,则触发swap,此举是为了不让系统剩余内存很少,防止出现突然的大内存申请。这块暂不深入讲解,后续再补充。

swap的到底是什么

首先我们要知道,内存管理将内存分为active和inactive,进程用户空间使用的映射包括了匿名映射(anon)和文件映射(file)。所有一共有active anon,inactive anon,active file,inactive file。对于文件映射,由于本身是磁盘空间中的文件,所有它不会被swap,当需要释放时候,脏数据直接写回磁盘,其他数据直接释放即可。内存交换到swap,肯定是交换不活跃的数据,所有,inactive anon是最主要的被交换的内存。那么对于操作系统来说,当我需要回收内存时候,你说它是针对文件映射好,还是针对匿名映射好,这就涉及到了一个参数:swapiness

swapiness

swapiness是设置内存回收时候,更倾向于回收文件映射还是匿名映射,在/proc/sys/vm/swappiness设置值。对于swapiness=100,那么两者之间的权重是一致的,值越小,越倾向于回收文件映射,不过如果达到系统高水位线,还是会swap,除非直接使用swapoff -a等手段关闭系统swap。

swap的好坏

swap的好处是当内存不足时候,可以将一部分交换出去,不会触发oom-killer。跑得慢总比不能跑好。
swap的坏处是交换时候,会触发高IO,同时会降低系统的性能。对于我们隔离做的不好的时候,会影响到其他应用的性能。

swap查看方法

一个工具往往具有多种用途,但是本文只说明针对swap问题

工具名称 使用姿势 采集指标来源
free free -h /proc/meminfo
top 按f,选择swap /proc/$pid/smaps
vmstat vmstat /proc/meminfo
iotop iotop
iostat iostat -xdm
pidstat pidstat -d 1 /proc/$pid/io
# 通过此命令查看内存被哪些进程占用(单位是MByte)
for i in `cd /proc;ls | grep "^[0-9]" | awk ' $0 >100'` ;do awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps ;done 2>&1 | sort -k2nr | head

3131 102.676M
3127 94.4414M
3136 69.9648M
3129 61.1445M
3097 50.7695M
3086 47.0078M
3119 46.4102M
3106 42.4648M
3094 37.5547M
3092 36.8398M

# 注:以上结果输出PID与内存占用大小,通过PID可以找到对应进程

常见的swap优化思路

以K8s为代表的容器编排已经给出了比较简单粗暴的分类

  1. 有状态(Stateful)
  2. 无状态(Stateless)

针对有状态的服务比如Database数据库,Cache缓存等,为了减少核心服务出现Out of Memory(OOM)的情况,合理的使用swap并做好监控是非常有必要的。

针对无状态的服务比如K8s,ElasticSearch等,禁用swap的核心原因都是出于性能的考虑,但也需要注意配置内存的限制以及告警策略

Swap Off - why is it necessary?

Set up Elasticsearch » Important System Configuration » Disable swapping

swap对性能的影响

这是显而易见的,但是还是有必要说的更清楚一点:内存交换 到磁盘对服务器性能来说是 致命 的。想想看:一个内存操作必须能够被快速执行。

如果内存交换到磁盘上,一个 100 微秒的操作可能变成 10 毫秒。再想想那么多 10 微秒的操作时延累加起来。不难看出 swap 对于性能是多么可怕。

最好的办法就是在你的操作系统中完全禁用 swap。这样可以暂时禁用:

sudo swapoff -a

如果需要永久禁用,你可能需要修改 /etc/fstab 文件,这要参考你的操作系统相关文档。

如果你并不打算完全禁用 swap,也可以选择降低 swappiness 的值。 这个值决定操作系统交换内存的频率。 这可以预防正常情况下发生交换,但仍允许操作系统在紧急情况下发生交换。

对于大部分Linux操作系统,可以在 sysctl 中这样配置:

vm.swappiness = 1

swappiness 设置为 1 比设置为 0 要好,因为在一些内核版本 swappiness 设置为 0 会触发系统 OOM-killer(注:Linux 内核的 Out of Memory(OOM)killer 机制)。

vm.swappiness优化

swappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。linux的基本默认设置为60,具体如下:

cat /proc/sys/vm/swappiness
60

也就是说,你的内存在使用到100-60=40%的时候,就开始出现有交换分区的使用。大家知道,内存的速度会比磁盘快很多,这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。

临时调整swap,这只是临时调整的方法,重启后会回到默认设置的

# 配置
sysctl vm.swappiness=1
# 查看
cat /proc/sys/vm/swappiness
1

永久生效swap配置

# 要想永久调整的话,需要将在/etc/sysctl.conf修改,加上:
vim /etc/sysctl.conf
vm.swappiness=1
# 刷新生效
sysctl -p

关闭和开启swap

使用ansible实现关闭swap,config_swap_off.yml

---
- hosts: all
  become: yes
  gather_facts: no

  tasks:
    - name: Disable SWAP in fstab
      replace:
        path: /etc/fstab
        regexp: '^(\s*)([^#\n]+\s+)(\w+\s+)swap(\s+.*)$'
        replace: '#\1\2\3swap\4'
        backup: yes
    - name: Disable SWAP
      shell: |
        swapoff -a


使用ansible实现开启swap,config_swap_on.yml

---
- hosts: all
  become: yes
  gather_facts: no

  tasks:
    - name: Reenable SWAP in fstab
      replace:
        path: /etc/fstab
        regexp: '^#(\s*)([^#\n]+\s+)(\w+\s+)swap(\s+.*)$'
        replace: '\1\2\3swap\4'
    - name: Enable SWAP
      shell: |
        swapon -a

增加swap

制作 swap 文件

# 创建一个1G的文件作为交换分区使用
dd if=/dev/zero of=/opt/swapfile bs=1M count=1000

# 格式化成swap分区
mkswap /opt/swapfile

# 打开swap分区
swapon /opt/swapfile

# 在/etc/fstab中增加一条记录如下
/opt/swapfile    swap   swap defaults 0 0

制作 swap 分区

# 创建一个 swap 分区
fdisk /dev/sdb

# 新建一个分区
n
p
default
default
...
# 修改分区 id 为swap
t
82
# 写入分区表
w

# 同步内存和分区表信息
partprobe

# 格式化成 swap 分区
mkswap /dev/sdb1

# 打开 swap 分区
swapon /dev/sdb1

# 在/etc/fstab中增加一条记录如下
/opt/swapfile    swap   swap defaults 0 0

Tips: 如果本机已有2G swap 交换分区,又制作了一个8G 的 swap 分区文件, 那么在执行swapon命令之后, swap 空间将为10G(swap 空间会累加)

参考文章

Red Hat SWAP SPACE

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • SWAP/swappiness/kswapd原理,swap分区优先级的妙用 概述 本文讨论的swap基于Linux...
    xywzhen阅读 5,018评论 1 5
  • 目标:解决大量Log写入占用大量的File Cache,内容利用不充分导致swap 基本原则:尽量使用内存,减少s...
    明翼阅读 1,515评论 0 1
  • swap简介 swap是啥 首先,swap是硬盘上的一块空间。 其次,当内存没有多余空间的时候,可以将一部分数据交...
    齐晋阅读 2,644评论 1 2
  • 一、评估规模: 部署前要理解应用的需求: 理解并发性、使用模式、入出的负载 服务级别协议(SLAs):保证完全可以...
    逸章阅读 1,324评论 0 0
  • By default Redis does not run as a daemon. Use 'yes' if y...
    closefrien_d1c2阅读 568评论 0 1