Swap 分割槽,即交換區,Swap 空間的作用可簡單描述為:當系統的實體內存不夠用的時候,就需要將實體內存中的一部分空間釋放出來,以供當前執行 的程式使用。那些被釋放的空間可能來自一些很長時間沒有什麼操作的程式,這些被釋放的空間被臨時儲存到 Swap 空間中,等到那些程式要執行時,再從 Swap 中恢復儲存的資料到內存中。這樣,系統總是在實體內存不夠時,才進行 Swap 交換。其實,Swap 的調整對 Linux 站羣服務器,特別是 Web 站羣服務器 的效能至關重要。通過調整 Swap,有時可以越過系統效能瓶頸,節省系統升級費用。
眾所周知,現代操作系統都實現了 “虛擬內存” 這一技術,不但在功能上突破了實體內存的限制,使程式可以操縱大於實際實體內存的空間,更重要的是,“虛擬內存” 是隔離每個程序的安全保護網,使每個程序都不受其它程式的干擾。
計算機使用者會經常遇這種現象。例如,在使用 Windows 系統時,可以同時執行多個程式,當你切換到一個很長時間沒有理會的程式時,會聽到硬碟 “譁 譁” 直響。這是因為這個程式的內存被那些頻繁執行的程式給 “偷走” 了,放到了 Swap 區中。因此,一旦此程式被放置到前端,它就會從 Swap 區取回自己的數 據,將其放進內存,然後接著執行。
需要説明一點,並不是所有從實體內存中交換出來的資料都會被放到 Swap 中 (如果這樣的話,Swap 就會不堪重負),有相當一部分資料被直接交換到 檔案 系統。例如,有的程式會開啓一些檔案,對檔案進行讀寫 (其實每個程式都至少要開啓一個檔案,那就是執行程式本身),當需要將這些程式的內存空間交換出去 時,就沒有必要將檔案部分的資料放到 Swap 空間中了,而可以直接將其放到檔案裏去。如果是讀檔案操作,那麼內存資料被直接釋放,不需要交換出來,因為下 次需要時,可直接從檔案系統恢復;如果是寫檔案,只需要將變化的資料儲存到檔案中,以便恢復。但是那些用 malloc 和 new 函式生成的物件的資料則不 同,它們需要 Swap 空間,因為它們在檔案系統中沒有相應的 “儲備” 檔案,因此被稱作 “匿名”(Anonymous) 內存資料。這類資料還包括堆疊中的一 些狀態和變數資料等。所以説,Swap 空間是 “匿名” 資料的交換空間。
突破 128M Swap 限制
經常看到有些 Linux(國內漢化版) 安裝手冊上有這樣的説明:Swap 空間不能超過 128M 。為什麼會有這種説法?在説明 “128M” 這個數字的來歷之前,先給問題一個回答:現在根本不存在 128M 的限制!現在的限制是 2G!
Swap 空間是分頁的,每一頁的大小和內存頁的大小一樣,方便 Swap 空間和內存之間的資料交換。舊版本的 Linux 實現 Swap 空間時,用 Swap 空 間的第一頁作為所有 Swap 空間頁的一個 “位對映”(Bit map) 。這就是説第一頁的每一位,都對應著一頁 Swap 空間。如果這一位是 1,表示此頁 Swap 可用;如果是 0,表示此頁是壞塊,不能使用。這麼説來, 第一個 Swap 對映位應該是 0,因為,第一頁 Swap 是對映頁。另外,最後 10 個對映位也被佔用,用來表示 Swap 的版本 (原來的版本是 Swap_space ,現在的版本是 swapspace2) 。那麼,如果説一頁的大小為 s,這種 Swap 的實現方法共能管理 “8 * ( s – 10 ) – 1” 個 Swap 頁。對於 i386 系統來説 s=4096,則空間大小共為 133890048,如果認為 1 MB=2^20 Byte 的話,大小正好為 128M 。
Swap 配置對效能的影響
分配太多的 Swap 空間會浪費磁碟空間,而 Swap 空間太少,則系統會發生錯誤。
如果系統的實體內存用光了,系統就會跑得很慢,但仍能執行;如果 Swap 空間用光了,那麼系統就會發生錯誤。例如,Web 站羣服務器能根據不同的請求數 量衍 生出多個服務程序 (或執行緒),如果 Swap 空間用完,則服務程序無法啓動,通常會出現 “application is out of memory” 的錯誤,嚴重時會造成服務程序的死鎖。因此 Swap 空間的分配是很重要的。
通常情況下,Swap 空間應大於或等於實體內存的大小,最小不應小於 64M,通常 Swap 空間的大小應是實體內存的 2-2.5 倍。但根據不同的應 用,應 有不同的配置:如果是小的桌面系統,則只需要較小的 Swap 空間,而大的站羣服務器系統則視情況不同需要不同大小的 Swap 空間。特別是資料庫站羣服務器和 Web 站羣服務器,隨著訪問量的增加,對 Swap 空間的要求也會增加,具體配置參見各站羣服務器產品的説明。
另外,Swap 分割槽的數量對效能也有很大的影響。因為 Swap 交換的操作是磁碟 IO 的操作,如果有多個 Swap 交換區,Swap 空間的分配會以輪流 的方 式操作於所有的 Swap,這樣會大大均衡 IO 的負載,加快 Swap 交換的速度。如果只有一個交換區,所有的交換操作會使交換區變得很忙,使系統大多數時間 處於等待狀態,效率很低。用效能監視工具就會發現,此時的 CPU 並不很忙,而系統卻慢。這説明,瓶頸在 IO 上,依靠提高 CPU 的速度是解決不了問題的。
建立一個有連續空間的空白檔案
站羣服務器的實體內存是 512MB,按照 1.5~2 倍原則,我將 swap 檔案設定為 1GB 。
#root @aliyun :/srv# dd if=/dev/zero of=SWAPFILE bs=1024 count=1048576 1048576+0 records in 1048576+0 records out 1073741824 bytes (1.1 GB) copied, 59.7957 s, 18.0 MB/s
#root@aliyun :/srv# dd if=/dev/zero of=SWAPFILE bs=1024 count=1048576
1048576+0 records in
1048576+0 records out
1073741824 bytes (1.1 GB) copied, 59.7957 s, 18.0 MB/s
使用 swap 檔案
使用 swapon 命令讓系統使用這個檔案作為 swap 檔案。但是這個檔案不能直接使用,否則會報錯:
root @aliyun :/srv# swapon swapfile swapon: /srv/swapfile: read swap header failed: Invalid argument
root@aliyun:/srv# swapon swapfile
swapon: /srv/swapfile: read swap header failed: Invalid argument
必須先使用 mkswap 將檔案格式化成 swap 格式(不知道為什麼會少了 4KB):
root @aliyun :/srv# mkswap SWAPFILE 1048576 Setting up swapspace version 1, size = 1048572 KiB no label, UUID=1aaed031-33ef-479b-a9a4-2f008a7bbb2f
root@aliyun:/srv# mkswap SWAPFILE 1048576
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=1aaed031-33ef-479b-a9a4-2f008a7bbb2f
使用格式化完畢的檔案:
root @aliyun :/srv# swapon SWAPFILE
root@aliyun:/srv# swapon SWAPFILE
檢視檔案使用情況:
root@aliyun:/srv# swapon -s Filename Type Size Used Priority /srv/SWAPFILE file 1048572 95852 -1
root@aliyun:/srv# swapon -s
Filename Type Size Used Priority
/srv/SWAPFILE file 1048572 95852 -1
加入自動啓用
為避免重啓後 swapfile 生效,可以將啓用 swap 的程式碼加入啓動檔案中,對於 ubuntu server,編輯/etc/rc.local 檔案,加入以下內容(具體檔案路徑自定):
swapon /srv/SWAPFILE
swapon /srv/SWAPFILE
或者
修改/etc/fstab 檔案,加入以下內容:
/srv/SWAPFILE swap swap defaults 0 0
/srv/SWAPFILE swap swap defaults 0 0
原文連結:http://my.oschina.net/renguijiayi/blog/299150