SWAP内存交换分区对你们来讲是一个常常被忽视的细节,若是你们对SWAP配置不是很熟悉能够参考文章内提到的Red Hat SWAP SPACE最佳实践配置连接。本文主要分享SWAP的基础知识和优化建议,以及如何使用ansible优雅的关闭和增长SWAP交换分区等实践心得。html
2020年04月27日 - 初稿linux
阅读原文 - https://wsgzao.github.io/post...ios
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.git
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.github
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.shell
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.vim
https://access.redhat.com/doc...api
swap当咱们指的名词的时候,它能够是一个分区,也能够是一个文件,是操做系统中一个存放从内存中置换出的数据的地方。
当咱们指的是一个动词时候,表明的是从物理内存交换数据到swap分区这个动做。
首先咱们要知道,内存管理将内存分为active和inactive,进程用户空间使用的映射包括了匿名映射(anon)和文件映射(file)。全部一共有active anon,inactive anon,active file,inactive file。对于文件映射,因为自己是磁盘空间中的文件,全部它不会被swap,当须要释放时候,脏数据直接写回磁盘,其余数据直接释放便可。内存交换到swap,确定是交换不活跃的数据,全部,inactive anon是最主要的被交换的内存。那么对于操做系统来讲,当我须要回收内存时候,你说它是针对文件映射好,仍是针对匿名映射好,这就涉及到了一个参数:swapiness
swapiness是设置内存回收时候,更倾向于回收文件映射仍是匿名映射,在/proc/sys/vm/swappiness设置值。对于swapiness=100,那么二者之间的权重是一致的,值越小,越倾向于回收文件映射,不过若是达到系统高水位线,仍是会swap,除非直接使用swapoff -a等手段关闭系统swap。
swap的好处是当内存不足时候,能够将一部分交换出去,不会触发oom-killer。跑得慢总比不能跑好。
swap的坏处是交换时候,会触发高IO,同时会下降系统的性能。对于咱们隔离作的很差的时候,会影响到其余应用的性能。
一个工具每每具备多种用途,可是本文只说明针对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能够找到对应进程
以K8s为表明的容器编排已经给出了比较简单粗暴的分类
针对有状态的服务好比Database数据库,Cache缓存等,为了减小核心服务出现Out of Memory(OOM)的状况,合理的使用swap并作好监控是很是有必要的。
针对无状态的服务好比K8s,ElasticSearch等,禁用swap的核心缘由都是出于性能的考虑,但也须要注意配置内存的限制以及告警策略
Swap Off - why is it necessary?
Set up Elasticsearch » Important System Configuration » Disable swapping
这是显而易见的,可是仍是有必要说的更清楚一点:内存交换 到磁盘对服务器性能来讲是 致命 的。想一想看:一个内存操做必须可以被快速执行。
若是内存交换到磁盘上,一个 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 机制)。
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
使用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 文件
# 建立一个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 空间会累加)