在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為例,介紹了寫入不同數值,清理緩存的作用。