【轉】揭開Linux的Swap之謎


為什么選擇Linux?因為Linux能讓你掌握你所做的一切!  
為什么痛恨Windows?因為Windows讓你不知道自己在做什么!  
這就是我喜歡Linux的原因。只要我願意,我可以將底層的系統運行機制看得清清楚楚,可以掌握一切。而Windows盡管界面漂亮,卻讓你總也猜不透她心里想什么。我不喜歡若即若離的感覺。  


如果你一看到這個標題就覺得頭疼,或者對Linux的內部技術根本不關心,那么,我勸你一句:別用Linux了。你只是在追趕潮流,並不是真心喜歡它。 Linux的確沒有Windows好用,可它比Windows“結實”。如果你對Linux的穩定性感興趣,特別是想把Linux作為網站服務器的話,那 就請看看下文吧!  

Swap,即交換區,除了安裝Linux的時候,有多少人關心過它呢?其實,Swap的調整對Linux服務器,特別是Web服務器的性能至關重要。通過調整Swap,有時可以越過系統性能瓶頸,節省系統升級費用。  

本文內容包括:  


Swap基本原理  

突破128M Swap限制  

Swap配置對性能的影響  

Swap性能監視  

有關Swap操作的系統命令  
Swap基本原理  

Swap的原理是一個較復雜的問題,需要大量的篇幅來說明。在這里只作簡單的介紹,在以后的文章中將和大家詳細討論Swap實現的細節。  

眾所周知,現代操作系統都實現了“虛擬內存”這一技術,不但在功能上突破了物理內存的限制,使程序可以操縱大於實際物理內存的空間,更重要的是,“虛擬內存”是隔離每個進程的安全保護網,使每個進程都不受其它程序的干擾。  

Swap 空間的作用可簡單描述為:當系統的物理內存不夠用的時候,就需要將物理內存中的一部分空間釋放出來,以供當前運行的程序使用。那些被釋放的空間可能來自一 些很長時間沒有什么操作的程序,這些被釋放的空間被臨時保存到Swap空間中,等到那些程序要運行時,再從Swap中恢復保存的數據到內存中。這樣,系統 總是在物理內存不夠時,才進行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中有壞塊,則在相應的位映射上標記上0,表示此頁不可用。這樣在使用Swap時,不至於用到壞塊,而使系統產生錯誤。  

現在的系統設計者認為:  

1.現在硬盤質量很好,壞塊很少。  

2.就算有,也不多,只需要將壞塊羅列出來,而不需要為每一頁建立映射。  

3.如果有很多壞塊,就不應該將此硬盤作為Swap空間使用。  

於是,現在的Linux取消了位映射的方法,也就取消了128M的限制。直接用地址訪問,限制為2G。  

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的速度是解決不了問題的。  
系統性能監視  

Swap空間的分配固然很重要,而系統運行時的性能監控卻更加有價值。通過性能監視工具,可以檢查系統的各項性能指標,找到系統性能的瓶頸。本文只介紹一下在Solaris下和Swap相關的一些命令和用途。  

最常用的是Vmstat命令(在大多數Unix平台下都有這樣一些命令),此命令可以查看大多數性能指標。  

例如:  
# vmstat 3  
procs memory swap io system cpu  
r b w swpd free buff cache si so bi bo in cs us sy id  
0 0 0 0 93880 3304 19372 0 0 10 2 131 10 0 0 99  
0 0 0 0 93880 3304 19372 0 0 0 0 109 8 0 0 100  
0 0 0 0 93880 3304 19372 0 0 0 0 112 6 0 0 100  
…………  

命令說明:  
vmstat 后面的參數指定了性能指標捕獲的時間間隔。3表示每三秒鍾捕獲一次。第一行數據不用看,沒有價值,它僅反映開機以來的平均性能。從第二行開始,反映每三秒鍾之內的系統性能指標。這些性能指標中和Swap有關的包括以下幾項:  


procs下的w  
它表示當前(三秒鍾之內)需要釋放內存、交換出去的進程數量。  

memory下的swpd  
它表示使用的Swap空間的大小。  

Swap下的si,so  
si表示當前(三秒鍾之內)每秒交換回內存(Swap in)的總量,單位為kbytes;so表示當前(三秒鍾之內)每秒交換出內存(Swap out)的總量,單位為kbytes。  
以上的指標數量越大,表示系統越忙。這些指標所表現的系統繁忙程度,與系統具體的配置有關。系統管理員應該在平時系統正常運行時,記下這些指標的數值,在系統發生問題的時候,再進行比較,就會很快發現問題,並制定本系統正常運行的標准指標值,以供性能監控使用。  

