如何合理設置Linux的swap分區

原鏈:http://commandos.blog.51cto.com/154976/258608/
作者:“玄武·巴依”(應作者博文要求)


什麼是Swap?
Swap,即交換區,除了安裝Linux的時候,有多少人關心過它呢?其實,Swap的調整對Linux服務器,特別是Web服務器的性能至關重要。通過調整Swap,有時可以越過系統性能瓶頸,節省系統升級費用。
Swap的原理是一個較複雜的問題,需要大量的篇幅來說明。在這裏只作簡單的介紹,在以後的文章中將和大家詳細討論Swap實現的細節。
衆所周知,現代操作系統都實現了“虛擬內存”這一技術,不但在功能上突破了物理內存的限制,使程序可以操縱大於實際物理內存的空間,更重要的是,“虛擬內存”是隔離每個進程的安全保護網,使每個進程都不受其它程序的干擾。
Swap空間的作用可簡單描述爲:當系統的物理內存不夠用的時候,就需要將物理內存中的一部分空間釋放出來,以供當前運行的程序使用。那些被釋放的空間可能來自一些很長時間沒有什麼操作的程序,這些被釋放的空間被臨時保存到Swap空間中,等到那些程序要運行時,再從Swap中恢復保存的數據到內存中。這樣,系統總是在物理內存不夠時,才進行Swap交換。
計算機用戶會經常遇這種現象。例如,在使用Windows系統時,可以同時運行多個程序,當你切換到一個很長時間沒有理會的程序時,會聽到硬盤“嘩嘩”直響。這是因爲這個程序的內存被那些頻繁運行的程序給“偷走”了,放到了Swap區中。因此,一旦此程序被放置到前端,它就會從Swap區取回自己的數據,將其放進內存,然後接着運行。
需要說明一點,並不是所有從物理內存中交換出來的數據都會被放到Swap中(如果這樣的話,Swap就會不堪重負),有相當一部分數據被直接交換到文件系統。例如,有的程序會打開一些文件,對文件進行讀寫(其實每個程序都至少要打開一個文件,那就是運行程序本身),當需要將這些程序的內存空間交換出去時,就沒有必要將文件部分的數據放到Swap空間中了,而可以直接將其放到文件裏去。如果是讀文件操作,那麼內存數據被直接釋放,不需要交換出來,因爲下次需要時,可直接從文件系統恢復;如果是寫文件,只需要將變化的數據保存到文件中,以便恢復。但是那些用malloc和new函數生成的對象的數據則不同,它們需要Swap空間,因爲它們在文件系統中沒有相應的“儲備”文件,因此被稱作“匿名”(Anonymous)內存數據。這類數據還包括堆棧中的一些狀態和變量數據等。所以說,Swap空間是“匿名”數據的交換空間。
如何設置Swap分區大小
我記得曾經有人對Swap分區大小的設置這樣評論過:“只要不怕浪費硬盤的話越大越好,因爲linux內核在物理內存完全用完之前不會去動swap”
不過根據我的經驗,可能不是這樣喔!太大的 swap 空間會造成 kernel 以爲有巨大的內存空間而毫不節制的想要把數據捉進內存中,從而導致 kernel 一直在做 memory swap,連帶拖慢系統響應時間。
老實說,1G RAM 如果不跑 p2p 之類的東西,那設個 256MB 就夠用了;有 2G 的話連設都不要設。
另外如果說真的因爲某一軟件確實需要巨大內存空間才能運作的話,那只好在 swap 上動手腳,但爲了效能最好分散在多個實體硬盤上(等於類似 raid 效果)!
其實如何設置Swap分區的大小是最能檢查一個Linux系統管理員的水平的測試,Swap到底該如何設置呢?我是這樣認爲的:首先我們需要了解這臺服務器都要運行哪些程序、他們各自佔用的內存大小爲多少,經過確切的檢查後,Swap分區的大小可以這樣確定:
( 內存大小 + Swap分區大小 ) * 80%或70% = 程序需要佔用總內存數
Swap分區在程序測試期間也有很大的用途,例如管理員能夠通過Swap分區的使用狀況,監測系統內存是否出現泄露,同時對Web項目等應用也可以提供一個比較好的流量峯值緩衝作用。一個Linux系統管理員要能夠通過監測Swap分區的使用情況,對系統、程序有一個合理的評價。
系統性能監視 
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空間不是一個文件,而是一個分區,則需創建一個新的文件系統,再掛接到原來的文件系統上。



原鏈:http://commandos.blog.51cto.com/154976/258608/
博文題目:再談Linux下的swap分區
最近看到有朋友在我的Blog中問關於Linux環境下swap分區設置的問題,問題如下:“需要設置一個10G的swap分區,是設置成單個10G的好呢,還是5個2G的,還是其他的方案,比如2個5G的分區?”
        看來有必要再寫一篇Blog來闡述一下這個問題。
 
        在網絡上我經常看到這樣的經典問答:
                問:我的內存大小是xxx,那麼我建立的swap多少才合適? 
                答:大概物理內存的1倍即可。
        我認爲這種回答是很不負責任的,所謂1倍內存大小或2倍內存大小的swap分區設置,是給那些對Linux系統不是很熟悉的用戶的簡單建議,這種設置在桌面Linux下是沒有什麼問題的,最多是佔用一些硬盤空間而已。但是在真正的生產環境下,這種設置是很不合理的一種設置。
        對swap的簡單介紹在我以前的《如何合理設置Linux的swap分區》這篇文章中介紹過,我在這裏就不再介紹了,有興趣的朋友可以去看一看。
一、swap分區大小是怎麼確定的?
        其實swap分區的大小設置是很考驗Linux系統管理員水平的一件事情,swap的大小是這樣決定的:
         ( 內存大小 + Swap分區大小 ) * 80%或70% >= 程序需要佔用總內存數
        如果系統內存大小已經大於系統中所有任務最大內存使用大小,那麼就根本沒有必要設置swap分區了,如果這個時候設置上,那麼就是白白佔用了那些硬盤空間(當然,如果硬盤足夠富裕,可以忽略這些佔用了)。
        那麼有的管理員就會說了:我不知道我係統中所有任務最大內存使用大小是多少啊!
        我在這裏給你一個方法,可以找到這個大小是多少,下面跟着我一步一步來:
1、用swapoff 關掉所有swap 然後正常運行任務,如果出現內存不足的提示,就需要逐步增加swap
2、一般來講,物理內存達到256m,在安裝時即可不用劃分交換分區.。
3、可以在安裝後建立交換分區,或者建立交換文件。
        BTW:swap還有一個用處,就是在機器lock,出現問題的時候內存的內容會自動copy到swap上面,這樣可以有效防止機器故障帶來內存中的內容忽然丟失的情況。
二、爲什麼swap分區不宜過大?
        爲什麼 swap 分區不宜過大,這是由於 Linux 內存分配的特點——它會儘可能多地使用內存(包括swap 分區)。儘量使用內存的目的是加快 IO 處理的速度,比如關掉一個程序,原先佔有的內存空間並不立即清空,下一次打開時就不用去硬盤找數據,而直接從內存中讀取。但是如果虛擬內存過大,那麼保留在內存緩衝區中的數據實際上還是在硬盤中,那對於加快速度就沒有多大的作用了。 
        swap 分區對於物理內存小的機器是必不可少的,假設物理內存只有64M,而某個程序啓動最少要256M,如果沒有足夠的虛擬內存,這個程序是根本打不開的(系統會報內存不足錯誤,甚至崩潰)。對於程序而言,物理內存和虛擬內存是沒有任何區別的,它們只關心空間是否夠大。在物理內存夠用的情況下可以適當分配一些空間給 swap ,這僅僅是爲了偶爾同時開很多大傢伙時,防止出現內存不足錯誤。
三、swap是一個大分區還是多個小分區?
        我記得有人說過在fedora和debian的文檔中看到過說明,建議swap分區大小不要超過2G。
        爲什麼是2G呢?我覺得首先是由於32位機的文件偏移指針是個無符號整型,所以單個文件偏移最大到2的31次方,也就是2G。其次,舊的文件系統對大文件的支持並不是很好(有點類似Windows環境下FAT文件格式不能有文件大小限制),所以在文檔中建議swap分區大小不超過2G(要知道swap是可以在運行過程中動態加載swap文件的)。
        如果各位使用的是2.4+內核或者64位的系統,那麼可以放心地把swap分區設置的足夠大,IBM在針對其Linux 2.4 kernel的文檔中明確表明,2.4.10及以後的linux kernel,支持的每塊swap最大不超過24GB。
        下面再說說設置多個swap的好處,那就是可以把多個swap分擔到多塊硬盤上,如果你有多個物理磁盤,建議在把swap分佈到每塊磁盤上,這時確實可以提高運行速度。
 
        當然,文章中的不足,歡迎各位朋友指出,大家一起學習進步。

評論:文章的內容對不對我不敢確定,但是博文中知識點值得一看。

發佈了15 篇原創文章 · 獲贊 3 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章