Linux 管理員手冊(4)--記憶體管理(轉)

gugu99發表於2007-08-10
Linux 管理員手冊(4)--記憶體管理(轉)[@more@]

  本章說明Linux的記憶體管理特徵,即虛擬記憶體和磁碟快取。描述系統管理員應該考慮的東西、工作和目的。

  什麼是虛擬記憶體?

  Linux支援虛擬記憶體, 就是使用磁碟作為RAM的擴充套件,使可用記憶體相應地有效擴大。核心把當前不用的記憶體塊存到硬碟,騰出記憶體給其他目的。當原來的內容又要使用時,再讀回記憶體。這對使用者全透明:執行於Linux的程式只看到大量的可用記憶體而不甘心哪部分在磁碟上。當然,讀寫硬碟比真的記憶體慢(慢千倍),所以程式執行較慢。用做虛擬記憶體的這部分硬碟叫 對換空間。

  Linux可以使用檔案系統中的普通檔案或單獨的分割槽作為對換空間。對換分割槽更快,但對換檔案更易於改變大小(無須對硬碟重分割槽)。如果知道要多少對換空間,應該用對換分割槽;如果不能確認,可以先用對換檔案,用一段時間後再根據所需空間建立對換分割槽。

  Linux允許同時使用多個對換分割槽和/或對換檔案。即如果偶爾需要更多的對換空間,可以隨時建立一個額外的對換檔案。

  產生對換空間

  對換檔案是普通檔案,對核心沒有什麼特別的。唯一不同是它沒有孔,用 mkswap 準備。必須在本地盤上,不能在透過NFS mount的檔案系統中。

  關於孔,是重要的。對換檔案保留了磁碟空間,使核心能快速對換出一頁,而不必經過如檔案的定位磁碟扇區的全部事情。核心只用分配給這個檔案的所有扇區。由於檔案中的孔意味著沒有為檔案中這個位置分配磁碟扇區,這對核心使用不利。

  產生沒有孔的對換檔案的一個好辦法是透過如下命令:

  $ dd if=/dev/zero of=/extra-swap bs=1024 count=1024

1024+0 records in

1024+0 records out

$

  /extra-swap 是對換檔名,大小由count=給出. 大小最好是4的倍數,因為核心寫出的記憶體頁是4KB。如果不是4的倍數,最後那幾KB將不可用。

  對換分割槽也沒什麼特別。就象產生其他分割槽一樣產生;唯一的不同是它作為原始分割槽使用,即沒有任何檔案系統,最好將對換分割槽標記為型別82(Linux swap),雖然這對核心沒有影響,但這使分割槽列表更清晰。

  產生對換檔案或對換分割槽後,需要寫個標記起用它,這包括核心要用的一些管理資訊。命令是 mkswap , 用法如下:

  $ mkswap /extra-swap 1024

Setting up swapspace, size = 1044480 bytes

$

  注意對換空間現在還沒用,它存在,但核心還沒用它提供虛擬記憶體。

  請一定小心使用mkswap , 因為它不檢查檔案或分割槽是否被其他東西使用。 你可能用mkswap 很容易地覆蓋了重要檔案和分割槽! 幸好,你只需在你安裝系統時使用mkswap 。

  Linux記憶體管理限制了每個對換空間約為127MB(由於技術原因,實際限制是127.6875MB)。 可以同時使用最多16個對換空間,總計差不多2GB。

  使用對換空間

  用swapon 將一個初始化的對換空間可用。此命令告訴核心對換空間可以用了,對換空間的路徑作為引數,啟動一個臨時對換檔案可以用如下命令:

  $ swapon /extra-swap

$

  對換空間如果列入/etc/fstab ,就可自動使用。

  /dev/hda8 none swap sw 0 0

/swapfile none swap sw 0 0

  啟動手稿執行命令swapon -a, 它將啟動/etc/fstab 中所列的所有對換空間。因此swapon 命令只有在啟動額外的對換空間時才使用。

  可以用free 監視對換空間的使用,它將給出所有使用的對換空間。

  $ free

