Linux 管理員手冊(4)

來源:互聯網
上載者:User

本章說明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。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.