溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Linux內(nèi)存機制的介紹

發(fā)布時間:2021-08-24 18:35:02 來源:億速云 閱讀:109 作者:chen 欄目:系統(tǒng)運維

這篇文章主要介紹“Linux內(nèi)存機制的介紹”,在日常操作中,相信很多人在Linux內(nèi)存機制的介紹問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Linux內(nèi)存機制的介紹”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一. 我們先來查看一個內(nèi)存使用的例子:

[oracle@db1 ~]$ free -m

                total       used       free     shared    buffers     cached

Mem:        72433     67075      5357      0        558       62221

-/+ buffers/cache:     4295      68138

Swap:        72096      91       72004

 上述結(jié)果顯示了67075M的used,但是(-/+ buffers/cache)減去buffers和cache的結(jié)果可以看到,所以當前進程實際占用內(nèi)存是4296M。

 可以這么理解:在linux的內(nèi)存分配機制中,優(yōu)先使用物理內(nèi)存,當物理內(nèi)存還有空閑時(還夠用),不會釋放其占用內(nèi)存,就算占用內(nèi)存的程序已經(jīng)被關(guān)閉了,該程序所占用的內(nèi)存用來做緩存使用,對于開啟過的程序、或是讀取剛存取過得數(shù)據(jù)會比較快。

 如上面的例子:使用了72433M的內(nèi)存,67075M被占用,但是buuffer和cached部分作為緩存,可以使用命中率的方式提高使用效率,而且這部分緩存是根據(jù)指令隨時可以釋放的,我們可以認為這部分內(nèi)存沒有實際被使用,也可以認為它是空閑的。

 因此查看目前進程正在實際被使用的內(nèi)存,是used-(buffers+cache),也可以認為如果swap沒有大量使用,mem還是夠用的,只有mem被當前進程實際占用完(沒有了buffers和cache),才會使用到swap的。

二. Swap配置對性能的影響
分配太多的Swap空間會浪費磁盤空間,而Swap空間太少,則系統(tǒng)會發(fā)生錯誤。 如果系統(tǒng)的物理內(nèi)存用光了,系統(tǒng)就會跑得很慢,但仍能運行;如果Swap空間用光了,那么系統(tǒng)就會發(fā)生錯誤。例如,Web服務(wù)器能根據(jù)不同的請求數(shù)量衍生出多個服務(wù)進程(或線程),如果Swap空間用完,則服務(wù)進程無法啟動,通常會出現(xiàn)“application is out of memory”的錯誤,嚴重時會造成服務(wù)進程的死鎖。因此Swap空間的分配是很重要的。


通常情況下,Swap空間應(yīng)大于或等于物理內(nèi)存的大小,最小不應(yīng)小于64M,通常Swap空間的大小應(yīng)是物理內(nèi)存的2-2.5倍。但根據(jù)不同的應(yīng)用,應(yīng)有不同的配置:如果是小的桌面系統(tǒng),則只需要較小的Swap空間,而大的服務(wù)器系統(tǒng)則視情況不同需要不同大小的Swap空間。特別是數(shù)據(jù)庫服務(wù)器和Web服務(wù)器,隨著訪問量的增加,對Swap空間的要求也會增加,一般來說對于4G 以下的物理內(nèi)存,配置2倍的swap,4G 以上配置1倍。

另外,Swap分區(qū)的數(shù)量對性能也有很大的影響。因為Swap交換的操作是磁盤IO的操作,如果有多個Swap交換區(qū),Swap空間的分配會以輪流的方式操作于所有的Swap,這樣會大大均衡IO的負載,加快Swap交換的速度。如果只有一個交換區(qū),所有的交換操作會使交換區(qū)變得很忙,使系統(tǒng)大多數(shù)時間處于等待狀態(tài),效率很低。用性能監(jiān)視工具就會發(fā)現(xiàn),此時的CPU并不很忙,而系統(tǒng)卻慢。這說明,瓶頸在IO上,依靠提高CPU的速度是解決不了問題的。
三.  Linux 內(nèi)存機制

