1. 程式人生 > 其它 >高效安全地清理Linux中的快取

高效安全地清理Linux中的快取

技術標籤:運維指令碼快取快取指令碼語言運維

文章目錄

一、清理快取的命令:

free -h/-m                               #檢視目前記憶體使用情況
#也可篩選計算出剩餘記憶體百分比,如下:
free -m | sed -n '2p' | awk '{print "used mem is "$3"M,total mem is "$2"M,used percent is "$3/$2*100"%"}'
echo 1 > /proc/sys/vm/drop_caches #釋放頁快取 echo 2 > /proc/sys/vm/drop_caches #釋放dentries和inodes快取 echo 3 > /proc/sys/vm/drop_caches #是釋放 1 2 中說道的的所有快取

二、詳細解釋

使用 free -h 檢視記憶體使用情況時:
在這裡插入圖片描述

(一)、Men 與 Swap 的區別

第1列 Mem
實體記憶體使用情況

totalusedfreesharedbuff/cacheavailable
實體記憶體總容量已使用記憶體容量空閒記憶體容量共享記憶體容量快取容量可用記憶體容量

從圖中的值可以看出,total≠used+free,而是total≈used+available;而
free:是實際未使用的實體記憶體容量
available:是應用程式認為可用的記憶體容量,available≈free+buff/cache,關鍵就是buff/cache這部分。

第2列 Swap
交換區記憶體使用情況

totalusedfree
交換分割槽總容量交換分割槽使用容量交換分割槽空閒容量

(二)、buffer 與 cache 的區別

1、buffer和cache都是為了解決互訪的兩種裝置存在速率差異,使磁碟的I/O的讀寫效能或cpu更加高效,減少程序間通訊等待的時間

2、buffer:緩衝區,用於儲存速度不同步的裝置或優先順序不同的裝置之間傳輸資料,通過buffer可以減少程序間通訊需要等待的時間,當儲存速度快的裝置與儲存速度慢的裝置進行通訊時,儲存快的裝置先把資料快取到buffer上,等到系統統一把buffer上的資料寫到速度慢的裝置上。常見的有把記憶體的資料往磁碟進行寫操作,這時你可以檢視一下buffers

3、cache:快取區,用於對讀取速度比較嚴格,卻因為裝置間因為儲存裝置存在速度差異,而不能立刻獲取資料,這時cache就會為了加速快取一部分資料。常見的是CPU和記憶體之間的資料通訊,因為CPU的速度遠遠高於主記憶體的速度,CPU從記憶體中讀取資料需等待很長的時間,而Cache儲存著CPU剛用過的資料或迴圈使用的部分資料,這時Cache中讀取資料會更快,減少了CPU等待的時間,提高了系統的效能。

三、一鍵清理快取指令碼

#!/bin/bash
#Men分割槽記憶體總量 
mem_total=`free -m | awk 'NR==2' | awk '{print $2}'`

#Men分割槽當前剩餘記憶體的大小 
mem_free=`free -m | awk 'NR==3' | awk '{print $4}'`

#Men分割槽當前已使用記憶體的大小 
mem_used=`free -m | grep Mem | awk '{print  $3}'`

if (($mem_used != 0)); then

#如果已被使用,則計算當前剩餘free所佔總量,表示為整數
mem_per=`free -m | awk '/Mem:/ {print int($3/($3+$4)*100)"%"}'`
mem_total=`free -m | awk '/Mem:/ {print int($3/($3+$4)*100)}'`
#設定監控日誌監控記憶體使用情況
DATA="$(date -d "today" +"%Y-%m-%d-%H-%M") free percent is : $mem_per"
echo $DATA >> /var/log/mem_alarm.log

#當前剩餘百分比與80%進行比較 ,超過80%進行快取清理
if [ $mem_total -gt 80 ]; then
sync
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches

else
echo "Don't have to clean up"

#將release memory OK !寫入/var/log/資料夾的memstat_日期.log日誌中
echo "--->release memory OK ! " >>/var/log/memstat_$(date +%Y%m%d_%H%M%S).log
fi
fi