SWAP內存交換分區對你們來講是一個常常被忽視的細節,若是你們對SWAP配置不是很熟悉能夠參考文章內提到的Red Hat SWAP SPACE最佳實踐配置連接。本文主要分享SWAP的基礎知識和優化建議,以及如何使用ansible優雅的關閉和增長SWAP交換分區等實踐心得。html
2020年04月27日 - 初稿linux
閱讀原文 - wsgzao.github.io/post/swap/ios
Red Hat官方給出的配置建議已經很詳細了,我再也不作多餘介紹git
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.github
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.shell
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.數據庫
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.vim
Note that distributing swap space over multiple storage devices also improves swap space performance, particularly on systems with fast drives, controllers, and interfaces.api
access.redhat.com/documentati…
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 空間會累加)