關於Linux系統的swap交換空間

原文鏈接:All about Linux swap space
翻譯:沉潛飛動
譯文鏈接:關於Linux系統的swap交換空間

用Ubuntu已經將近1年了,最近重裝了16.04之後,每天到下午5點左右,都會發現Swap交換空間有幾百兆的寫入,系統內存8G,硬盤是SSD,i5處理器,配置中檔,也沒有啓動什麼大型軟件,就是用IDEA做開發,雖然沒有影響,但本着一顆求知的心,google一下,第一篇是《All about Linux swap space》,口氣很大,直接翻譯了。
linux-swap-and-drop_cache

Linux將隨機存儲RAM稱爲內存頁。交換技術就是將一頁內存複製到預先設定的硬盤上的交換空間,來釋放該頁佔用內存。物理內存和交換空間的和就是可提供的虛擬內存的總量。
有兩個原因證明交換技術是很重要的。首先,系統需要的內存量比物理內存更大時,系統內核可以把較少使用的內存頁寫到交換空間,把空閒出來的內存給當前的應用程序(進程)使用。其次,一個應用啓動時使用的內存頁,可能只是在初始化時使用,之後不會再用,操作系統就可以把這部分內存頁寫入交換空間,把空閒出來的內存給其他應用使用或作爲磁盤高速緩存。
但是,交換技術也有負面作用。相對於內存,硬盤讀寫速度慢。內存的讀寫速度可以使用納秒衡量,但是硬盤的速度只能達到毫秒級,訪問硬盤的速度比訪問內存的速度慢成千上萬倍。發生的交換越多,系統運行越慢。有時候會有過度的交換或內存頁頻繁的寫入寫出的抖動發生,因爲系統既要保證應用正常運行,又要尋找空閒的內存。這種情況下,只能通過增加RAM來解決。
Linux有兩種形式的交換空間:交換分區和交換文件。交換分區就是一個獨立的硬盤,沒有文件或內容。交換文件是文件系統中的一個特殊文件,獨立於系統和數據文件之外。
可以使用swapon -s命令查看swap空間,輸出如下:

Filename  Type       Size       Used Priority
/dev/sda5 partition  859436  0       -1

每一行列出的都是系統正在使用的交換空間。這裏的’Type’字段表明該交換空間是一個分區而不是文件,通過’Filename’可以知道交換分區是磁盤sda5。’Size’字段磁盤大小,單位是KB,’Used’字段是表示有多少交換空間被使用。’Priority’字段表示Linux系統的交換空間使用優先級。有一個重要的特性,如果在Linux系統中掛載兩個(或更多)具有相同優先級的交換空間(最好是兩個不同的設備),Linux將交替使用,可以提升交換性能。

交換分區

要爲系統添加一個額外的交換分區,首先你需要準備一個。第一步是確保分區標記爲交換分區,第二步是將格式設置爲swap文件系統。將分區標記爲swap分區,以root權限運行:

fdisk -l /dev/hdb

將’/dev/hdb’替換爲你的交換分區的磁盤。輸出類似於:

Device Boot    Start      End           Blocks  Id      System
/dev/hdb1       2328    2434    859446  82      Linux swap / Solaris

如果分區沒有標記爲swap分區,你需要使用命令fdisk及參數t來聲明。操作分區時要小心,你絕對不想刪除重要的分區或把系統分區的標識改錯。交換分區上的數據會丟失,所以每次改動都需要多次確認。還需要注意的是,Solaris使用相同的ID作爲Linux交換空間,所以需要小心不要殺掉Solaris分區。
如果分區已經標記爲swap分區,就需要通過root權限運行mkswap命令:

mkswap /dev/hdb1

如果運行沒有錯誤,你的交換空間就開始使用。立即激活:

swapon /dev/hdb1

可以通過swapon -s來確認是否運行。爲了在系統啓動時自動掛載swap空間,需要在’/etc/fstab’文件中添加一些列的配置,swap空間是特殊的文件系統,許多參數不可用。比如:

/dev/hdb1       none    swap    sw      0       0

檢查你的交換空間是無需重新啓動,你可以運行swapoff -a命令,然後運行swapon -a,在通過swapon -s檢查。

交換文件

和交換分區類似,Linux也支持使用交換文件,你可以創建、準備,以交換分區的方式掛載。交換文件的好處是,你不需要找一個空的分區或添加額外的交換分區磁盤。
使用dd命令創建一個空文件。創建一個1G的文件,比如:

dd if=/dev/zero of=/swapfile bs=1024 count=1048576

‘/swapfile’是交換文件的名字,’count’的1048576是文件大小,單位KB。
準備交換文件使用mkswap命令,類似於準備分區,不過這次是使用同一個交換文件:

mkswap /swapfile

同樣的,掛載交換文件使用swapon命令:

swapon /swapfile

在’/etc/fstab’中輸入下面的內容:

/swapfile       none    swap    sw      0       0

交換空間的大小

如果你有很大的內存,有可能沒有交換空間,系統也能運行良好。但是如果物理內存耗光,系統就會崩潰,因爲它沒有其他緩解方式,所以最好還是提供一個交換空間,更何況磁盤比內存便宜很多。
關鍵的問題是內存空間多大?老版的類UNIX操作系統要求交換空間是物理內存的兩到三倍。現在的擴展版(比如Linux)不需要這麼多,但是如果你配置這些,他們也會使用。重要的原則如下:

  1. 對於桌面系統,使用系統內存的兩倍的交換空間,將可以運行大量的應用程序(其中可能有很多閒置的),使更多的RAM用於主要的應用;
  2. 對於服務器,使用小量的交換空間(通常是物理內存的一半),這樣你就可以通過監控交換空間的大小來預警是否需要增加RAM;
  3. 對於老式臺式機,使用盡可能大的交換空間

Linux 2.6內核中增加一個新的內核參數’swappiness’,管理員可以通過該參數修改Linux交換方式。參數值從0到100.從本質上說,值越大,將引起越多內存頁發生交換;值越小,就有越多的應用駐留在內存中,而交換空間是空閒的。內核維護者Andrew Morton說過,他在他的臺式機中設置swappiness值是100,說:“我的觀點是,通過內核參數降低交換是錯誤的。你不需要幾百兆的無用應用佔用內存。把它放在磁盤上,把內存留給有用的東西。”
Morton的想法有一個漏洞,如果內存交換太快,應用響應就會下降,因爲當應用窗口被點擊時,應用正在從交換空間讀入內存,就會感覺運行很慢。
默認的’swappiness’值是60。你可以使用root命令調整參數(作用到重啓):

echo 50 > /proc/sys/vm/swappiness

如果你需要使參數永久有效,就需要修改’/etc/sysctl.conf’中的’vm.swappiness’參數。

結論

管理交換空間是系統管理的一個重要方面。有了良好的規劃和合理的使用交換技術可以有很多好處。不要害怕實驗,並且經常監控你的系統,以確保你得到你需要的結果。


寫在最後

就目前來說,內存和SSD都開始降價,基本上很輕鬆就能把機器攢到8G(RAM)+120G(SSD),這樣的話,就個人用戶的桌面系統而言,交換空間的作用被大大削弱,但是正如上面說的,如果沒有交換空間,內存耗光的時候,機器就掛了。因爲SSD不建議分多個分區,所以使用swap file的方式比較好,而且還可以多建幾個swap file文件,提升交換性能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章