Linux交換分區(qū)要點匯總
關注「開源Linux」,選擇“設為星標” 回復「學習」,有我為您特別篩選的學習資料~
目錄

前言
Linux 將物理內(nèi)存分為內(nèi)存段,叫做頁面。交換是指內(nèi)存頁面被復制到預先設定好的硬盤空間(叫做交換空間)的過程,目的是釋放這份內(nèi)存頁面。物理內(nèi)存和交換空間的總大小是可用的虛擬內(nèi)存的總量。

一、什么是 Swap
理解 Swap 在 Linux 操作系統(tǒng)上面的作用!
我們知道 swap space 是磁盤上的一塊區(qū)域,可以是一個分區(qū),也可以是一個文件,或者以它們的組合方式出現(xiàn)。簡單點說,當系統(tǒng)物理內(nèi)存吃緊時,Linux 系統(tǒng)會將內(nèi)存中不常訪問的數(shù)據(jù)保存到 swap 上,這樣系統(tǒng)就有更多的物理內(nèi)存為其他進程服務,而當系統(tǒng)需要訪問 swap 上存儲的內(nèi)容時,系統(tǒng)會再將 swap 上的數(shù)據(jù)加載到內(nèi)存中,這就是我們常說的 swap out 和 swap in 了。

二、Swap 的優(yōu)缺點
我們應當在適合的時候,靈活的使用 Swap 分區(qū)!
[1] 主要優(yōu)點如下所示
對于一些大型的應用程序(如LibreOffice等),在啟動的過程中會使用大量的內(nèi)存,但這些內(nèi)存很多時候只是在啟動的時候用一下,后面的運行過程中很少再用到這些內(nèi)存。有了 swap 之后,系統(tǒng)就可以將這部分不這么使用的內(nèi)存數(shù)據(jù)保存到 swap 上去,從而釋放出更多的物理內(nèi)存供系統(tǒng)使用。
很多發(fā)行版(如ubuntu)的休眠功能依賴于 swap 分區(qū),當系統(tǒng)休眠的時候,會將內(nèi)存中的數(shù)據(jù)保存到 swap 分區(qū)上,等下次系統(tǒng)啟動的時候,再將數(shù)據(jù)加載到內(nèi)存中,這樣可以加快系統(tǒng)的啟動速度,所以如果要使用休眠的功能,必須要配置 swap 分區(qū),并且大小一定要大于等于物理內(nèi)存在某些情況下,物理內(nèi)存有限,但又想運行耗內(nèi)存的程序怎么辦?這時可以通過配置足夠的 swap 空間來達到目標,雖然慢一點,但至少可以運行。
[2] 主要缺點如下所示
swap 是存放在磁盤上的,磁盤的速度和內(nèi)存比較起來慢了好幾個數(shù)量級,如果不停的讀寫 swap,那么對系統(tǒng)的性能肯定有影響,尤其是當系統(tǒng)內(nèi)存很吃緊的時候,讀寫 swap 空間發(fā)生的頻率會很高,導致系統(tǒng)運行很慢,像死了一樣,這個時候添加物理內(nèi)存是唯一的解決辦法。
三、Swap 的大小配置
介紹了日常使用時,配置多大的 Swap 比較合適!
既然配置 swap 對桌面系統(tǒng)有幫助,那么配置多少大小的 swap 比較合適呢?下面是 ubuntu 給出的建議:
當物理內(nèi)存小于
1G且不需要休眠時,設置和內(nèi)存同樣大小的swap空間即可;當需要休眠時,建議配置兩倍物理內(nèi)存的大小,但最大值不要超過兩倍內(nèi)存大小。當物理內(nèi)存大于
1G且不需要休眠時,建議大小為sqrt(RAM),其中RAM為物理內(nèi)存大??;當需要休眠時,建議大小是RAM+round(sqrt(RAM)),但最大值不要超過兩倍內(nèi)存大小。如果兩倍物理內(nèi)存大小的
swap空間還不夠用,建議增加內(nèi)存而不是增加swap。
下面是詳細的不同物理內(nèi)存情況下的建議,第一列是物理內(nèi)存的大小,第二列和第三列是不需要和需要休眠兩種情況下推薦的大小,第四列是不要超過的最大值。
物理內(nèi)存(MB) 不需要休眠 需要休眠 最大值
256 256 512 512
512 512 1024 1024
1024 1024 2048 2048
物理內(nèi)存(GB) 不需要休眠 需要休眠 最大值
1 1 2 2
2 1 3 4
3 2 5 6
4 2 6 8
5 2 7 10
6 2 8 12
8 3 11 16
12 3 15 24
16 4 20 32
24 5 29 48
32 6 38 64
64 8 72 128
128 11 139 256
四、Swap 常用操作
介紹了日常使用時,增刪的相關操作!
當我們確定好配置多大的 swap 空間后,具體應該怎么配置呢?Linux 下有兩種類型的 swap 空間,swap 分區(qū)和 swap 文件,它們有各自的特點:
swap 分區(qū):
swap 分區(qū)上面由于沒有文件系統(tǒng),所以相當于內(nèi)核直接訪問連續(xù)的磁盤空間,效率相對要高點,但由于 swap 分區(qū)一般安裝系統(tǒng)時就分配好了,后期要縮減空間和擴容都很不方便。
swap 文件:
swap 文件放在指定分區(qū)的文件系統(tǒng)里面,所以有可能受文件系統(tǒng)性能的影響,但據(jù)說2.6版本以后的內(nèi)核可以直接訪問swap文件對應的物理磁盤地址,相當于跳過了文件系統(tǒng)直接訪問磁盤。不過如果 swap 文件在磁盤上的物理位置不連續(xù)時,還是會對性能產(chǎn)生不利影響,但其優(yōu)點就是靈活,隨時可以增加和移除swap文件。
交換分區(qū)在物理內(nèi)存被填滿時用來保持內(nèi)存中的內(nèi)容。當 RAM 被耗盡,Linux 會將內(nèi)存中不活動的頁移動到交換空間中,從而空出內(nèi)存給系統(tǒng)使用。雖然如此,但交換空間不應被認為是物理內(nèi)存的替代品。大多數(shù)情況下,建議交換內(nèi)存的大小為物理內(nèi)存的 1 到 2 倍。也就是說如果你有 8GB 內(nèi)存, 那么交換空間大小應該介于 8-16GB。
[1] 查看系統(tǒng)中已經(jīng)配置的 swap 分配情況
# Filename: 類型是分區(qū)則顯示分區(qū)路徑,類型是文件則顯示文件路徑
# Type: partition代表是一個swap分區(qū),file代表是一個swap文件
# Size: 顯示swap的大小,默認單位是KB
# Used: 已經(jīng)被使用的大小,0表示還沒有被使用到
# Priority: 優(yōu)先級高將會被優(yōu)先使用,同等優(yōu)先級將會均勻使用(設置: swapon -p)
escape@app:~$ swapon -s
Filename Type Size Used Priority
/data/.swapfile file 10485756 6534248 -1
/data1/.swapfile file 10485756 3246088 -2
# 指定交換區(qū)的優(yōu)先順序
$ sudo swapon -p xxx
# 啟動某個交換swap
$ sudo swapon /dev/sda2
# 啟動所有系統(tǒng)配置的swap
$ sudo swapon -a
# 關閉某個交換swap
$ sudo swapoff /dev/sda2
# 關閉所有系統(tǒng)配置的swap
$ sduo swapoff -a
[2] 固定使永久生效
# 寫入磁盤配置文件
# <file system> <mount point> <type> <options> <dump> <pass>
$ cat /etc/fstab
/data1/.swapfile none swap sw 0 0
/data1/.swapfile2 none swap sw 0 0
[3] 查看系統(tǒng)中 swap in/out 的情況
# 并不是swap空間占用多就一定性能下降
# 真正影響性能是swap in和out的頻率,頻率越高對系統(tǒng)的性能影響越大
escape@app:~$ vmstat 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 1 9795592 2037192 282460 14034552 8 8 51 46 0 0 10 1 88 0 0
3 0 9795592 2025832 282472 14044688 0 0 68279 270 5416 6425 35 6 54 5 0
[4] 查看系統(tǒng)內(nèi)存使用情況
# 查看系統(tǒng)內(nèi)存的實際使用參數(shù)
$ free
總計物理內(nèi)存 已使用 可使用 共享內(nèi)存 磁盤緩存的大小
total used free shared buff/cache available
Mem: 32887700 15661764 13404800 585080 3821136 15865296
交換分區(qū)
Swap: 31457272 10461216 20996056
五、配置 Swap 緩存
操作系統(tǒng)使用 ZFS 文件系統(tǒng)
[1] 添加 swap 分區(qū)
# 1.創(chuàng)建邏輯卷
$ sudo zpool create -V 2G rpool/swap
# 2.使用mkswap命令來格式化交換分區(qū)
$ sudo mkswap -f rpool/swap
# 3.激活新建的交換分區(qū)
swapon -a /dev/zvol/dsk/rpool/swap2
# 4.永久生效
$ sudo vi /etc/fstab
/dev/zvol/dsk/rpool/swap2 swap swap default 0 0
[2] 取消 swap 配置
# 1.關閉某個交換swap
$ sudo swapoff /dev/zvol/dsk/rpool/swap2
# 2.刪除邏輯卷
$ sudo zpool destroy rpool/swap
# 3.修改/etc/fstab
將添加的Swap記錄一并刪除,否則下次重啟后,系統(tǒng)又會重新掛載相應的swap分區(qū)和文件
操作系統(tǒng)使用其他文件系統(tǒng)
[1] 添加 swap 分區(qū)
# 1.新加的硬盤
$ sudo fdisk -l /dev/sdb
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 4194303 4192256 2G 83 Linux
# 2.使用mkswap命令來格式化交換分區(qū)
$ sudo mkswap /dev/sdb1
Setting up swapspace version 1, size = 2 GiB (2146430976 bytes)
no label, UUID=d69621de-618a-4bea-9a96-b8e8b0d0ea40
# 3.激活新建的交換分區(qū)
$ sudo swapon /dev/sdb1
# 4.swap分區(qū)已經(jīng)被加入到系統(tǒng)中
$ swapon -s
Filename Type Size Used Priority
/dev/sdb1 partition 2096124 0 -1
# 5.永久生效
$ sudo vi /etc/fstab
/dev/sda3 swap swap default 0 0
[2] 添加 swap 文件
# 1.創(chuàng)建swap文件
$ sudo fallocate -l 512m /data/512M.swap
$ sudo fallocate -l 20G /data/20G.swap
# 2.修改文件的權限,避免其他用戶對這個文件進行誤操作
$ sudo chmod 600 /data/512M.swap
$ sudo chmod 600 /data/20G.swap
# 3.格式化為swap文件
$ sudo mkswap /data/512M.swap
$ sudo mkswap /data/20G.swap
# 4.啟用交換空間
$ sudo swapon /data/512M.swap
$ sudo swapon /data/20G.swap
# 5.查看swap狀態(tài)
$ swapon -s
Filename Type Size Used Priority
/data/512M.swap file 524284 0 -1
/data/20G.swap file 20971360 0 -2
# 6.永久生效
$ sudo vi /etc/fstab
/dev/sda3 swap swap default 0 0
[3] 取消 swap 配置
# 1.停掉所有系統(tǒng)正在使用的swap
$ sudo swapoff /data/20G.swap
# 2.查看swap狀態(tài)
$ swapon -s
Filename Type Size Used Priority
/data/512M.swap file 524284 0 -1
# 3.修改/etc/fstab
將添加的Swap記錄一并刪除,否則下次重啟后,系統(tǒng)又會重新掛載相應的swap分區(qū)和文件
六、優(yōu)化 swap 性能
使用和配置 Swap 的相關經(jīng)驗總結(jié)!
怎么配置swap 可以讓它的性能更好呢?
盡量使用
swap分區(qū),相對于swap文件來說,分區(qū)肯定是連續(xù)的物理磁盤空間,而swap文件有可能不是。將 swap 分區(qū)和系統(tǒng)所在的分區(qū)放在不同的磁盤上,這樣就不會和系統(tǒng)盤搶同一個磁盤的
I/O帶寬。如果有多塊磁盤的話,可以在每個盤上創(chuàng)建一個 swap 分區(qū),并且將它們的優(yōu)先級設置的一樣,這樣內(nèi)核就會平均的訪問這些
swap分區(qū),性能相當于原來的 N 倍(這里 N 是磁盤的數(shù)量)。
不過話又說回來了,如果頻繁的訪問 swap 的話,怎么優(yōu)化 swap 都沒用,跟內(nèi)存比還是低幾個數(shù)量級,性能還是下降的厲害,如果不頻繁訪問 swap 的話,優(yōu)化 swap 又有啥意義呢?所以其實優(yōu)化 swap 性能的實際意義不大,這里了解一下就好。
七、配置 swappiness 特性
配置希望盡量減少 Swap 空間的使用!
有時我們桌面環(huán)境確實配置了比較充裕的內(nèi)存,并且也配置了 swap 空間,這個時候就希望盡量減少 swap 空間的使用,避免對系統(tǒng)性能造成影響。Linux 早就幫我們考慮到這種情況了,在 2.6 內(nèi)核中,增加了一個叫做 swappiness 的參數(shù),用于配置需要將內(nèi)存中不常用的數(shù)據(jù)移到 swap 中去的緊迫程度。這個參數(shù)的取值范圍是 0~100,0 告訴內(nèi)核盡可能的不要將內(nèi)存數(shù)據(jù)移到 swap 中,也即只有在迫不得已的情況下才這么做,而 100 告訴內(nèi)核只要有可能,盡量的將內(nèi)存中不常訪問的數(shù)據(jù)移到 swap 中。
Ubuntu 的 desktop 和 server 的默認配置都是 60(可能會隨著版本變化),對于桌面環(huán)境來說,界面的響應速度直接關系到系統(tǒng)的流暢程度,如果內(nèi)存比較充裕的話,可以將這個值設置的小一點,這樣就盡可能的把數(shù)據(jù)留在內(nèi)存中,從而喚醒后臺界面程序會更快一些,Ubuntu desktop 建議將該值設置為 10,當然大家可以根據(jù) swap 空間的實際使用情況,任意調(diào)整這個參數(shù),直到自己滿意的水平為止。對于服務器來說,主要性能衡量標準是整體的處理能力,而不是具體某一次的響應速度,能把更多的內(nèi)存用來做 I/O cache 可能效果更好,所以 Ubuntu server 建議保持 60 的默認值。
# 修改當前系統(tǒng)中swappiness的值
$ sudo sysctl vm.swappiness=10
vm.swappiness = 10
# 查看當前系統(tǒng)中swappiness的值
$ sudo cat /proc/sys/vm/swappiness
10
# 生效配置 => /etc/sysctl.conf
$ sudo /sbin/sysctl -p
# 修改當前系統(tǒng)中vfs_cache_pressure的值
$ sudo sysctl vm.vfs_cache_pressure=50
vm.vfs_cache_pressure=50
# 查看當前系統(tǒng)中vfs_cache_pressure的值
$ sudo cat /proc/sys/vm/vfs_cache_pressure
50
# 生效配置 => /etc/sysctl.conf
$ sudo /sbin/sysctl -p
上面通過 sysctl 修改的 swappiness 值在系統(tǒng)重啟后會失效,要想重啟后繼續(xù)生效,需要修改配置文件 /etc/sysctl.conf,將下面這行修改成 10,如果文件中找不到這行的話,在文件末位加上這行就可以了。
vm.swappiness=10
作者: Escape
鏈接: https://escapelife.github.io/posts/df59491b.html
往期推薦
關注「開源Linux」加星標,提升IT技能
點個在看少個 bug ??

