Linux管理員手冊(4)--內存管理

本章說明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。
相關文章
相關標籤/搜索