Linux 記憶體機制

2021-08-26 10:42:43 字數 4229 閱讀 2101

一.記憶體使用說明

free命令相對於top提供了更簡潔的檢視系統記憶體使用情況:

[root@rac1 ~]# free

totalusedfreesharedbufferscached

mem:

1035108

1008984261240124212413000

-/+ buffers/cache:471772563336

swap:20964728423201254152

這裡顯示的單位是kb。

在linux的記憶體分配機制中,優先使用物理記憶體,當物理記憶體還有空閒時(還夠用),不會釋放其占用記憶體,就算占用記憶體的程式已經被關閉了,該程式所占用的記憶體用來做快取使用,對於開啟過的程式、或是讀取剛訪問過得資料會比較快。

mem:表示物理記憶體統計。

-/+ buffers/cached:表示物理記憶體的快取統計

swap:表示硬碟上交換分割槽的使用情況。只有mem被當前程序實際占用完,即沒有了buffers和cache時,才會使用到swap。

mem行(第一行)資料說明:

total:1035108kb。表示物理記憶體總大小。

used:1008984kb。表示總計分配給快取(包含buffers與cache)使用的數量,但其中可能部分快取並未實際使用。

free:26124kb。表示未被分配的記憶體。

shared:0kb。共享記憶體,一般系統不會用到。

buffers:124212kb。系統分配但未被使用的buffers數量。

cached:413000kb。系統分配但未被使用的cache數量。

-/+ buffers/cache行(第二行)資料說明:

used:471772kb,實際使用的buffers與cache總量,也是實際使用的記憶體總量。

free: 563336kb,未被使用的buffers與cache和未被分配的記憶體之和,這就是系統當前實際可用記憶體。

根據以上分析,可以得出一下結論:

1.實際可用記憶體大小:

free(-/+ buffers/cache行)= free(mem)+buffers(mem)+cached(mem);

563336 = 26124 + 124212+ 413000

2.已經分配的記憶體大小:

used(mem) = used(-/+ buffers/cache)+ buffers(mem) + cached(mem)

1008984kb = 471772 + 124212 +413000

3.物理記憶體總大小

total(mem)= used(-/+ buffers/cache) + free(-/+ buffers/cache)

1035108 = 471772 + 563336

二.swap配置對效能的影響

通常情況下,swap空間應大於或等於物理記憶體的大小,最小不應小於64m,通常swap空間的大小應是物理記憶體的2-2.5倍。但根據不同的應用,應有不同的配置:如果是小的桌面系統,則只需要較小的swap空間,而大的伺服器系統則視情況不同需要不同大小的swap空間。特別是資料庫伺服器和web伺服器,隨著訪問量的增加,對swap空間的要求也會增加,一般來說對於4g以下的物理記憶體,配置2倍的swap,4g以上配置1倍。

另外,swap分割槽的數量對效能也有很大的影響。因為swap交換的操作是磁碟io的操作,如果有多個swap交換區,swap空間的分配會以輪流的方式操作於所有的swap,這樣會大大均衡io的負載,加快swap交換的速度。如果只有乙個交換區,所有的交換操作會使交換區變得很忙,使系統大多數時間處於等待狀態,效率很低。用效能監視工具就會發現,此時的cpu並不很忙,而系統卻慢。這說明,瓶頸在io上,依靠提高cpu的速度是解決不了問題的。

三.linux記憶體機制

linux支援虛擬記憶體(virtual mmemory),虛擬記憶體是指使用磁碟當作ram的擴充套件,這樣可用的記憶體的大小就相應地增大了。核心會將暫時不用的記憶體塊的內容寫到硬碟上,這樣一來,這塊記憶體就可用於其它目的。當需要用到原始的內容時,它們被重新讀入記憶體。這些操作對使用者來說是完全透明的;linux下執行的程式只是看到有大量的記憶體可供使用而並沒有注意到時不時它們的一部分是駐留在硬碟上的。當然,讀寫硬碟要比直接使用真實記憶體慢得多(要慢數千倍),所以程式就不會象一直在記憶體中執行的那樣快。用作虛擬記憶體的硬碟部分被稱為交換空間(swap space)。

一般,在交換空間中的頁面首先被換入記憶體;如果此時沒有足夠的物理記憶體來容納它們又將被交換出來(到其他的交換空間中)。如果沒有足夠的虛擬記憶體來容納所有這些頁面,linux就會波動而不正常;但經過一段較長的時間linux會恢復,但此時系統已不可用了。

有時,儘管有許多的空閒記憶體,仍然會有許多的交換空間正被使用。這種情況是有可能發生的,例如如果在某一時刻有進行交換的必要,但後來乙個占用很多物理記憶體的大程序結束並釋放記憶體時。被交換出的資料並不會自動地交換進記憶體,除非有這個需要時。此時物理記憶體會在一段時間內保持空閒狀態。對此並沒有什麼可擔心的,但是知道了是怎麼一回事,也就無所謂了。

許多作業系統使用了虛擬記憶體的方法。因為它們僅在執行時才需要交換空間,以解決不會在同一時間使用交換空間,因此,除了當前正在執行的作業系統的交換空間,其它的就是一種浪費。所以讓它們共享乙個交換空間將會更有效率。

注意:如果會有幾個人同時使用這個系統,他們都將消耗記憶體。然而,如果兩個人同時執行乙個程式,記憶體消耗的總量並不是翻倍,因為**頁以及共享的庫只存在乙份。