另外,使用Swapon-s也能簡單地查看當前Swap資源的使用情況。例如:  
# swapon -s  
Filename Type Size Used Priority  
/dev/hda9 partition 361420 0 3  

能夠方便地看出Swap空間的已用和未用資源的大小。  

應該使Swap負載保持在30%以下,這樣才能保證系統的良好性能。  

有關Swap操作的系統命令  


增加Swap空間,分以下幾步:  
1)成為超級用戶  
$su - root  

2)創建Swap文件  
# dd if=/dev/zero of=swapfile bs=1024 count=65536  

創建一個有連續空間的交換文件。  

3)激活Swap文件  
#/usr/sbin/swapon swapfile  

swapfile指的是上一步創建的交換文件。 4)現在新加的Swap文件已經起作用了,但系統重新啟動以后,並不會記住前幾步的操作。因此要在/etc/fstab文件中記錄文件的名字,和Swap類型,如:  
/path/swapfile none Swap sw,pri=3 0 0  

5)檢驗Swap文件是否加上  
/usr/sbin/swapon -s  


刪除多余的Swap空間。  
1)成為超級用戶  

2)使用Swapoff命令收回Swap空間。  
#/usr/sbin/swapoff swapfile  

3)編輯/etc/fstab文件,去掉此Swap文件的實體。  

4)從文件系統中回收此文件。  
#rm swapfile  

5)當然,如果此Swap空間不是一個文件,而是一個分區,則需創建一個新的文件系統,再掛接到原來的文件系統上。

 

 

系統管理進階-內存管理
內存管理-交換文件與ramdisk虛擬內存是指使用磁盤當作物理內存的擴展,這樣可用的內存的大小就相應增大了。內核會將暫時不用的內存塊的內容寫到磁 盤上,然后就可以把這塊內存用於其它目的。這些寫到磁盤上的內容或許會被淘汰,只有需要用到這些內容時,它們才會被重新讀入內存。這些操作對用戶來說是完 全透明的;Linux下運行的程序只是看到有大量的內存可供使用而並沒有注意到這些內存是在哪里的。當然,讀寫硬盤要比直接使用真實內存慢得多,所以程序 就不會象一直在內存中運行的那樣快。用作虛擬內存的硬盤部分被稱為交換空間(swap space)。
    Linux能夠使用文件系統中的一個常規文件或一個獨立的分區作為交換空間。交換分區要快一些,但是交換文件的大小很容易改變,而且無需重分區整個硬盤, 當你知道你需要多大的交換空間時,你應該使用交換分區,但是如果你不能確定的話,你可以首先使用一個交換文件,然后使用一段時間,你就能得到你確實需要的 交換空間的大小,然后,你就能夠創建一個合適大小交換分區。Linux允許同時使用幾個交換分區以及/或者交換文件,如果你只是偶爾地另外需要一個交換空 間時,你可以在當時設置一個額外的交換文件,而不是重新分區來改變交換分區的大小。
    現在介紹如何創建交換空間。一個交換文件是一個普通的文件,它的要求是它不能有空洞,並且它是用mkswap來准備的,所以它必須在本地硬盤上。如何創建一個交換文件呢?你可以用如下命令創建一個能用的交換文件:
#dd if=/dev/zero of=/SwapFile bs=1024 count=2048
    這樣就創建一個2048K字節的交換文件,由於內存頁面的大小是4K字節,所以count最好是4的倍數才能完全利用。而交換分區的創建和其他分區的創建是一樣的,只是類型不一樣而已。
    創建完交換空間后,就需要用mkswap給交換空間加上一些必要的初始化信息:
#mkswap /SwapFile 2048
    此時交換空間還沒有被內核作為虛擬內存使用,它現在只是存在而已。使用mkswap的時候必須非常小心,因為它不檢查這個文件或分區是否已被別人使用,這樣就有可能覆蓋到重要的文件以及分區。
