欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Linux管理員手冊(cè)(4)--內(nèi)存管理

 更新時(shí)間:2006年10月24日 00:00:00   作者:  
本章說明Linux的內(nèi)存管理特征,即虛擬內(nèi)存和磁盤緩存。描述系統(tǒng)管理員應(yīng)該考慮的東西、工作和目的。

  什么是虛擬內(nèi)存?

  Linux支持虛擬內(nèi)存, 就是使用磁盤作為RAM的擴(kuò)展,使可用內(nèi)存相應(yīng)地有效擴(kuò)大。核心把當(dāng)前不用的內(nèi)存塊存到硬盤,騰出內(nèi)存給其他目的。當(dāng)原來的內(nèi)容又要使用時(shí),再讀回內(nèi)存。這對(duì)用戶全透明:運(yùn)行于Linux的程序只看到大量的可用內(nèi)存而不甘心哪部分在磁盤上。當(dāng)然,讀寫硬盤比真的內(nèi)存慢(慢千倍),所以程序運(yùn)行較慢。用做虛擬內(nèi)存的這部分硬盤叫 對(duì)換空間。

  Linux可以使用文件系統(tǒng)中的普通文件或單獨(dú)的分區(qū)作為對(duì)換空間。對(duì)換分區(qū)更快,但對(duì)換文件更易于改變大小(無須對(duì)硬盤重分區(qū))。如果知道要多少對(duì)換空間,應(yīng)該用對(duì)換分區(qū);如果不能確認(rèn),可以先用對(duì)換文件,用一段時(shí)間后再根據(jù)所需空間建立對(duì)換分區(qū)。

  Linux允許同時(shí)使用多個(gè)對(duì)換分區(qū)和/或?qū)Q文件。即如果偶爾需要更多的對(duì)換空間,可以隨時(shí)建立一個(gè)額外的對(duì)換文件。

  產(chǎn)生對(duì)換空間

  對(duì)換文件是普通文件,對(duì)核心沒有什么特別的。唯一不同是它沒有孔,用 mkswap 準(zhǔn)備。必須在本地盤上,不能在通過NFS mount的文件系統(tǒng)中。

  關(guān)于孔,是重要的。對(duì)換文件保留了磁盤空間,使核心能快速對(duì)換出一頁,而不必經(jīng)過如文件的定位磁盤扇區(qū)的全部事情。核心只用分配給這個(gè)文件的所有扇區(qū)。由于文件中的孔意味著沒有為文件中這個(gè)位置分配磁盤扇區(qū),這對(duì)核心使用不利。

  產(chǎn)生沒有孔的對(duì)換文件的一個(gè)好辦法是通過如下命令:

  $ dd if=/dev/zero of=/extra-swap bs=1024 count=1024
  1024+0 records in
  1024+0 records out
  $
  /extra-swap 是對(duì)換文件名,大小由count=給出. 大小最好是4的倍數(shù),因?yàn)楹诵膶懗龅膬?nèi)存頁是4KB。如果不是4的倍數(shù),最后那幾KB將不可用。

  對(duì)換分區(qū)也沒什么特別。就象產(chǎn)生其他分區(qū)一樣產(chǎn)生;唯一的不同是它作為原始分區(qū)使用,即沒有任何文件系統(tǒng),最好將對(duì)換分區(qū)標(biāo)記為類型82(Linux swap),雖然這對(duì)核心沒有影響,但這使分區(qū)列表更清晰。

  產(chǎn)生對(duì)換文件或?qū)Q分區(qū)后,需要寫個(gè)標(biāo)記起用它,這包括核心要用的一些管理信息。命令是 mkswap , 用法如下:

  $ mkswap /extra-swap 1024
  Setting up swapspace, size = 1044480 bytes
  $

  注意對(duì)換空間現(xiàn)在還沒用,它存在,但核心還沒用它提供虛擬內(nèi)存。

  請(qǐng)一定小心使用mkswap , 因?yàn)樗粰z查文件或分區(qū)是否被其他東西使用。 你可能用mkswap 很容易地覆蓋了重要文件和分區(qū)! 幸好,你只需在你安裝系統(tǒng)時(shí)使用mkswap 。

  Linux內(nèi)存管理限制了每個(gè)對(duì)換空間約為127MB(由于技術(shù)原因,實(shí)際限制是127.6875MB)。 可以同時(shí)使用最多16個(gè)對(duì)換空間,總計(jì)差不多2GB。
  使用對(duì)換空間

  用swapon 將一個(gè)初始化的對(duì)換空間可用。此命令告訴核心對(duì)換空間可以用了,對(duì)換空間的路徑作為參數(shù),啟動(dòng)一個(gè)臨時(shí)對(duì)換文件可以用如下命令:

  $ swapon /extra-swap
  $


  對(duì)換空間如果列入/etc/fstab ,就可自動(dòng)使用。

  /dev/hda8 none swap sw 0 0
  /swapfile none swap sw 0 0

  啟動(dòng)手稿運(yùn)行命令swapon -a, 它將啟動(dòng)/etc/fstab 中所列的所有對(duì)換空間。因此swapon 命令只有在啟動(dòng)額外的對(duì)換空間時(shí)才使用。
  可以用free 監(jiān)視對(duì)換空間的使用,它將給出所有使用的對(duì)換空間。

  $ free
  total used free shared buffers
  Mem: 15152 14896 256 12404 2528
  -/+ buffers: 12368 2784
  Swap: 32452 6684 25768
  $

  前一行輸出(Mem:)顯示物理內(nèi)存。 Total列不顯示核心使用的物理內(nèi)存(通常大約1MB)。Used列顯示被使用的內(nèi)存總額(第二行不計(jì)緩沖)。 Free列顯示全部沒使用的內(nèi)存。Shared列顯示多個(gè)進(jìn)程共享的內(nèi)存總額。Buffers列顯示磁盤緩存的當(dāng)前大小。
  后一行(Swap:)對(duì)對(duì)換空間,顯示的信息類似上面。如果這行為全0,那么沒使用對(duì)換空間。

  通過top ,或使用proc文件系統(tǒng)的/proc/meminfo 文件可以得到相同的信息。得到某個(gè)對(duì)換空間的使用信息目前還比較困難。

  可用swapoff 取消對(duì)換空間,一般不必這樣,除非是臨時(shí)對(duì)換空間。對(duì)換空間中的要用的頁被換入(swap->RAM),如果沒有足夠的物理內(nèi)存,就被換出(RAM->swap,到其他對(duì)換空間)。如果沒有足夠的虛擬內(nèi)存放進(jìn)所有頁面,Linux將開始震蕩(thrash); 很長(zhǎng)時(shí)間以后應(yīng)該能恢復(fù),但此時(shí)系統(tǒng)不可用。取消一個(gè)對(duì)換空間前,應(yīng)該檢查(例如用free )是否有足夠的物理內(nèi)存。

  用swapon -a自動(dòng)使用的所有對(duì)換空間可以用swapoff -a取消。它查看文件/etc/fstab 得知要取消什么。任何手工起用的對(duì)換空間將依然使用著。

  即使有許多空閑的物理內(nèi)存,有時(shí)許多對(duì)換空間也被使用著。這種情況是由于在某個(gè)時(shí)間需要對(duì)換,但后來一個(gè)占用大量物理內(nèi)存的大進(jìn)程終止并釋放了內(nèi)存。直到被換出的數(shù)據(jù)要被使用之前它們并不自動(dòng)換入。不必顧慮這種情況,但知道為什么會(huì)發(fā)生這種情況會(huì)更安心。

  與其他操作系統(tǒng)共享對(duì)換空間

  許多操作系統(tǒng)內(nèi)置虛擬內(nèi)存。由于他們只需在運(yùn)行時(shí)使用,即,不會(huì)同時(shí),那么除了當(dāng)前運(yùn)行的,其他所有對(duì)換空間都浪費(fèi)著。如果他們共享同一個(gè)對(duì)換空間將更有效。這是可能的但需要一些Hacking工作。 Tips-HOWTO包含了一些如何完成這項(xiàng)任務(wù)的忠告。

  分配對(duì)換空間

  也許有人告訴你,應(yīng)該分配2倍于物理內(nèi)存的對(duì)換空間,但這是個(gè)虛假的規(guī)律。下面說明如何正確:

  估計(jì)你的全部?jī)?nèi)存需求。這是你可能需要的最大量,即你要同時(shí)運(yùn)行的所有程序所需的內(nèi)存要求的總和。你可以同時(shí)運(yùn)行你可能同時(shí)運(yùn)行的所有程序試試。

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

  記得如果將有多人同時(shí)使用系統(tǒng),他們將都消耗內(nèi)存。如果2個(gè)人同時(shí)運(yùn)行相同的程序,總內(nèi)存消耗一般并非加倍,因?yàn)榇a頁和共享庫是單一的。

  free 和ps 命令對(duì)估計(jì)內(nèi)存需求很有用。

  第一步的估計(jì)加上一些安全量。因?yàn)閷?duì)程序大小的估計(jì)很可能是錯(cuò)誤的,因?yàn)槟憧赡芡艘恍┮\(yùn)行的程序,并確定你有一些額外空間。應(yīng)該有數(shù)MB。(分配太多對(duì)換空間比分配太少好,但不必過分,因?yàn)椴皇褂玫膶?duì)換空間是浪費(fèi);見后文:關(guān)于增加對(duì)換空間。) Also,since it is nicer to deal with even numbers, you can round the value up to the next full megabyte.

  基于以上計(jì)算,你知道了你總共需要多少內(nèi)存。減去你的實(shí)際物理內(nèi)存,就是對(duì)換空間。 (有些版本的UNIX中,你還需要分配物理內(nèi)存的映象空間,所以第二布中計(jì)算的你所需的空間就不能減)

  如果你計(jì)算的對(duì)換空間比你的實(shí)際物理內(nèi)存大得多(大于好幾倍以上),那么你也許需要更多的物理內(nèi)存,否則系統(tǒng)性能將太低。

  即使計(jì)算顯示你無須對(duì)換空間,最好還是至少有一些。Linux有些侵略性地使用對(duì)換空間,這樣保持一定的空閑物理內(nèi)存。即使內(nèi)存還不為什么程序所需,Linux也會(huì)換出一些不用的內(nèi)存頁,這樣在需要的時(shí)候就可以避免因?qū)Q的等待--即對(duì)換可以在硬盤空閑的時(shí)候提早完成。

  對(duì)換空間可以分在幾個(gè)硬盤中,這有時(shí)可以提高性能,依賴于這些盤的相對(duì)速度和存取模式。你可以嘗試幾中方案,但要知道正確地嘗試是很困難的。不要相信某種方案比其他方案好的斷定,因?yàn)樗粫?huì)總是對(duì)的。

  高速緩存

  與存取(真正的)內(nèi)存相比,從磁盤讀是很慢的 另外,在相對(duì)短的一端時(shí)間里,多次讀硬盤相同的部分是很常見的。例如,你可能先讀了一封電子郵件,然后回復(fù)時(shí)又將它讀入編輯器,然后復(fù)制它到一個(gè)文件夾時(shí)又用郵件程序讀它?;蛘?,考慮命令ls 可能被系統(tǒng)上的很多用戶多么頻繁地使用。只從磁盤讀一次信息,并保持在硬盤中,知道不再需要,除了第一次讀,其他都會(huì)較快。這就叫磁盤緩存disk buffering,用于此目的的內(nèi)存叫buffer cache。

  不幸的是,由于內(nèi)存是有限且缺乏的資源,buffer cache一般不會(huì)足夠大(大到能夠裝下所有人可能用到的數(shù)據(jù))。當(dāng)cache滿時(shí),最長(zhǎng)時(shí)間不用的數(shù)據(jù)將被丟棄,內(nèi)存釋放給最新的數(shù)據(jù)。

  磁盤緩沖也用于寫操作。要寫的數(shù)據(jù)經(jīng)常馬上又被讀(例如一個(gè)源代碼文件保存到文件中后又被編譯器讀出),所以將要寫的數(shù)據(jù)放在緩沖里是個(gè)好主意。另外,只將數(shù)據(jù)放如cache而不馬上寫到磁盤,寫操作的程序執(zhí)行速度更快。寫操作然后可以在后臺(tái)完成,而不降低其他程序的速度。

  許多操作系統(tǒng)有buffer caches (即使名稱不同),但并非都根據(jù)上述原理。有些是透寫write-through: 數(shù)據(jù)馬上寫到磁盤(當(dāng)然也同時(shí)寫到cache) 不馬上寫的cache叫回寫write-back。回寫比透寫更有效,但也更容易出錯(cuò):如果系統(tǒng)崩潰,或電源突然掉電,或軟盤在cache回寫前被取出,那么cache中改變的數(shù)據(jù)將丟失。這可能意味著文件系統(tǒng)is not in full working order, 可能由于未寫數(shù)據(jù)包含了系統(tǒng)記錄信息的重要的變化。

  因此,千萬不要不經(jīng)過正常的關(guān)閉過程直接關(guān)閉電源(見6章), 或沒有unmount就取出軟盤(如果是mount的),或什么程序還在用著軟盤,或軟盤燈還在閃。 sync 命令刷新緩沖,即強(qiáng)制將所有未寫數(shù)據(jù)寫回磁盤,如果要確保所有數(shù)據(jù)安全回寫,可以用它。傳統(tǒng)的UNIX系統(tǒng)中,有個(gè)update 程序在后臺(tái)運(yùn)行,它每30秒運(yùn)行一次 sync ,所以通常無須使用sync 。 Linux有一個(gè)另外的守侯程序bdflush ,它克服了sync 有時(shí)因磁盤I/O負(fù)荷太重(因?yàn)轭l繁的操作)而導(dǎo)致有時(shí)系統(tǒng)突然呆住的問題。

  Linux下,bdflush 由update 啟動(dòng)。一般無須考慮它,但如果bdflush 偶爾因?yàn)槭裁丛蛩懒耍诵臅?huì)給出警告,此時(shí)應(yīng)該手工啟動(dòng)它(/sbin/update )。

  cache并不真正緩沖文件,而是塊,就是磁盤I/O的最小單元(Linux下,一般是1kB)。這樣,所有的目錄、超級(jí)塊、其他文件系統(tǒng)記錄數(shù)據(jù)和無文件系統(tǒng)磁盤都可以被緩沖。

  cache的效果決定于其大小。太小的cache幾乎無用;它只能cache很少的數(shù)據(jù),而可能在被重用前就被清除了。大小有賴于有多少數(shù)據(jù)被讀寫,相同的數(shù)據(jù)的存取頻度。唯一的方法是實(shí)驗(yàn)。

  如果cache是固定大小,那么不應(yīng)該太大,否則,會(huì)由于空閑內(nèi)存空間太小而使用swap(也很慢)。為了最有效地使用真實(shí)內(nèi)存,Linux自動(dòng)使用所有空閑內(nèi)存作為buffer cache,當(dāng)程序需要更多內(nèi)存時(shí),自動(dòng)減少cache。

  Linux下,對(duì)cache使用無須做任何工作,它完全是自動(dòng)的。除了要正常關(guān)閉系統(tǒng)和取出軟盤,無須關(guān)心cache。

相關(guān)文章

最新評(píng)論