Linux釋放內存方法

       最近工作中出現一個問題就是在軟件服務運行20多天左右就會將內存耗盡,導致軟件無法起來,服務無法進行,只能將軟件關閉一段時間後,或者將系統重啓,才能運行,而這也不是最終的解決方法,因爲運行20多天後,內存會又繼續耗盡。目前還在尋找解決思路中,目前的方法是定時清除緩存。因此有了這篇文章。

一、free

      先來說說free命令:
# free -m

wKioL1h9skSw3bIXAAA5p8NzKxw573.jpg

其中:
total 內存總數
used 已經使用的內存數
free 空閒的內存數
shared 多個進程共享的內存總額
buffers buffer Cache和cached Page Cache 磁盤緩存的大小
-buffers/cache (已用)的內存數:used - buffers - cached
+buffers/cache(可用)的內存數:free + buffers + cached
可用的memory=free memory+buffers+cached

爲了提高磁盤存取效率,Linux做了一些精心的設計,除了對dentry進行緩存(用於VFS,加速文件路徑名到inode的轉換),還採取了兩種主要Cache方式:Buffer Cache和Page Cache。前者針對磁盤塊的讀寫,後者針對文件inode的讀寫。這些Cache有效縮短了 I/O系統調用(比如read,write,getdents)的時間。那麼有人說過段時間,linux會自動釋放掉所用的內存。等待一段時間後,我們使用free再來試試,看看是否有釋放?根據我的觀察,cache內容是沒有被釋放的。

二、手動釋放cache

        /proc是一個虛擬文件系統,我們可以通過對它的讀寫操作做爲與Kernel實體間進行通信的一種手段。也就是說可以通過修改/proc中的文件,來對當前kernel的行爲做出調整。那麼我們可以通過調整/proc/sys/vm/drop_caches來釋放內存。操作如下:

# cat /proc/sys/vm/drop_caches
0
首先,/proc/sys/vm/drop_caches的值,默認爲0。

# sync
手動執行sync命令(描述:sync 命令運行 sync 子例程。如果必須停止系統,則運行sync 命令以確保文件系統的完整性。sync 命令將所有未寫的系統緩衝區寫到磁盤中,包含已修改的 i-Node、已延遲的塊 I/O 和讀寫映射文件)

# echo 3 > /proc/sys/vm/drop_caches
# cat /proc/sys/vm/drop_caches
3
將/proc/sys/vm/drop_caches值設爲3

三、腳本文件

#!/bin/sh
caches_num=$(free|grep Mem|awk  '{ print $7 }')
echo $caches_num
if [ $caches_num -gt  10000000 ] ; then
{
sync
echo "sync done!"
echo 3 > /proc/sys/vm/drop_caches
}
fi

然後通過crontab設置定時任務,進行腳本的執行。定時釋放cache。

wKioL1h9ssyB9bqLAAGZnFt15d8895.jpg


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章