linux之釋放記憶體空間

2021-10-13 07:35:37 字數 3836 閱讀 5529

linux伺服器執行一段時間後,由於其記憶體管理機制,會將暫時不用的記憶體轉為buff/cache,這樣在程式使用到這一部分資料時,能夠很快的取出,從而提高系統的執行效率,所以這也正是linux記憶體管理中非常出色的一點,所以乍一看記憶體剩餘的非常少,但是在程式真正需要記憶體空間時,linux會將快取讓出給程式使用,這樣達到對記憶體的最充分利用,所以真正剩餘的記憶體是free+buff/cache

但是有些時候大量的快取佔據空間,這時候應用程式回去使用swap交換空間,從而使系統變慢,這時候需要手動去釋放記憶體,釋放記憶體的時候,首先執行命令 sync 將所有正在記憶體中的緩衝區寫到磁碟中,其中包括已經修改的檔案inode、已延遲的塊i/o以及讀寫對映檔案,從而確保檔案系統的完整性

說到清理記憶體,那麼不得不提到/proc這乙個虛擬檔案系統,這裡面的資料和檔案都是記憶體中的實時資料,很多引數的獲取都可以從下面相應的檔案中得到,比如檢視某一程序占用的記憶體大小和各項引數,cpu和主機板的詳細資訊,顯示卡的引數等等;相應的關於記憶體的管理方式是在/proc/sys/vm/drop_chches檔案中,一定要注意這個檔案中存放的並不是具體的記憶體內容,而是0-3這幾個數字,通過檔案大小只有1b也可以知道,而這些代號分別告訴系統代表不同的含義如下:

0:0是系統預設值,預設情況下表示不釋放記憶體,由作業系統自動管理

1:釋放頁快取

2:釋放dentries和inodes

3:釋放所有快取

所以根據上面的說明,分別將1,2,3這3個數字重定向到drop_caches中可以實現記憶體的釋放,一般釋放記憶體都是重定向3到檔案中,釋放所有的快取

那麼下面舉個例子,比如這裡只釋放頁快取,首先使用 free -h 檢視當前記憶體剩餘

當前記憶體剩餘570m左右,另外buff/cache是1.3g,根據上面說的現在真正的剩餘記憶體應該是1.8g左右,首先寫快取到檔案系統:

sync

手動執行sync命令(描述:sync 命令執行 sync 子例程。如果必須停止系統,則執行sync 命令以確保檔案系統的完整性。sync 命令將所有未寫的系統緩衝區寫到磁碟中,包含已修改的 i-node、已延遲的塊 i/o 和讀寫對映檔案)

然後執行下面命令釋放記憶體(頁快取buff/cache):

echo 1 > /proc/sys/vm/drop_caches
執行完之後,再次檢視記憶體剩餘:

會發現記憶體被釋放了,可用記憶體確實變為1.8g左右

到這裡記憶體就釋放完了,現在drop_caches中的值為1,如果現在想讓作業系統重新分配記憶體,那麼設定drop_caches的值為0即可:

echo 0 > /proc/sys/vm/drop_caches
另外需要注意的是,在生產環境中的伺服器我們不要頻繁的去釋放記憶體,只在必要時候清理記憶體即可,更重要的是我們應該從應用程式層面去優化記憶體的利用和釋放,經常清理記憶體可能只是暫時遮蔽的應用程式中的一些bug,所以更重要的是程式的調優,其他的交給作業系統來管理

#########linux釋放記憶體的相關知識###############

在linux系統下,一般不需要去釋放記憶體,因為系統已將記憶體管理的很好。但也有例外,有時記憶體會被快取占用掉,導致系統使用swap空間影響效能,例如當你在linux下頻繁訪問檔案後,物理記憶體會很快被用光,當程式結束後,記憶體不會被正常釋放,而是一直作為caching。此時就需要執行釋放記憶體(清理快取)的操作了。

linux系統的快取機制是相當先進的,他會針對dentry(用於vfs,加速檔案路徑名到inode的轉換)、buffer cache(針對磁碟塊的讀寫)和page cache(針對檔案inode的讀寫)進行快取操作。但在進行了大量檔案操作之後,快取會把記憶體資源基本用光。實際上檔案操作已完成,這部分快取已用不到了。這時,有必要來手動進行linux下釋放記憶體的操作,其實是釋放快取的操作了。/proc是乙個虛擬檔案系統,我們可通過對它的讀寫操作做為與kernel實體間進行通訊的一種手段.也就是說可通過修改/proc中的檔案,來對當前kernel的行為做出調整.那麼可通過調整/proc/sys/vm/drop_caches來釋放記憶體。要達到釋放快取的目的,首先需要了解下關鍵的配置檔案/proc/sys/vm/drop_caches。這個檔案中記錄了快取釋放的引數,預設值為0,也就是不釋放快取。

一般複製了檔案後,可用記憶體會變少,都被cached占用了,這是linux為了提高檔案讀取效率的做法:為了提高磁碟訪問效率, linux做了一些精心的設計, 除了對dentry進行快取(用於vfs,加速檔案路徑名到inode的轉換), 還採取了兩種主要cache方式:buffer cache和page cache。前者針對磁碟塊的讀寫,後者針對檔案inode的讀寫。這些cache有效縮短了 i/o系統呼叫(比如read,write,getdents)的時間。

釋放記憶體前先使用sync命令做同步,以確保檔案系統的完整性,將所有未寫的系統緩衝區寫到磁碟中,包含已修改的 i-node、已延遲的塊 i/o 和讀寫對映檔案。否則在釋放快取的過程中,可能會丟失未儲存的檔案。

[[email protected] ~]# free -m

total       used       free     shared    buffers     cached

mem:          7979       7897         82          0         30       3918

-/ buffers/cache:       3948       4031

swap:         4996        438       4558

第一行用全域性角度描述系統使用的記憶體狀況:

total 記憶體總數

used 已經使用的記憶體數,一般情況這個值會比較大,因為這個值包括了cache 應用程式使用的記憶體

free 空閒的記憶體數

shared 多個程序共享的記憶體總額

buffers 快取,主要用於目錄方面,inode值等(ls大目錄可看到這個值增加)

cached 快取,用於已開啟的檔案

第二行描述應用程式的記憶體使用:

-buffers/cache 的記憶體數:used - buffers - cached

buffers/cache 的記憶體數:free buffers cached

前個值表示-buffers/cache 應用程式使用的記憶體大小,used減去快取值

後個值表示 buffers/cache 所有可**用程式使用的記憶體大小,free加上快取值

第三行表示swap的使用:

used 已使用

free 未使用 

可用的記憶體=free memory buffers cached。

為什麼free這麼小,是否關閉應用後記憶體沒有釋放?

實際上,這是因為linux對記憶體的管理與windows不同,free小並不是說記憶體不夠用了,應該看的是free的第二行最後乙個值:-/ buffers/cache:       3948       4031 ,這才是系統可用的記憶體大小。

實際專案中的經驗告訴我們,如果因為是應用有像記憶體洩露、溢位的問題,從swap的使用情況可比較快速判斷的,但free上反而比較難檢視。既然核心是可快速清空buffer或cache,但核心並沒有這樣做(預設值是0),不應隨便去改變它。

一般情況下,應用在系統上穩定執行了,free值也會保持在乙個穩定值的,雖然看上去可能比較小。當發生記憶體不足、應用獲取不到可用記憶體、oom錯誤等問題時,更應該去分析應用方面的原因,如使用者量太大導致記憶體不足、發生應用記憶體溢位等情況,否則,清空buffer,強制騰出free的大小,可能只是把問題給暫時遮蔽了,所以說一般情況下linux都不用經常手動釋放記憶體。

Linux釋放記憶體空間

linux伺服器執行一段時間後,由於其記憶體管理機制,會將暫時不用的記憶體轉為buff cache,這樣在程式使用到這一部分資料時,能夠很快的取出,從而提高系統的執行效率,所以這也正是linux記憶體管理中非常出色的一點,所以乍一看記憶體剩餘的非常少,但是在程式真正需要記憶體空間時,linux會將快...

Linux釋放記憶體空間

linux伺服器執行一段時間後,由於其記憶體管理機制,會將暫時不用的記憶體轉為buff cache,這樣在程式使用到這一部分資料時,能夠很快的取出,從而提高系統的執行效率,所以這也正是linux記憶體管理中非常出色的一點,所以乍一看記憶體剩餘的非常少,但是在程式真正需要記憶體空間時,linux會將快...

Linux釋放記憶體空間

linux伺服器執行一段時間後,由於其記憶體管理機制,會將暫時不用的記憶體轉為buff cache,這樣在程式使用到這一部分資料時,能夠很快的取出,從而提高系統的執行效率,所以這也正是linux記憶體管理中非常出色的一點,所以乍一看記憶體剩餘的非常少,但是在程式真正需要記憶體空間時,linux會將快...