引言:
我們發現SAP S4系統的內存使用率越來越高
在內核窗口—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的默認值,以便可以修改回來
然后free-m查看此時內存使用情況,對於各字段含義,可以參考:linux free命令使用。
1.2、echo寫入不同數據—free-m內容
執行echo 1 > /proc/sys/vm/drop_caches, 其中綠色框是標記發生改變的部分,由於buffers 和 cached數值變化,第一行free和used均發生變化。
執行echo 2 > /proc/sys/vm/drop_caches, 其中綠色框是標記發生改變的部分,這次僅有buffers由0變為1,cached基本沒有變化。
執行echo 3 > /proc/sys/vm/drop_caches, 這次基本上,和寫入2區別不大,沒有什么變化。
二、現象解釋:
前面我們執行echo N > /proc/sys/vm/drop_caches,再free –m查看內存使用情況,輸入不同的N值,free –m內存中緩存buffers會有差異,現在我們就是要解釋/proc/sys/vm、drop_caches, 這個文件到底是什么?另外可以寫入哪些數值,具體適用於什么場景。
2.1、內核文檔說明
查看linux內核文檔,可以得到以下信息:
可以看出,/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為例,介紹了寫入不同數值,清理緩存的作用。
參考資料:
1、linux free命令使用
2、linux內核文檔
3、手工釋放linux內存.