一個已初始化的交換空間必須使用命令swapon命令告訴內核這個交換空間可以被使用了。命令如下:
#swapon /SwapFile
如果把相關信息寫入/etc/fstab就能啟動系統后自動使用交換空間了。
#swapon –a
這個命令會把所有列在fstab中的交換空間啟動起來。而
#swapoff
這個命令則會把swapon –a啟動的交換空間移走。
要看內存的使用情況,可以使用命令:
#free
輸出的第一行(Mem:)顯示出物理內存的使用情況。總和(total)列中並沒有顯示出被內核使用的內存,它通常將近一兆字節。已用列(used column)顯示出已用內存的總和(第二行沒有把緩沖算進來)。空閑列(free column)顯示了所有未被使用的空閑內存。共享列(shared column)顯示出了被幾個進程共享的內存的大小;共享的內存越多,情況就越好。緩存列(buffer column)顯示出了當前磁盤緩存的大小。已緩沖列(cached column)顯示出了已使用的緩存的大小。
    最后一行(Swap:)顯示出了與交換空間相應的信息。如果這一行的數值都是零,表示你的交換空間沒有被擊活。
    這里討論一下交換空間的大小問題:有些人會對你說需要用物理內存的兩倍容量來分配交換空間,這種方法是不符合實際的。合適的做法應該是: 估計你某一時刻你所需要的最大的內存容量,也就是在同一時刻你運行的所有程序所需內存的總和,你可以通過同時運行所有的程序做到這一點。 舉些實際的例子,運行X系統將需要分配大約8MB內存,gcc需要幾兆字節,內核本身要用大約1兆字節、普通的shell以及其它一些工具可能需要幾百千 字節。粗略的估計一下就能得到個接近的數字,但你必須考慮到最壞的情況,例如有幾個人同時使用這個系統,他們都將消耗內存。Free以及ps命令對估計所 需的內存容量是很有幫助的。基於上面的計算,你就知道了你將需要總和為多少的內存。所以,為了分配交換空間,你僅需從所需總內存量中減去實際物理內存的容 量,你就知道了你需要多少的交換空間。如果你計算出的交換空間容量遠遠大於你的物理內存(大於兩倍以上),你通常需要再買些內存來,否則的話,系統的性能 將非常低。
    上面講的交換空間是把磁盤空間當內存使用,但是在有些場合,我們需要一個高速的磁盤空間,這個剛好和上面相反,我們可以用RamDisk把物理內存當磁盤使用,以實現這個需求。
    使用ramdisk是一件很簡單的事。首先,需要你的內核支持RamDisk,然后你所需要做的就是格式化一個ramdisk並且把他掛接到一個目錄上。可以用:
#ls -al /dev/ram*
列出所有可用的ramdisk。這些ramdisk並不搶奪內存,除非進行格式化的一類操作。這里有一個使用ramdisk的例子:
#mkdir /tmp/ramdisk
#mke2fs /dev/ram0
#mount /dev/ram0 /tmp/ramdisk
    這三個命令將為ramdisk創建一個目錄,創建ramdisk文件系統,並且加載這個ramdisk到/tmp/ramdisk.。現在你可以將這個目錄象使用其它的目錄一樣使用。
ramdisk的默認大小是 4Mb=4096 blocks. 在你進行mke2fs的時候你可以看到你的ramdisk的大小。執行df -k /dev/ram0 你實際用了多少空間:
#df -k /dev/ram0
    在系統重新啟動的時候,將刷新這個區域,所以不要將任何沒有拷貝的數據放在這個區域。如果你對這個目錄進行了修改,並且需要保留這些修改,采取一些辦法進行備份。
    那么如何改變 ramdisks 的大小呢?你可以在lilo.conf文件中加入這一行:
ramdisk_size=10000,這樣在你使用lilo命令和重新啟動計算機之后,ramdisk的默認大小將會是10M。這是一個/etc/lilo.conf文件的例子:
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=10
image=/boot/vmlinuz
label=linux
root=/dev/hda1
read-only
ramdisk_size=10000
    當你以模塊的形式編譯ramdisk時,你可以在加載的時候決定ramdisk的大小。這也可以通過修改/etc/conf.modules 的選項設置來做到。
options rd rd_size=10000 ,或是在命令行中指定參數給ismod
insmod rd rd_size=10000
以下是介紹如何使用這樣的模塊
1)卸載ramdisk,
#umount /tmp/ramdisk
2)卸載模塊(再上一節所提到的過程中自動加載),
#rmmod rd
3)加載ramdisk模塊並且把它的大校設為20M,
#insmod rd rd_size=20000
4)創建一個文件系統,
#mke2fs /dev/ram0
5)加載ramdisk,
# mount /dev/ram0 /tmp/ramdisk
    在實際應用中,我們可以把RamDisk掛接到web服務器的目錄,或者mail服務的目錄,以實現快速的反應。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM