最近看到有朋友在我的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分佈到每塊磁碟上,這時確實可以提高執行速度。
 
        當然,文章中的不足,歡迎各位朋友指出,大家一起學習進步。