swap簡(jiǎn)介
swap是啥
首先,swap是硬盤上的一塊空間真屯。
其次脸候,當(dāng)內(nèi)存沒有多余空間的時(shí)候,可以將一部分?jǐn)?shù)據(jù)交換到swap空間。也就是將內(nèi)存中的一部分?jǐn)?shù)據(jù)放到硬盤中运沦,并釋放內(nèi)存空間泵额。這樣,釋放出的內(nèi)存空間就又可以被利用來存儲(chǔ)其他數(shù)據(jù)了携添。
這樣嫁盲,本來只有4G的內(nèi)存,如果swap有2G的話烈掠,可使用的內(nèi)存可以認(rèn)為是6G羞秤。
但是,硬盤的速度比內(nèi)存慢太多太多了向叉。因此swap只是對(duì)內(nèi)存的一種補(bǔ)充锥腻,是在內(nèi)存不足時(shí)對(duì)內(nèi)存的擴(kuò)充,但是不能代替內(nèi)存使用母谎。
swap與內(nèi)存的交換策略
內(nèi)存不足時(shí),操作系統(tǒng)會(huì)選擇最久沒被使用的內(nèi)存數(shù)據(jù)京革,交換到swap空間奇唤。
注意,交換操作是由操作系統(tǒng)來進(jìn)行的匹摇。
什么時(shí)候使用swap
系統(tǒng)在什么情況或條件下才會(huì)使用Swap分區(qū)的空間呢咬扇? 其實(shí)是Linux通過一個(gè)參數(shù)swappiness來控制的。當(dāng)然還涉及到復(fù)雜的算法廊勃。
這個(gè)參數(shù)值可為 0-100懈贺,控制系統(tǒng) swap 的使用程度。
0告訴內(nèi)核盡可能的不要將內(nèi)存數(shù)據(jù)移到swap中坡垫,也即只有在迫不得已的情況下才這么做梭灿,而100告訴內(nèi)核只要有可能,盡量的將內(nèi)存中不常訪問的數(shù)據(jù)移到swap中冰悠。默認(rèn)值為 60堡妒。注意:這個(gè)只是一個(gè)權(quán)值,不是一個(gè)百分比值溉卓,涉及到系統(tǒng)內(nèi)核復(fù)雜的算法
查看當(dāng)前系統(tǒng)中swappiness的值
cat /proc/sys/vm/swappiness
修改當(dāng)前系統(tǒng)中swappiness的值
sudo sysctl vm.swappiness=10
上面通過sysctl修改的swappiness值在系統(tǒng)重啟后會(huì)失效皮迟,要想重啟后繼續(xù)生效,需要修改配置文件/etc/sysctl.conf桑寨,將下面這行修改成10伏尼,如果文件中找不到這行的話,在文件末位加上這行就可以了
vm.swappiness=10
swap設(shè)置
swap大小
既然配置swap對(duì)桌面系統(tǒng)有幫助尉尾,那么配置多少大小的swap比較合適呢爆阶?下面是ubuntu給出的建議:
- 當(dāng)物理內(nèi)存小于1G且不需要休眠時(shí),設(shè)置和內(nèi)存同樣大小的swap空間即可;當(dāng)需要休眠時(shí)扰她,建議配置兩倍物理內(nèi)存的大小兽掰,但最大值不要超過兩倍內(nèi)存大小
- 當(dāng)物理內(nèi)存大于1G且不需要休眠時(shí),建議大小為round(sqrt(RAM))徒役,其中RAM為物理內(nèi)存大心蹙 ;當(dāng)需要休眠時(shí)忧勿,建議大小是RAM+round(sqrt(RAM))杉女,但最大值不要超過兩倍內(nèi)存大小
- 如果兩倍物理內(nèi)存大小的swap空間還不夠用,建議增加內(nèi)存而不是增加swap
開啟/關(guān)閉swap
Linux下有兩種類型的swap空間鸳吸,swap分區(qū)和swap文件熏挎,他們有各自的特點(diǎn):
swap分區(qū)上面由于沒有文件系統(tǒng),所以相當(dāng)于內(nèi)核直接訪問連續(xù)的磁盤空間晌砾,效率相對(duì)要高點(diǎn)坎拐,但由于swap分區(qū)一般安裝系統(tǒng)時(shí)就分配好了了,后期要縮減空間和擴(kuò)容都很不方便养匈。
swap文件放在指定分區(qū)的文件系統(tǒng)里面哼勇,所以有可能受文件系統(tǒng)性能的影響,但據(jù)說2.6版本以后的內(nèi)核可以直接訪問swap文件對(duì)應(yīng)的物理磁盤地址呕乎,相當(dāng)于跳過了文件系統(tǒng)直接訪問磁盤积担,不過如果swap文件在磁盤上的物理位置不連續(xù)時(shí),還是會(huì)對(duì)性能產(chǎn)生不利影響猬仁,但其優(yōu)點(diǎn)就是靈活帝璧,隨時(shí)可以增加和移除swap文件。
查看系統(tǒng)中已經(jīng)配置的swap
dev@dev:~$ swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 524284 0 -1
#注:如果沒有任何輸出的話湿刽,說明沒有swap
如果配置有多個(gè)swap分區(qū)或者文件的話的烁,這里將會(huì)有多行,每行代表一個(gè)正在被系統(tǒng)使用的swap分區(qū)或文件叭爱,下面是每個(gè)字段的意思:
-
Filename
:如果swap類型是分區(qū)撮躁,這里將是分區(qū)的路徑,如果swap類型是文件买雾,這里將是文件的路徑 -
Type
:swap的類型把曼,partition代表這是一個(gè)swap分區(qū),file代表這是一個(gè)swap文件 -
Size
:swap的大小漓穿,單位是k嗤军,這里524284表示的差不多是512M -
Used
:已經(jīng)被使用的大小,這里0表示還沒有被使用到 -
Priority
:優(yōu)先級(jí)晃危,優(yōu)先級(jí)高的swap將會(huì)被優(yōu)先使用叙赚,同等優(yōu)先級(jí)的swap將會(huì)被均勻的使用(round-robin算法)老客,優(yōu)先級(jí)可以通過“swapon -p”命令來設(shè)置
查看系統(tǒng)中swap in/out的情況
并不是swap空間占用多就一定性能下降,真正影響性能是swap in和out的頻率震叮,頻率越高胧砰,對(duì)系統(tǒng)的性能影響越大,我們可以通過vmstat命令來查看swap in/out的頻率
#參數(shù)2表示每?jī)擅虢y(tǒng)計(jì)一次苇瓣,si和so兩列就是每秒swap in和out的次數(shù)
dev@ubuntu:~$ 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
0 0 70232 75620 7940 209476 0 0 0 0 111 180 0 1 99 0 0
0 0 70232 75620 7940 209476 0 0 0 0 116 186 1 1 99 0 0
0 0 70228 75620 7940 209476 2 0 2 0 120 193 1 1 98 1 0
0 0 70228 75620 7940 209476 0 0 0 0 117 186 0 0 100 0 0
0 0 70228 75620 7940 209476 0 0 0 0 113 184 0 1 99 0 0
添加swap分區(qū)
在添加swap分區(qū)前尉间,首先得有一個(gè)空閑的分區(qū),如果是一塊新的磁盤击罪,可以用fdisk來創(chuàng)建一個(gè)新的分區(qū)用于swap哲嘲。
注意:磁盤分區(qū)操作一定要小心,弄不好就會(huì)造成數(shù)據(jù)丟失媳禁、系統(tǒng)掛掉的后果眠副。磁盤分區(qū)操作不是本篇要介紹的內(nèi)容,所以這里不會(huì)討論fdisk怎么用竣稽。
#本篇使用的測(cè)試環(huán)境是虛擬機(jī)囱怕,/dev/sdb是一塊新加的硬盤并且已經(jīng)用fdisk創(chuàng)建好了一個(gè)分區(qū)
#本例中將使用/dev/sdb1這個(gè)分區(qū)
dev@dev:~$ sudo fdisk -l /dev/sdb
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 4194303 4192256 2G 83 Linux
#創(chuàng)建swap分區(qū)
dev@dev:~$ sudo mkswap /dev/sdb1
Setting up swapspace version 1, size = 2 GiB (2146430976 bytes)
no label, UUID=d69621de-618a-4bea-9a96-b8e8b0d0ea40
#查看系統(tǒng)中現(xiàn)在正在使用的swap,以便于和添加后做比較
dev@dev:~$ swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 524284 0 -1
#將新的分區(qū)加入到系統(tǒng)中
dev@dev:~$ sudo swapon /dev/sdb1
#這時(shí)候可以看到新的swap分區(qū)已經(jīng)被加入到系統(tǒng)中了丧枪,并且優(yōu)先級(jí)比原來的要低
dev@dev:~$ swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 524284 0 -1
/dev/sdb1 partition 2096124 0 -2
#為了保證系統(tǒng)重啟后會(huì)自動(dòng)加載我們新的swap分區(qū)光涂,需要修改/etc/fstab文件
dev@dev:~$ sudo sh -c 'echo "/dev/sdb1 none swap sw 0 0" >> /etc/fstab'
#查看一下,確保寫入成功拧烦,這里的第一條是原來的系統(tǒng)的swap分區(qū),第二條是我們剛添加的
dev@dev:~$ grep swap /etc/fstab
/dev/mapper/dev--vg-swap_1 none swap sw 0 0
/dev/sdb1 none swap sw 0 0
添加swap文件
添加swap文件就簡(jiǎn)單多了钝计,也沒有分區(qū)操作那么有風(fēng)險(xiǎn)恋博。
#先創(chuàng)建一個(gè)新的512M的文件,用來作為swap文件私恬,文件路徑可以隨便
#fallocate這個(gè)命令依賴于文件系統(tǒng)债沮,有些老的文件系統(tǒng)不支持這個(gè)命令,比如ext2本鸣,
#這種情況下可以用dd來實(shí)現(xiàn)同樣的效果:
#sudo dd if=/dev/zero of=/mnt/512MiB.swap bs=1024 count=524288
#fallocate和dd的區(qū)別在于:
#fallocate是先聲明這么多疫衩,然后在具體用到的時(shí)候文件系統(tǒng)才分配真正的物理磁盤空間,就是用一點(diǎn)分配一點(diǎn)荣德,
#而dd是一開始就實(shí)實(shí)在在的寫了512m的數(shù)據(jù)到物理磁盤空間闷煤。
#所以作為測(cè)試來說fallocate方便些,因?yàn)閯傞_始不用寫任何數(shù)據(jù)涮瞻,要快
dev@dev:~$ sudo fallocate -l 512m /mnt/512MiB.swap
#修改文件的權(quán)限鲤拿,避免其他用戶對(duì)這個(gè)文件進(jìn)行誤操作
dev@dev:~$ sudo chmod 600 /mnt/512MiB.swap
#格式化為swap文件
dev@dev:~$ sudo mkswap /mnt/512MiB.swap
#將新的文件加入到系統(tǒng)中
dev@dev:~$ sudo swapon /mnt/512MiB.swap
#這時(shí)候可以看到新的swap文件已經(jīng)被加入到系統(tǒng)中了,類型為file
#這里可以看到由于優(yōu)先級(jí)最高署咽,第一個(gè)swap分區(qū)/dev/dm-1已經(jīng)被使用了24K
dev@dev:~$ swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 524284 24 -1
/dev/sdb1 partition 2096124 0 -2
/mnt/512MiB.swap file 524284 0 -3
#從free命令的輸出可以看到近顷,經(jīng)過前面兩輪添加swap分區(qū)和文件生音,
#現(xiàn)在系統(tǒng)的交換空間已經(jīng)變成3G(3144692K)了
dev@dev:~$ free
total used free shared buff/cache available
Mem: 500192 39112 9564 1996 451516 430820
Swap: 3144692 24 3144668
#同樣為了保證系統(tǒng)重啟后會(huì)自動(dòng)加載我們新的swap文件,需要修改/etc/fstab文件
dev@dev:~$ sudo sh -c 'echo "/mnt/512MiB.swap none swap sw 0 0" >> /etc/fstab'
關(guān)閉swap
#停掉所有系統(tǒng)正在使用的swap
dev@dev:~$ sudo swapoff -a
#swapon -s命令沒有任何輸出窒升,free命令顯示swap空間為0缀遍,說明swapoff成功
dev@dev:~$ swapon -s
dev@dev:~$ free
total used free shared buff/cache available
Mem: 500192 35924 348888 2004 115380 433924
Swap: 0 0 0
#當(dāng)然我們還需要修改/etc/fstab,否則下次重啟后饱须,系統(tǒng)又會(huì)重新掛載相應(yīng)的swap分區(qū)和文件
#使用自己喜歡的編輯器域醇,將/etc/fstab中跟swap相關(guān)的三行刪掉即可(本例中是三行,請(qǐng)根據(jù)實(shí)際情況調(diào)整)
如何查哪些進(jìn)程使用了Swap
通過如下命令冤寿,能查看所有進(jìn)程的使用swap情況
cat /proc/$(pid)/smaps
查看某個(gè)進(jìn)程swap占用內(nèi)存大小腳本:
grep "Swap" /proc/$pid/smaps | awk -F':' '{print $2}' | awk -F' ' 'BEGIN{sum=0}{if($1>0)sum+=$1} END{print sum}'
查看所有進(jìn)程使用swap情況腳本:
pids=$(cd /proc; ls | grep "^[0-9]")
for pid in $pids;
do
if [[ $pid -lt 100 ]];then
continue
fi
echo -n "pid=$pid====="
grep "Swap" /proc/$pid/smaps | awk -F':' '{print $2}' | awk -F' ' 'BEGIN{sum=0}{if($1>0)sum+=$1} END{print sum}'
done