與訪問物理記憶體相比,磁碟的讀寫是很慢的。另外,在相應較短的時間內多次讀磁碟同樣的部分也是常有的事。例如,某人也許首先閱讀了一段e-mail訊息,然後為了答覆又將這段訊息讀入編輯器中,然後又在將這個訊息拷貝到資料夾中時,使得郵件程式又一次讀入它。或者考慮一下在乙個有著許多使用者的系統中ls命令會被使用多少次。通過將資訊從磁碟上僅讀入一次並將其存於記憶體中,除了第一次讀以外,可以加快所有其它讀的速度。這叫作磁碟緩衝(disk buffering),被用作此目的的記憶體稱為高速緩衝(buffer cache)。但是,由於記憶體是一種有限而又不充足的資源,高速緩衝不可能做的很大(它不可能包容要用到的所有資料)。當緩衝充滿了資料時,其中最長時間不用的資料將被捨棄以騰出記憶體空間用於新的資料。

對寫磁碟操作來說磁碟緩衝技術同樣有效。一方面,被寫入磁碟的資料常常會很快地又被讀出(例如,原**檔案被儲存到乙個檔案中,又被編譯器讀入),所以將要被寫的資料放入緩衝中是個好主意。另一方面,通過將資料放入緩衝中,而不是將其立刻寫入磁碟,程式可以加快執行的速度。以後,寫的操作可以在後台完成,而不會拖延程式的執行。

大多數作業系統都有高速緩衝(儘管可能稱呼不同),但是並不是都遵守上面的原理。有些是直接寫(write-through):資料將被立刻寫入磁碟(當然,資料也被放入快取中)。如果寫操作是在以後做的,那麼該快取被稱為後台寫(write-back)。後台寫比直接寫更有效,但也容易出錯:如果機器崩潰,或者突然掉電,緩衝中改變過的資料就被丟失了。如果仍未被寫入的資料含有重要的薄記資訊,這甚至可能意味著檔案系統(如果有的話)已不完整。

針對以上的原因,出現了很多的日誌檔案系統,資料在緩衝區修改後,同時會被檔案系統記錄修改資訊,這樣即使此時系統掉電,系統重啟後會首先從日誌記錄中恢復資料,保證資料不丟失。當然這些問題不再本文的敘述範圍。

由於上述原因,在使用適當的關閉過程之前,絕對不要關掉電源,sync命令傾空(flushes)緩衝,也即,強迫所有未被寫的資料寫入磁碟,可用以確定所有的寫操作都已完成。在傳統的unix系統中,有乙個叫做update的程式執行於後台,每隔30秒做一次sync操作,因此通常無需手工使用sync命令了。linux另外有乙個後台程式,bdflush,這個程式執行更頻繁的但不是全面的同步操作,以避免有時sync的大量磁碟i/o操作所帶來的磁碟的突然凍結。

在linux中,bdflush是由update啟動的。通常沒有理由來擔心此事,但如果由於某些原因bdflush程序死掉了,核心會對此作出警告,此時你就要手工地啟動它了(/sbin/update)。

快取(cache)實際並不是緩衝檔案的,而是緩衝塊的,塊是磁碟i/o操作的最小單元(在linux中,它們通常是1kb)。這樣,目錄、超級塊、其它檔案系統的薄記資料以及非檔案系統的磁碟資料都可以被緩衝了。緩衝的效力主要是由它的大小決定的。緩衝太小的話等於沒用。它只能容納一點資料,因此在被重用時,所有緩衝的資料都將被傾空。實際的大小依賴於資料讀寫的頻次、相同資料被訪問的頻率。只有用實驗的方法才能知道。

如果快取有固定的大小,那麼快取太大了也不好,因為這會使得空閒的記憶體太小而導致進行交換操作(這同樣是慢的)。為了最有效地使用實際記憶體,linux自動地使用所有空閒的記憶體作為高速緩衝,當程式需要更多的記憶體時,它也會自動地減小緩衝的大小。

這就是一般情況下linux記憶體的一般機制,真正的linux記憶體的執行機制遠遠比這個複雜。

注:整理自網路

Linux記憶體機制

通常情況下,swap空間應大於或等於物理記憶體的大小,最小不應小於64m,通常swap空間的大小應是物理記憶體的2 2.5倍。但根據不同的應用,應有不同的配置 如果是小的桌面系統,則只需要較小的swap空間,而大的伺服器系統則視情況不同需要不同大小的swap空間。特別是資料庫伺服器和web伺服器,隨...

Linux 的記憶體機制

在 linux 中經常發現空閒記憶體很少,似乎所有的記憶體都被系統占用了,表面感覺是記憶體不夠用了,其實不然。這是 linux 記憶體管理的乙個優秀特性,在這方面,區別於 windows 的記憶體管理。主要特點是,無論物理記憶體有多大,linux 都將其充分利用,將一些程式呼叫過的硬碟資料讀入記憶體...

Linux記憶體管理機制

經常遇到一些剛接觸linux 的新手會問記憶體占用怎麼那麼多?在linux中經常發現空閒記憶體很少,似乎所有的記憶體都被系統占用了,表面感覺是記憶體不夠用了,其實不然。這是linux記憶體管理的乙個優秀特性,在這方 面,區別於windows的記憶體管理。主要特點是,無論物理記憶體有多大,linux ...