詳解CentOS中定時執行釋放記憶體的Shell指令碼及相關原理
本文由荒原之夢原創,原文連結:http://zhaokaifeng.com/?p=748
本文總體結構:
第一部分:本文中釋放系統記憶體的原理
第二部分:建立用於釋放記憶體的Shell指令碼並加入到系統定時任務
第三部分:詳細分析Shell指令碼中的每一條指令
第四部分:系統定時任務的工作方式
第一部分:本文中釋放系統記憶體的原理
本文中介紹的方法是通過釋放記憶體緩衝區的資料,達到降低系統記憶體佔用的目的。
當我們在Linux系統中輸入 top
指令時,可以在 Mem
這一欄看到下面這些記憶體指標:
total, free, used, buff/cache
其中, total
是實體記憶體總量; free
是目前的空閒記憶體總量; used
是目前已使用的記憶體總量; buff/cache
(即 Buffers/Cached
)是記憶體緩衝區的大小。
在Linux中:
total = free + used + buff/cache
Linux系統在執行的過程中,CPU需要和外存進行資料交換,但是一般情況下,CPU的讀寫速度遠大於外存裝置(如硬碟)的讀寫速度,為了提升外存的I/O效能,提升系統的執行速度,就需要用到記憶體緩衝區(外存,如硬碟中,也有緩衝區)。記憶體緩衝區有兩種型別,一種是Buffers, 用於存放由CPU輸出的,需要寫入外存的資料,另一種是Cache, 用於存放從外存讀取的,需要輸入到CPU進行處理的資料。
第二部分:建立用於釋放記憶體的Shell指令碼並加入到系統定時任務
在 */*/
目錄下(具體目錄自定義)新建一個以 .sh 結尾的檔案,如:
vim /*/*/freemem.sh
再建立一個檔案用於儲存Shell指令碼的輸出內容:
vim /*/*/ifdone.txt
將以下內容寫入該檔案:
#!/bin/bash sync echo 1 > /proc/sys/vm/drop_caches sync echo 2 > /proc/sys/vm/drop_caches sync echo 3 > /proc/sys/vm/drop_caches echo "done!"
賦予 freemem.sh
可執行許可權:
chmod +x freemem.sh
設定定時任務
crontab -e
寫入
00 00 * * * /*/*/freemem.sh >> /*/*/ifdone.txt
即:每天0點0分執行 freemem.sh
這個指令碼並將指令碼中 echo "done!"
輸出的內容寫入到 ifdone.txt
這個檔案中,這樣我們就可以通過檢視 ifdone.txt
中的內容來大致確定Shell指令碼是否成功執行。
第三部分:詳細分析Shell指令碼中的每一條指令
本文中Shell指令碼內容的說明:
1. #!/bin/bash
以 #
開頭,當然是註釋,但既然是註釋,為什麼還要寫上呢?
其實這裡不是寫的 #
加上 !/bin/bash
,而是寫的 #!
加上 /bin/bash
. #!
是一個約定的標記,可以告訴系統用來解釋這個指令碼的直譯器位於系統的哪個位置(Shell說到底就是一種程式語言,和Python、PHP這些指令碼語言一樣,只要有一個文字編輯器和一個相應的指令碼直譯器就可以編寫並解釋執行指令碼了),本文這個Shell指令碼的直譯器就是位於 /bin
路徑下的 bash
.
Shell是一個用C語言編寫的程式,通過這個程式以及這個程式提供的互動介面,使用者可以操控系統,向系統發出指令並接收系統的返回結果,是使用者與Linux/Unix系統進行互動的紐帶。
在Shell剛出現的時候,Shell的介面就是指的是Linux/Unix系統的純命令列介面。但是隨著圖形化介面的發展,我們可以認為圖形化介面也是一個Shell.
Shell並不是只有一種,常見的Shell型別有:
名稱 | 直譯器位置 |
---|---|
Bourne Again Shell | /bin/bash |
Bourne Shell | /usr/bin/sh或/bin/sh |
C Shell | /usr/bin/csh |
K Shell | /usr/bin/ksh |
Shell for Root | /sbin/sh |
… | … |
Shell和核心、檔案系統以及應用程式一起被認為是Linux系統的4個主要部分,其中核心、Shell和檔案系統是Linux系統的系統基本結構。
2. sync
sync
: 強制將緩衝區的資料立即寫入。
在Linux和Unix系統中,一般會把正在處理的檔案或資料放到記憶體緩衝區內,由於記憶體緩衝區的I/O速度更高,相比於硬碟的I/O速度,記憶體緩衝區的讀寫速度更加接近CPU的處理速度,因此將正在處理的資料放在記憶體緩衝區可以加快系統執行速度。
一般情況下,使用者是不需要主動執行 sync
命令的,因為系統會自動執行 update
(更新)或 bdflush
(將緩衝區中的資料沖洗到硬碟上),除非在系統無法執行 update
或者 bdflush
操作、系統需要非正常關機以及使用者需要主動對記憶體中的資料進行一些關鍵性操作時需要主動執行 sync
.
3. drop_caches
drop_caches
這個檔案的意義比較好理解:
drop
: 降低、減少
caches
:(計算機)快速緩衝貯存區
但是,為什麼, drop_caches
這個檔案會在 /proc/sys/vm
這個路徑下呢?
proc
的英文全稱是 process
, 即:程序,工序。
/proc
這個路徑下主要是和系統程序資訊相關的檔案,即正在執行的系統核心的資訊的對映。 /proc
路徑下除了 /proc/sys
之外基本都是隻讀的。 /proc/sys
路徑下的檔案可寫,可以檢視和修改系統核心的執行引數。
/sys
路徑下存放的是硬體裝置的驅動程式資訊。
我們可以通過把不同的數值寫入 /proc/sys/vm/drop_caches
這個檔案來調整系統核心,進而釋放記憶體:
0: 預設值
1: to free pagecache, use
2: to free dentries and inodes, use
3: to free pagecache, dentries and inodes, use
第四部分:系統定時任務的工作方式
本文中執行定時任務的是 crond
這個系統守護程序。
在百度百科“守護程序”詞條中是這樣描述守護程序的:
引用:守護程序(daemon)是一類在後臺執行的特殊程序,用於執行特定的系統任務。很多守護程序在系統引導的時候啟動,並且一直執行直到系統關閉。另一些只在需要的時候才啟動,完成任務後就自動結束。
crontab的用法如下:
crontab -e
: 以當前使用者的身份建立一個定時任務,該定時任務只對當前使用者有效。
例如,輸入:
00 00 * * * /*/*/freemem.sh >> /*/*/ifdone.txt
上述指令串從左向右含義依次是:
minute hour day month dayofweek command
解釋如下:
指令 | 含義 |
---|---|
minute | 分鐘,整數0~59 |
hour | 小時,整數0~23 |
day | 日,整數1~31(對應月份的有效日期) |
month | 月,整數1~12 |
dayofweek | 周X,0~7(0和7代表週日) |
command | 需要執行的命令 |
也可以直接編輯 /etc/crontab
這個檔案來建立定時任務,這樣建立的定時任務可以作用到整個系統的所有使用者。
crontab -l
: 列出當前所有定時任務。
crontab -l -u mm
: 列出使用者mm的所有定時任務
crontab -r
: 刪除所有定時任務(***警示:慎用!!!***)