Linux支持虛擬內(nèi)存(Virtual Mmemory),虛擬內(nèi)存是指使用磁盤當作RAM的擴展,這樣可用的內(nèi)存的大小就相應(yīng)地增大了。內(nèi)核會將暫時不用的內(nèi)存塊的內(nèi)容寫到硬盤上,這樣一來,這塊內(nèi)存就可用于其它目的。當需要用到原始的內(nèi)容時,它們被重新讀入內(nèi)存。這些操作對用戶來說是完全透明的;Linux下運行的程序只是看到有大量的內(nèi)存可供使用而并沒有注意到時不時它們的一部分是駐留在硬盤上的。當然,讀寫硬盤要比直接使用真實內(nèi)存慢得多(要慢數(shù)千倍),所以程序就不會象一直在內(nèi)存中運行的那樣快。用作虛擬內(nèi)存的硬盤部分被稱為交換空間(Swap Space)。

 一般,在交換空間中的頁面首先被換入內(nèi)存;如果此時沒有足夠的物理內(nèi)存來容納它們又將被交換出來(到其他的交換空間中)。如果沒有足夠的虛擬內(nèi)存來容納所有這些頁面,Linux就會波動而不正常;但經(jīng)過一段較長的時間Linux會恢復,但此時系統(tǒng)已不可用了。
有時,盡管有許多的空閑內(nèi)存,仍然會有許多的交換空間正被使用。這種情況是有可能發(fā)生的,例如如果在某一時刻有進行交換的必要,但后來一個占用很多物理內(nèi)存的大進程結(jié)束并釋放內(nèi)存時。被交換出的數(shù)據(jù)并不會自動地交換進內(nèi)存,除非有這個需要時。此時物理內(nèi)存會在一段時間內(nèi)保持空閑狀態(tài)。對此并沒有什么可擔心的,但是知道了是怎么一回事,也就無所謂了。
許多操作系統(tǒng)使用了虛擬內(nèi)存的方法。因為它們僅在運行時才需要交換空間,以解決不會在同一時間使用交換空間,因此,除了當前正在運行的操作系統(tǒng)的交換空間,其它的就是一種浪費。所以讓它們共享一個交換空間將會更有效率。
注意:如果會有幾個人同時使用這個系統(tǒng),他們都將消耗內(nèi)存。然而,如果兩個人同時運行一個程序,內(nèi)存消耗的總量并不是翻倍,因為代碼頁以及共享的庫只存在一份。


Linux系統(tǒng)常常動不動就使用交換空間,以保持盡可能多的空閑物理內(nèi)存。即使并沒有什么事情需要內(nèi)存,Linux也會交換出暫時不用的內(nèi)存頁面。這可以避免等待交換所需的時間:當磁盤閑著,就可以提前做好交換??梢詫⒔粨Q空間分散在幾個硬盤之上。針對相關(guān)磁盤的速度以及對磁盤的訪問模式,這樣做可以提高性能。


與訪問物理內(nèi)存相比,磁盤的讀寫是很慢的。另外,在相應(yīng)較短的時間內(nèi)多次讀磁盤同樣的部分也是常有的事。例如,某人也許首先閱讀了一段E-mail消息,然后為了答復又將這段消息讀入編輯器中,然后又在將這個消息拷貝到文件夾中時,使得郵件程序又一次讀入它?;蛘呖紤]一下在一個有著許多用戶的系統(tǒng)中 ls命令會被使用多少次。通過將信息從磁盤上僅讀入一次并將其存于內(nèi)存中,除了第一次讀以外,可以加快所有其它讀的速度。這叫作磁盤緩沖(Disk Buffering),被用作此目的的內(nèi)存稱為高速緩沖(Buffer Cache)。但是,由于內(nèi)存是一種有限而又不充足的資源,高速緩沖不可能做的很大(它不可能包容要用到的所有數(shù)據(jù))。當緩沖充滿了數(shù)據(jù)時,其中最長時間不用的數(shù)據(jù)將被舍棄以騰出內(nèi)存空間用于新的數(shù)據(jù)。


