Linux - Swap

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

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市督怜,隨后出現(xiàn)的幾起案子殴瘦,更是在濱河造成了極大的恐慌,老刑警劉巖号杠,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚪腋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡姨蟋,警方通過查閱死者的電腦和手機(jī)屉凯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來眼溶,“玉大人悠砚,你說我怎么就攤上這事√梅桑” “怎么了灌旧?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)绰筛。 經(jīng)常有香客問我枢泰,道長(zhǎng),這世上最難降的妖魔是什么铝噩? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任衡蚂,我火速辦了婚禮,結(jié)果婚禮上骏庸,老公的妹妹穿的比我還像新娘毛甲。我一直安慰自己,他們只是感情好敞恋,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布丽啡。 她就那樣靜靜地躺著,像睡著了一般硬猫。 火紅的嫁衣襯著肌膚如雪补箍。 梳的紋絲不亂的頭發(fā)上改执,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音坑雅,去河邊找鬼辈挂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛裹粤,可吹牛的內(nèi)容都是我干的终蒂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼遥诉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼拇泣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起矮锈,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤霉翔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后苞笨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體债朵,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年瀑凝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了序芦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粤咪,死狀恐怖谚中,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寥枝,我是刑警寧澤藏杖,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站脉顿,受9級(jí)特大地震影響实夹,放射性物質(zhì)發(fā)生泄漏匙握。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一蚊俺、第九天 我趴在偏房一處隱蔽的房頂上張望敢辩。 院中可真熱鬧蔽莱,春花似錦、人聲如沸戚长。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)同廉。三九已至仪糖,卻和暖如春柑司,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锅劝。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工攒驰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人故爵。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓玻粪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親诬垂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子劲室,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容