1. 程式人生 > >Linux指定定時指令碼清理快取、檢視記憶體使用情況

Linux指定定時指令碼清理快取、檢視記憶體使用情況

轉載地址,部分補充修改。

Linux命令之sync - 強制將記憶體中的檔案緩衝內容寫到磁碟。
Linux核心為了達到最佳的磁碟操作效率,會把需要寫入到磁碟的資料現在記憶體中快取起來,在合適的時候才真正寫入到磁碟中,這在絕大多數情況都是沒有任何問題的,而且提高了系統的效率,但是如果系統當機、掉電,就會有些檔案內容不會儲存下來。在Linux系統關機或者重啟時,會自動把緩衝區的內容自動同步到磁碟中。我們也可以手工去執行sync命令,強制將記憶體中的檔案緩衝內容寫到磁碟,這個命令是通過呼叫sync系統呼叫來實現的。

常用方式 : sync —— 強制將記憶體中的檔案緩衝內容寫到磁碟。

指令碼例子內容如下:

 crontab -e

 */1 * * * * /root/drop_cacheFile.sh >>/root/cronDropCache.log

#/bin/bash
mt=`free | tr [:blank:] \\\n | grep [0-9] | sed -n '1p'`
mu=`free | tr [:blank:] \\\n | grep [0-9] | sed -n '2p'`
mf=`free | tr [:blank:] \\\n | grep [0-9] | sed -n '3p'`
st=`free | tr [:blank:] \\\n | grep [0-9] | sed -n '9p'`
su=`free | tr [:blank:] \\\n | grep [0-9] | sed -n '10p'`
sf=`free | tr [:blank:] \\\n | grep [0-9] | sed -n '11p'`
t=`expr $mt + $st`
u=`expr $mu + $su`
R=`expr $mu \* 100 / $mt`
nowdata=`date "+%Y-%m-%d %H:%M:%S"`

echo "========"$nowdata"執行我清理記憶體啦====================="
echo "當前記憶體使用率為: $R%"
ttotle=`free -m |awk '{if(NR>1 && NR<3) {print $2}}'`
uused=`free -m |awk '{if(NR>1 && NR<3) {print $3}}'`
ffree=`free -m |awk '{if(NR>1 && NR<3) {print $4}}'`
echo "目前的記憶體情況M單位:總記憶體:"$ttotle"M--使用了:"$uused"M--剩餘:"$ffree"M"
echo 3 > /proc/sys/vm/drop_caches

echo "記憶體清理結束"

在Linux系統下,我們一般不需要去釋放記憶體,因為系統已經將記憶體管理的很好。但是凡事也有例外,有的時候記憶體會被快取佔用掉,導致系統使用SWAP空間影響效能,此時就需要執行釋放記憶體(清理快取)的操作了。

Linux系統的快取機制是相當先進的,他會針對dentry(用於VFS,加速檔案路徑名到inode的轉換)、Buffer Cache(針對磁碟塊的讀寫)和Page Cache(針對檔案inode的讀寫)進行快取操作。但是在進行了大量檔案操作之後,快取會把記憶體資源基本用光。但實際上我們檔案操作已經完成,這部分快取已經用不到了。這個時候,我們難道只能眼睜睜的看著快取把記憶體空間佔據掉麼?

所以,我們還是有必要來手動進行Linux下釋放記憶體的操作,其實也就是釋放快取的操作了。

要達到釋放快取的目的,我們首先需要了解下關鍵的配置檔案/proc/sys/vm/drop_caches。這個檔案中記錄了快取釋放的引數,預設值為0,也就是不釋放快取。他的值可以為0~3之間的任意數字,代表著不同的含義:

0 – 不釋放
1 – 釋放頁快取
2 – 釋放dentries和inodes
3 – 釋放所有快取

1.清理前記憶體使用情況 
free -m

2.開始清理  
echo 1 > /proc/sys/vm/drop_caches
3.清理後記憶體使用情況 
free -m
4.完成! 檢視記憶體條數命令:

dmidecode | grep -A16 "Memory Device$"

定時指令碼新增執行任務可參考原文:http://blog.csdn.net/liqi_q/article/details/78044373