Linux 交換分區(qū)要點(diǎn)匯總

來(lái)自:開(kāi)源Linux
鏈接: http://33h.co/wtmk6
目錄

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

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

二、Swap 的優(yōu)缺點(diǎn)
我們應(yīng)當(dāng)在適合的時(shí)候,靈活的使用 Swap 分區(qū)!
[1] 主要優(yōu)點(diǎn)如下所示
對(duì)于一些大型的應(yīng)用程序(如LibreOffice等),在啟動(dòng)的過(guò)程中會(huì)使用大量的內(nèi)存,但這些內(nèi)存很多時(shí)候只是在啟動(dòng)的時(shí)候用一下,后面的運(yùn)行過(guò)程中很少再用到這些內(nèi)存。有了 swap 之后,系統(tǒng)就可以將這部分不這么使用的內(nèi)存數(shù)據(jù)保存到 swap 上去,從而釋放出更多的物理內(nèi)存供系統(tǒng)使用。
很多發(fā)行版(如ubuntu)的休眠功能依賴于 swap 分區(qū),當(dāng)系統(tǒng)休眠的時(shí)候,會(huì)將內(nèi)存中的數(shù)據(jù)保存到 swap 分區(qū)上,等下次系統(tǒng)啟動(dòng)的時(shí)候,再將數(shù)據(jù)加載到內(nèi)存中,這樣可以加快系統(tǒng)的啟動(dòng)速度,所以如果要使用休眠的功能,必須要配置 swap 分區(qū),并且大小一定要大于等于物理內(nèi)存在某些情況下,物理內(nèi)存有限,但又想運(yùn)行耗內(nèi)存的程序怎么辦?這時(shí)可以通過(guò)配置足夠的 swap 空間來(lái)達(dá)到目標(biāo),雖然慢一點(diǎn),但至少可以運(yùn)行。
[2] 主要缺點(diǎn)如下所示
swap 是存放在磁盤上的,磁盤的速度和內(nèi)存比較起來(lái)慢了好幾個(gè)數(shù)量級(jí),如果不停的讀寫 swap,那么對(duì)系統(tǒng)的性能肯定有影響,尤其是當(dāng)系統(tǒng)內(nèi)存很吃緊的時(shí)候,讀寫 swap 空間發(fā)生的頻率會(huì)很高,導(dǎo)致系統(tǒng)運(yùn)行很慢,像死了一樣,這個(gè)時(shí)候添加物理內(nèi)存是唯一的解決辦法。
三、Swap 的大小配置
介紹了日常使用時(shí),配置多大的 Swap 比較合適!
既然配置 swap 對(duì)桌面系統(tǒng)有幫助,那么配置多少大小的 swap 比較合適呢?下面是 ubuntu 給出的建議:
當(dāng)物理內(nèi)存小于
1G且不需要休眠時(shí),設(shè)置和內(nèi)存同樣大小的swap空間即可;當(dāng)需要休眠時(shí),建議配置兩倍物理內(nèi)存的大小,但最大值不要超過(guò)兩倍內(nèi)存大小。當(dāng)物理內(nèi)存大于
1G且不需要休眠時(shí),建議大小為sqrt(RAM),其中RAM為物理內(nèi)存大小;當(dāng)需要休眠時(shí),建議大小是RAM+round(sqrt(RAM)),但最大值不要超過(guò)兩倍內(nèi)存大小。如果兩倍物理內(nèi)存大小的
swap空間還不夠用,建議增加內(nèi)存而不是增加swap。
下面是詳細(xì)的不同物理內(nèi)存情況下的建議,第一列是物理內(nèi)存的大小,第二列和第三列是不需要和需要休眠兩種情況下推薦的大小,第四列是不要超過(guò)的最大值。
物理內(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 常用操作
介紹了日常使用時(shí),增刪的相關(guān)操作!
當(dāng)我們確定好配置多大的 swap 空間后,具體應(yīng)該怎么配置呢?Linux 下有兩種類型的 swap 空間,swap 分區(qū)和 swap 文件,它們有各自的特點(diǎn):
swap 分區(qū):
swap 分區(qū)上面由于沒(méi)有文件系統(tǒng),所以相當(dāng)于內(nèi)核直接訪問(wèn)連續(xù)的磁盤空間,效率相對(duì)要高點(diǎn),但由于 swap 分區(qū)一般安裝系統(tǒng)時(shí)就分配好了,后期要縮減空間和擴(kuò)容都很不方便。
swap 文件:
swap 文件放在指定分區(qū)的文件系統(tǒng)里面,所以有可能受文件系統(tǒng)性能的影響,但據(jù)說(shuō)2.6版本以后的內(nèi)核可以直接訪問(wèn)swap文件對(duì)應(yīng)的物理磁盤地址,相當(dāng)于跳過(guò)了文件系統(tǒng)直接訪問(wèn)磁盤。不過(guò)如果 swap 文件在磁盤上的物理位置不連續(xù)時(shí),還是會(huì)對(duì)性能產(chǎn)生不利影響,但其優(yōu)點(diǎn)就是靈活,隨時(shí)可以增加和移除swap文件。
交換分區(qū)在物理內(nèi)存被填滿時(shí)用來(lái)保持內(nèi)存中的內(nèi)容。當(dāng) RAM 被耗盡,Linux 會(huì)將內(nèi)存中不活動(dòng)的頁(yè)移動(dòng)到交換空間中,從而空出內(nèi)存給系統(tǒng)使用。雖然如此,但交換空間不應(yīng)被認(rèn)為是物理內(nèi)存的替代品。大多數(shù)情況下,建議交換內(nèi)存的大小為物理內(nèi)存的 1 到 2 倍。也就是說(shuō)如果你有 8GB 內(nèi)存, 那么交換空間大小應(yīng)該介于 8-16GB。
[1] 查看系統(tǒng)中已經(jīng)配置的 swap 分配情況
# Filename: 類型是分區(qū)則顯示分區(qū)路徑,類型是文件則顯示文件路徑
# Type: partition代表是一個(gè)swap分區(qū),file代表是一個(gè)swap文件
# Size: 顯示swap的大小,默認(rèn)單位是KB
# Used: 已經(jīng)被使用的大小,0表示還沒(méi)有被使用到
# Priority: 優(yōu)先級(jí)高將會(huì)被優(yōu)先使用,同等優(yōu)先級(jí)將會(huì)均勻使用(設(shè)置: 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
# 啟動(dòng)某個(gè)交換swap
$ sudo swapon /dev/sda2
# 啟動(dòng)所有系統(tǒng)配置的swap
$ sudo swapon -a
# 關(guān)閉某個(gè)交換swap
$ sudo swapoff /dev/sda2
# 關(guān)閉所有系統(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的頻率,頻率越高對(duì)系統(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í)際使用參數(shù)
$ free
總計(jì)物理內(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命令來(lái)格式化交換分區(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.關(guān)閉某個(gè)交換swap
$ sudo swapoff /dev/zvol/dsk/rpool/swap2
# 2.刪除邏輯卷
$ sudo zpool destroy rpool/swap
# 3.修改/etc/fstab
將添加的Swap記錄一并刪除,否則下次重啟后,系統(tǒng)又會(huì)重新掛載相應(yī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命令來(lái)格式化交換分區(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.修改文件的權(quán)限,避免其他用戶對(duì)這個(gè)文件進(jìn)行誤操作
$ 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)又會(huì)重新掛載相應(yīng)的swap分區(qū)和文件
六、優(yōu)化 swap 性能
使用和配置 Swap 的相關(guān)經(jīng)驗(yàn)總結(jié)!
怎么配置swap 可以讓它的性能更好呢?
盡量使用
swap分區(qū),相對(duì)于swap文件來(lái)說(shuō),分區(qū)肯定是連續(xù)的物理磁盤空間,而swap文件有可能不是。將 swap 分區(qū)和系統(tǒng)所在的分區(qū)放在不同的磁盤上,這樣就不會(huì)和系統(tǒng)盤搶同一個(gè)磁盤的
I/O帶寬。如果有多塊磁盤的話,可以在每個(gè)盤上創(chuàng)建一個(gè) swap 分區(qū),并且將它們的優(yōu)先級(jí)設(shè)置的一樣,這樣內(nèi)核就會(huì)平均的訪問(wèn)這些
swap分區(qū),性能相當(dāng)于原來(lái)的 N 倍(這里 N 是磁盤的數(shù)量)。
不過(guò)話又說(shuō)回來(lái)了,如果頻繁的訪問(wèn) swap 的話,怎么優(yōu)化 swap 都沒(méi)用,跟內(nèi)存比還是低幾個(gè)數(shù)量級(jí),性能還是下降的厲害,如果不頻繁訪問(wèn) swap 的話,優(yōu)化 swap 又有啥意義呢?所以其實(shí)優(yōu)化 swap 性能的實(shí)際意義不大,這里了解一下就好。
七、配置 swappiness 特性
配置希望盡量減少 Swap 空間的使用!
有時(shí)我們桌面環(huán)境確實(shí)配置了比較充裕的內(nèi)存,并且也配置了 swap 空間,這個(gè)時(shí)候就希望盡量減少 swap 空間的使用,避免對(duì)系統(tǒng)性能造成影響。Linux 早就幫我們考慮到這種情況了,在 2.6 內(nèi)核中,增加了一個(gè)叫做 swappiness 的參數(shù),用于配置需要將內(nèi)存中不常用的數(shù)據(jù)移到 swap 中去的緊迫程度。這個(gè)參數(shù)的取值范圍是 0~100,0 告訴內(nèi)核盡可能的不要將內(nèi)存數(shù)據(jù)移到 swap 中,也即只有在迫不得已的情況下才這么做,而 100 告訴內(nèi)核只要有可能,盡量的將內(nèi)存中不常訪問(wèn)的數(shù)據(jù)移到 swap 中。
Ubuntu 的 desktop 和 server 的默認(rèn)配置都是 60(可能會(huì)隨著版本變化),對(duì)于桌面環(huán)境來(lái)說(shuō),界面的響應(yīng)速度直接關(guān)系到系統(tǒng)的流暢程度,如果內(nèi)存比較充裕的話,可以將這個(gè)值設(shè)置的小一點(diǎn),這樣就盡可能的把數(shù)據(jù)留在內(nèi)存中,從而喚醒后臺(tái)界面程序會(huì)更快一些,Ubuntu desktop 建議將該值設(shè)置為 10,當(dāng)然大家可以根據(jù) swap 空間的實(shí)際使用情況,任意調(diào)整這個(gè)參數(shù),直到自己滿意的水平為止。對(duì)于服務(wù)器來(lái)說(shuō),主要性能衡量標(biāo)準(zhǔn)是整體的處理能力,而不是具體某一次的響應(yīng)速度,能把更多的內(nèi)存用來(lái)做 I/O cache 可能效果更好,所以 Ubuntu server 建議保持 60 的默認(rèn)值。
# 修改當(dāng)前系統(tǒng)中swappiness的值
$ sudo sysctl vm.swappiness=10
vm.swappiness = 10
# 查看當(dāng)前系統(tǒng)中swappiness的值
$ sudo cat /proc/sys/vm/swappiness
10
# 生效配置 => /etc/sysctl.conf
$ sudo /sbin/sysctl -p
# 修改當(dāng)前系統(tǒng)中vfs_cache_pressure的值
$ sudo sysctl vm.vfs_cache_pressure=50
vm.vfs_cache_pressure=50
# 查看當(dāng)前系統(tǒng)中vfs_cache_pressure的值
$ sudo cat /proc/sys/vm/vfs_cache_pressure
50
# 生效配置 => /etc/sysctl.conf
$ sudo /sbin/sysctl -p
上面通過(guò) sysctl 修改的 swappiness 值在系統(tǒng)重啟后會(huì)失效,要想重啟后繼續(xù)生效,需要修改配置文件 /etc/sysctl.conf,將下面這行修改成 10,如果文件中找不到這行的話,在文件末位加上這行就可以了。
vm.swappiness=10推薦閱讀:
再見(jiàn)!程序員!這次情況嚴(yán)重升級(jí)了...
iptables 長(zhǎng)文詳解,值得收藏細(xì)讀
5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹(shù)莓派,等等。在公眾號(hào)內(nèi)回復(fù)「1024」,即可免費(fèi)獲取!!