total used free shared buffers

Mem: 15152 14896 256 12404 2528

-/+ buffers: 12368 2784

Swap: 32452 6684 25768

$

  前一行輸出(Mem:)顯示實體記憶體。 Total列不顯示核心使用的實體記憶體(通常大約1MB)。Used列顯示被使用的記憶體總額(第二行不計緩衝)。 Free列顯示全部沒使用的記憶體。Shared列顯示多個程式共享的記憶體總額。Buffers列顯示磁碟快取的當前大小。

  後一行(Swap:)對對換空間,顯示的資訊類似上面。如果這行為全0,那麼沒使用對換空間。

  透過top ,或使用proc檔案系統的/proc/meminfo 檔案可以得到相同的資訊。得到某個對換空間的使用資訊目前還比較困難。

  可用swapoff 取消對換空間,一般不必這樣,除非是臨時對換空間。對換空間中的要用的頁被換入(swap->RAM),如果沒有足夠的實體記憶體,就被換出(RAM->swap,到其他對換空間)。如果沒有足夠的虛擬記憶體放進所有頁面,Linux將開始震盪(thrash); 很長時間以後應該能恢復,但此時系統不可用。取消一個對換空間前,應該檢查(例如用free )是否有足夠的實體記憶體。

  用swapon -a自動使用的所有對換空間可以用swapoff -a取消。它檢視檔案/etc/fstab 得知要取消什麼。任何手工起用的對換空間將依然使用著。

  即使有許多空閒的實體記憶體,有時許多對換空間也被使用著。這種情況是由於在某個時間需要對換,但後來一個佔用大量實體記憶體的大程式終止並釋放了記憶體。直到被換出的資料要被使用之前它們並不自動換入。不必顧慮這種情況,但知道為什麼會發生這種情況會更安心。

  與其他作業系統共享對換空間

  許多作業系統內建虛擬記憶體。由於他們只需在執行時使用,即,不會同時,那麼除了當前執行的,其他所有對換空間都浪費著。如果他們共享同一個對換空間將更有效。這是可能的但需要一些Hacking工作。 Tips-HOWTO包含了一些如何完成這項任務的忠告。

  分配對換空間

  也許有人告訴你,應該分配2倍於實體記憶體的對換空間,但這是個虛假的規律。下面說明如何正確:

  估計你的全部記憶體需求。這是你可能需要的最大量,即你要同時執行的所有程式所需的記憶體要求的總和。你可以同時執行你可能同時執行的所有程式試試。

  例如,如果你想執行X,你得分配8MB給他,gcc要求數MB(有些檔案偶爾可能需要很大量,數十MB,但一般4MB差不多),等等。核心自己使用1MB,Shell和一些小工具可能需要幾百KB(或說,總共1MB)。不必太精確,粗略估計就行,但可以較悲觀地考慮。

  記得如果將有多人同時使用系統,他們將都消耗記憶體。如果2個人同時執行相同的程式,總記憶體消耗一般並非加倍,因為內碼表和共享庫是單一的。

  free 和ps 命令對估計記憶體需求很有用。

  第一步的估計加上一些安全量。因為對程式大小的估計很可能是錯誤的,因為你可能忘了一些要執行的程式,並確定你有一些額外空間。應該有數MB。(分配太多對換空間比分配太少好,但不必過分,因為不使用的對換空間是浪費;見後文:關於增加對換空間。) Also,since it is nicer to deal with even numbers, you can round the value up to the next full megabyte.

  基於以上計算,你知道了你總共需要多少記憶體。減去你的實際實體記憶體,就是對換空間。 (有些版本的UNIX中,你還需要分配實體記憶體的映象空間,所以第二布中計算的你所需的空間就不能減)

  如果你計算的對換空間比你的實際實體記憶體大得多(大於好幾倍以上),那麼你也許需要更多的實體記憶體,否則系統效能將太低。

  即使計算顯示你無須對換空間,最好還是至少有一些。Linux有些侵略性地使用對換空間,這樣保持一定的空閒實體記憶體。即使記憶體還不為什麼程式所需,Linux也會換出一些不用的記憶體頁,這樣在需要的時候就可以避免因對換的等待--即對換可以在硬碟空閒的時候提早完成。

  對換空間可以分在幾個硬碟中,這有時可以提高效能,依賴於這些盤的相對速度和存取模式。你可以嘗試幾中方案,但要知道正確地嘗試是很困難的。不要相信某種方案比其他方案好的斷定,因為它不會總是對的。

  快取記憶體

  與存取(真正的)記憶體相比,從磁碟讀是很慢的 另外,在相對短的一端時間裡,多次讀硬碟相同的部分是很常見的。例如,你可能先讀了一封電子郵件,然後回覆時又將它讀入編輯器,然後複製它到一個資料夾時又用郵件程式讀它。或者,考慮命令ls 可能被系統上的很多使用者多麼頻繁地使用。只從磁碟讀一次資訊,並保持在硬碟中,知道不再需要,除了第一次讀,其他都會較快。這就叫磁碟快取disk buffering,用於此目的的記憶體叫buffer cache。

  不幸的是,由於記憶體是有限且缺乏的資源,buffer cache一般不會足夠大(大到能夠裝下所有人可能用到的資料)。當cache滿時,最長時間不用的資料將被丟棄,記憶體釋放給最新的資料。

  磁碟緩衝也用於寫操作。要寫的資料經常馬上又被讀(例如一個原始碼檔案儲存到檔案中後又被編譯器讀出),所以將要寫的資料放在緩衝裡是個好主意。另外,只將資料放如cache而不馬上寫到磁碟,寫操作的程式執行速度更快。寫操作然後可以在後臺完成,而不降低其他程式的速度。

  許多作業系統有buffer caches (即使名稱不同),但並非都根據上述原理。有些是透寫write-through: 資料馬上寫到磁碟(當然也同時寫到cache) 不馬上寫的cache叫回寫write-back。回寫比透寫更有效,但也更容易出錯:如果系統崩潰,或電源突然掉電,或軟盤在cache回寫前被取出,那麼cache中改變的資料將丟失。這可能意味著檔案系統is not in full working order, 可能由於未寫資料包含了系統記錄資訊的重要的變化。

  因此,千萬不要不經過正常的關閉過程直接關閉電源(見6章), 或沒有unmount就取出軟盤(如果是mount的),或什麼程式還在用著軟盤,或軟盤燈還在閃。 sync 命令重新整理緩衝,即強制將所有未寫資料寫回磁碟,如果要確保所有資料安全回寫,可以用它。傳統的UNIX系統中,有個update 程式在後臺執行,它每30秒執行一次 sync ,所以通常無須使用sync 。 Linux有一個另外的守侯程式bdflush ,它克服了sync 有時因磁碟I/O負荷太重(因為頻繁的操作)而導致有時系統突然呆住的問題。

  Linux下,bdflush 由update 啟動。一般無須考慮它,但如果bdflush 偶爾因為什麼原因死了,核心會給出警告,此時應該手工啟動它(/sbin/update )。

  cache並不真正緩衝檔案,而是塊,就是磁碟I/O的最小單元(Linux下,一般是1kB)。這樣,所有的目錄、超級塊、其他檔案系統記錄資料和無檔案系統磁碟都可以被緩衝。

  cache的效果決定於其大小。太小的cache幾乎無用;它只能cache很少的資料,而可能在被重用前就被清除了。大小有賴於有多少資料被讀寫,相同的資料的存取頻度。唯一的方法是實驗。

  如果cache是固定大小,那麼不應該太大,否則,會由於空閒記憶體空間太小而使用swap(也很慢)。為了最有效地使用真實記憶體,Linux自動使用所有空閒記憶體作為buffer cache,當程式需要更多記憶體時,自動減少cache。

  Linux下,對cache使用無須做任何工作,它完全是自動的。除了要正常關閉系統和取出軟盤,無須關心cache。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-939994/,如需轉載,請註明出處,否則將追究法律責任。

相關文章