天天看點

關于Linux系統的swap交換空間

關于Linux系統的swap交換空間

你好,我是看山。

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

關于Linux系統的swap交換空間

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)不需要這麼多,但是如果你配置這些,他們也會使用。重要的原則如下:

對于桌面系統,使用系統記憶體的兩倍的交換空間,将可以運作大量的應用程式(其中可能有很多閑置的),使更多的 RAM 用于主要的應用;

對于伺服器,使用小量的交換空間(通常是實體記憶體的一半),這樣你就可以通過監控交換空間的大小來預警是否需要增加 RAM;

對于老式桌上型電腦,使用盡可能大的交換空間

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 檔案,提升交換性能。

繼續閱讀