揭開Linux作業系統的Swap交換區之謎

2021-04-26 11:58:29 字數 4142 閱讀 6696

2009-04-08 09:37

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

swap,即交換區,除了安裝linux的時候,有多少人關心過它呢?其實,swap的調整對linux伺服器,特別是web伺服器的效能至關重要。通過調整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伺服器能根據不同的請求數量衍生出多個服務程序(或執行緒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表示每三秒鐘捕獲一次。第一行資料不用看,沒有價值,它僅反映開機以來的平均效能。從第二行開始,反映每三秒鐘之內的系統效能指標。這些效能指標中和swap有關的包括以下幾項:

procs下的w

它表示當前(三秒鐘之內)需要釋放記憶體、交換出去的程序數量。

memory下的swpd

它表示使用的swap空間的大小。

swap下的si,so

si表示當前(三秒鐘之內)每秒交換回記憶體(swap in)的總量,單位為kbytes;so表示當前(三秒鐘之內)每秒交換出記憶體(swap out)的總量,單位為kbytes。

以上的指標數量越大,表示系統越忙。這些指標所表現的系統繁忙程度,與系統具體的配置有關。系統管理員應該在平時系統正常執行時,記下這些指標的數值,在系統發生問題的時候,再進行比較,就會很快發現問題,並制定本系統正常執行的標準指標值,以供效能監控使用。

另外,使用swapon-s也能簡單地檢視當前swap資源的使用情況。例如:

能夠方便地看出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

4)從檔案系統中**此檔案。

#rm swapfile

5)當然,如果此swap空間不是乙個檔案,而是乙個分割槽,則需建立乙個新的檔案系統,再掛接到原來的檔案系統上。

揭開Linux作業系統的Swap交換區之謎

2009 04 08 09 37 swap,即交換區,除了安裝linux的時候,有多少人關心過它呢?其實,swap的調整對linux伺服器,特別是web伺服器的效能至關重要。通過調整swap,有時可以越過系統效能瓶頸,節省系統公升級費用。swap,即交換區,除了安裝linux的時候,有多少人關心過它...

揭開神秘面紗!谷歌Chrome OS作業系統大揭秘

北京時間11月20日凌晨訊息,谷歌於美國西部時間11月19日上午10點 北京時間11月20日凌晨2點 在美國總部舉行了chrome os開源操 作系統的新聞發布會,谷歌產品副總裁sundar pichai和谷歌chrome作業系統工程總監matthew papakipos兩位高管對 chrome o...

Linux 作業系統原理 作業系統的本質

在作業系統尚不存在的年代,人們通過各種按鈕來控制計算機,這一過程非常麻煩。於是,有人開發出了僅僅具有載入和執行功能的監控程式 supervisor 這就是作業系統的原型。通過監控程式,程式設計師可以根據需要將各種應用程式載入到記憶體中執行。雖然仍舊比較麻煩,但現在開發的工作量得到了很大的緩解。隨著時...