對寫磁盤操作來說磁盤緩沖技術(shù)同樣有效。一方面,被寫入磁盤的數(shù)據(jù)常常會很快地又被讀出(例如,原代碼文件被保存到一個文件中,又被編譯器讀入),所以將要被寫的數(shù)據(jù)放入緩沖中是個好主意。另一方面,通過將數(shù)據(jù)放入緩沖中,而不是將其立刻寫入磁盤,程序可以加快運行的速度。以后,寫的操作可以在后臺完成,而不會拖延程序的執(zhí)行。

大多數(shù)操作系統(tǒng)都有高速緩沖(盡管可能稱呼不同),但是并不是都遵守上面的原理。有些是直接寫(Write-Through):數(shù)據(jù)將被立刻寫入磁盤(當然,數(shù)據(jù)也被放入緩存中)。如果寫操作是在以后做的,那么該緩存被稱為后臺寫(Write-Back)。后臺寫比直接寫更有效,但也容易出錯:如果機器崩潰,或者突然掉電,緩沖中改變過的數(shù)據(jù)就被丟失了。如果仍未被寫入的數(shù)據(jù)含有重要的薄記信息,這甚至可能意味著文件系統(tǒng)(如果有的話)已不完整。
針對以上的原因,出現(xiàn)了很多的日志文件系統(tǒng),數(shù)據(jù)在緩沖區(qū)修改后,同時會被文件系統(tǒng)記錄修改信息,這樣即使此時系統(tǒng)掉電,系統(tǒng)重啟后會首先從日志記錄中恢復數(shù)據(jù),保證數(shù)據(jù)不丟失。當然這些問題不再本文的敘述范圍。
由于上述原因,在使用適當?shù)年P(guān)閉過程之前,絕對不要關(guān)掉電源,Sync命令傾空(Flushes)緩沖,也即,強迫所有未被寫的數(shù)據(jù)寫入磁盤,可用以確定所有的寫操作都已完成。在傳統(tǒng)的UNIX系統(tǒng)中,有一個叫做update的程序運行于后臺,每隔30秒做一次sync操作,因此通常無需手工使用sync命令了。Linux另外有一個后臺程序,Bdflush,這個程序執(zhí)行更頻繁的但不是全面的同步操作,以避免有時sync的大量磁盤I/O操作所帶來的磁盤的突然凍結(jié)。
在Linux中,Bdflush是由update啟動的。通常沒有理由來擔心此事,但如果由于某些原因bdflush進程死掉了,內(nèi)核會對此作出警告,此時你就要手工地啟動它了(/sbin/update)。

緩存(Cache)實際并不是緩沖文件的,而是緩沖塊的,塊是磁盤I/O操作的最小單元(在Linux中,它們通常是1KB)。這樣,目錄、超級塊、其它文件系統(tǒng)的薄記數(shù)據(jù)以及非文件系統(tǒng)的磁盤數(shù)據(jù)都可以被緩沖了。緩沖的效力主要是由它的大小決定的。緩沖太小的話等于沒用。它只能容納一點數(shù)據(jù),因此在被重用時,所有緩沖的數(shù)據(jù)都將被傾空。實際的大小依賴于數(shù)據(jù)讀寫的頻次、相同數(shù)據(jù)被訪問的頻率。只有用實驗的方法才能知道。
如果緩存有固定的大小,那么緩存太大了也不好,因為這會使得空閑的內(nèi)存太小而導致進行交換操作(這同樣是慢的)。為了最有效地使用實際內(nèi)存,Linux自動地使用所有空閑的內(nèi)存作為高速緩沖,當程序需要更多的內(nèi)存時,它也會自動地減小緩沖的大小。 

到此,關(guān)于“Linux內(nèi)存機制的介紹”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI