Linux使用free命令buff cache過高

2022-08-19 07:51:09 字數 3652 閱讀 6537

在linux系統中,我們經常用free命令來檢視系統記憶體的使用狀態。在乙個rhel6的系統上,free命令的顯示內容大概是這樣乙個狀態:

其實:buffers/cache占用的較多,說明系統中有程序曾經讀寫過檔案,但是不要緊,這部分記憶體是當空閒來用的

linux核心會在記憶體將要耗盡的時候,觸發記憶體**的工作,以便釋放出記憶體給急需記憶體的程序使用。一般情況下,這個操作中主要的記憶體釋放都來自於對buffer/cache的釋放。尤其是被使用更多的cache空間。既然它主要用來做快取,只是在記憶體夠用的時候加快程序對檔案的讀寫速度,那麼在記憶體壓力較大的情況下,當然有必要清空釋放cache,作為free空間分給相關程序使用。所以一般情況下,我們認為buffer/cache空間可以被釋放,這個理解是正確的。

但是這種清快取的工作也並不是沒有成本。理解cache是幹什麼的就可以明白清快取必須保證cache中的資料跟對應檔案中的資料一致,才能對cache進行釋放。所以伴隨著cache清除的行為的,一般都是系統io飆高。因為核心要對比cache中的資料和對應硬碟檔案上的資料是否一致,如果不一致需要寫回,之後才能**。

在系統中除了記憶體將被耗盡的時候可以清快取以外,我們還可以使用下面這個檔案來人工觸發快取清除的操作:

echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。

echo 2 > /proc/sys/vm/drop_caches:表示清除**slab分配器中的物件(包括目錄項快取和inode快取)。

slab分配器是核心中管理記憶體的一種機制,其中很多快取資料實現都是用的pagecache。

echo 3 > /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的快取物件。

echo n>/proc/sys/vm/drop_caches清理快取

引言:在核心視窗—proc檔案系統這篇筆記中,我們介紹了/proc主要體現程序及核心資訊狀態。與/proc下其它檔案的「唯讀」屬性不同的是,管理員可對/proc/sys子目錄的許多檔案內容進行修改,以更改核心的執行特性。寫入操作一般類似於 echo data >/path/to/your/filename的格式進行。這裡以echo n>/proc/sys/vm/drop_caches為例介紹說明。

echo n > /proc/sys/vm/drop_caches , 當n數值不同時,free –m存在差異

1.1、echo寫入數值之前—free-m內容

首先檢視/proc/sys/vm/drop_caches的預設值,以便可以修改回來

圖1、/proc/sys/vm/drop_caches預設值

然後free-m檢視此時記憶體使用情況,對於各欄位含義,可以參考:linux free命令使用。

圖2、未更改資料時free -m內容

1.2、echo寫入不同資料—free-m內容

執行echo 1 > /proc/sys/vm/drop_caches, 其中綠色框是標記發生改變的部分,由於buffers 和 cached數值變化,第一行free和used均發生變化。

圖3、echo 1 > /proc/sys/vm/drop_caches

執行echo 2 > /proc/sys/vm/drop_caches, 其中綠色框是標記發生改變的部分,這次僅有buffers由0變為1,cached基本沒有變化。

圖4、echo 2 > /proc/sys/vm/drop_caches

執行echo 3 > /proc/sys/vm/drop_caches, 這次基本上,和寫入2區別不大,沒有什麼變化。

圖5、echo 3 > /proc/sys/vm/drop_caches

前面我們執行echo n > /proc/sys/vm/drop_caches,再free –m檢視記憶體使用情況,輸入不同的n值,free –m記憶體中快取buffers會有差異,現在我們就是要解釋/proc/sys/vm、drop_caches, 這個檔案到底是什麼?另外可以寫入哪些數值,具體適用於什麼場景。

2.1、核心文件說明

檢視linux核心文件,可以得到以下資訊:

圖6、linux核心文件關於drop_caches的說明

可以看出,/proc/sys是乙個虛擬檔案系統,我們可以通過對它的讀寫操作做為與kernel實體間進行通訊的一種手段。也就是說可以通過修改/proc中的檔案,來對當前kernel的行為做出調整。那麼我們可以通過調整/proc/sys/vm/drop_caches來釋放記憶體。其預設數值為0.

向/proc/sys/vm/drop_caches中寫入內容,會清理快取。建議先執行sync(sync 命令將所有未寫的系統緩衝區寫到磁碟中,包含已修改的 i-node、已延遲的塊 i/o 和讀寫對映檔案)。執行echo 1、2、3 至 /proc/sys/vm/drop_caches, 達到不同的清理目的。

2.2、使用建議

這裡找到乙份關於清理快取的使用建議手工釋放linux記憶體.

實際專案中告訴我們,如果因為是應用有像記憶體洩露、溢位的問題,從swap的使用情況是可以比較快速可以判斷的,但free上面反而比較難檢視。相反,如果在這個時候,我們告訴使用者,修改系統的乙個值,「可以」釋放記憶體,free就大了。使用者會怎麼想?不會覺得作業系統「有問題」嗎?所以說,我覺得既然核心是可以快速清空buffer或cache,也不難做到(這從上面的操作中可以明顯看到),但核心並沒有這樣做(預設值是0),我們就不應該隨便去改變它。

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

我覺得,排除記憶體不足的情況外,除非是在軟體開發階段,需要臨時清掉buffer,以判斷應用的記憶體使用情況;或應用已經不再提供支援,即使應用對記憶體的時候確實有問題,而且無法避免的情況下,才考慮定時清空buffer。(可惜,這樣的應用通常都是執行在老的作業系統版本上,上面的操作也解決不了)。

與/proc下其它檔案的「唯讀」屬性不同的是,管理員可對/proc/sys子目錄的許多檔案內容進行修改,以更改核心的執行特性。寫入操作一般類似於 echo data >/path/to/your/filename的格式進行。本篇文章以echo n>/proc/sys/vm/drop_caches為例,介紹了寫入不同數值,清理快取的作用。

Linux命令之free命令

free命令可以顯示當前系統未使用的和已使用的記憶體數目,還可以顯示被核心使用的記憶體緩衝區。free 選項 b 以byte為單位顯示記憶體使用情況 k 以kb為單位顯示記憶體使用情況 m 以mb為單位顯示記憶體使用情況 o 不顯示緩衝區調節列 s 間隔秒數 持續觀察記憶體使用狀況 t 顯示記憶體總...

linux命令總結free命令

free 命令是乙個顯示系統中空閒和已用記憶體大小的工具。free 命令的輸出和 top 命令相似。大多數linux發行版已經含有 free 命令。想要執行,只需在控制台輸入free 即可。不帶選項執行會顯示乙個以kb為單位的預設輸出。root finish scripts free total u...

linux命令free詳解

前段時間有個專案的用c寫的,效能測試時發現記憶體洩露問題。關於怎麼觀察記憶體使用問題,free是很好用的乙個命令。bash 3.00 free total used free shared buffers cached mem 1572988 1509260 63728 0 62800 277888...