1. 經過free命令看Linux內存緩存
total:總內存大小。服務器
used:已經使用的內存大小(這裏麪包含cached和buffers和shared部分)。性能
free:空閒的內存大小。.net
shared:進程間共享內存(通常不會用,能夠忽略)。設計
buffers:內存中寫完的東西緩存起來,這樣快速響應請求,後面數據再按期刷到磁盤上。blog
cached:內存中讀完緩存起來內容佔的大小(這部分是爲了下次查詢時快速返回)。進程
-/+ buffers/cache看做兩部分:內存
-buffers/cache:正在使用的內存大小(注意不是used部分,由於buffers和cached並非正在使用的,組織和人民須要是它們是能夠釋放的),其值=used-buffers-cached。ci
+buffers/cache:可用的內存大小(同理也不是free表示的部分),其值=free+buffers+cached。資源
Swap:硬盤上交換分區的使用大小。設計的目的就是當上面提到的+buffers/cache表示的可用內存都已使用完,新的讀寫請求過來後,會把內存中的部分數據寫入磁盤,從而把磁盤的部分空間當作虛擬內存來使用。
2. Buffer和Cache介紹
Cache(緩存),爲了調高CPU和內存之間數據交換而設計,Buffer(緩衝)爲了提升內存和硬盤(或其餘I/O設備的數據交換而設計)。
Cache主要是針對讀操做設計的,不過Cache概念可能容易混淆,我理解爲CPU自己就有Cache,包括一級緩存、二級緩存、三級緩存,咱們知道CPU全部的指令操做對接的都是內存,而CPU的處理能力遠高於內存速度,因此爲了避免讓CPU資源閒置,Intel等公司在CPU內部集成了一些Cache,但畢竟不能放太多電路在裏面,因此這部分Cache並非很大,主要是用來存放一些經常使用的指令和經常使用數據,真正大部分Cache的數據應該是佔用內存的空間來緩存請求過的數據,即上面的Cached部分(這部分純屬我的理解,正確與否有待考證)。
Buffer主要是針對寫操做設計的,更細的說是針對內存和硬盤之間的寫操做來設計的,目的是將寫的操做集中起來進行,減小磁盤碎片和硬盤反覆尋址過程,提升性能。在Linux系統內部有一個守護進程會按期清空Buffer中的內容,將其寫入硬盤內,當手動執行sync命令時也會觸發上述操做。
3. 常見症狀
症狀一:在Linux中頻繁存取文件,物理內存很快用光,而cached一直在增加。
解釋:Linux會對每次請求過的數據緩存在cache裏,好處就是CPU的處理速度遠遠高於內存,因此在CPU和內存通信的時候能夠快速從cache中命中結果返回。
症狀二:Swap被佔用。
解釋:內存可能不夠了,纔會佔Swap,因此Swap能夠做爲服務器監控的一項指標,引發注意。
4. 手動清理Swap和buffers/cache
(1) 清理Swap
swapoff -a && swapon -a
操做說明:若是已經使用了Swap,且當前清空下+buffers/cache還有空間,在執行swapoff -a操做時,會觸發把Swap中的內容交換到內存中,數據不會丟失。
(2) 清理buffers/cache:
sync; sync; sync;&& echo 3 >/proc/sys/vm/drop_caches
sleep 2
echo 0 > /proc/sys/vm/drop_caches
操做說明:
sync-->將緩存的內從寫回到硬盤中;
echo 3 >/proc/sys/vm/drop_caches-->修改drop_caches的值爲3,默認爲0,改成3系統會清理緩存的內容;
sleep 2 --> 等一下,防止上一步沒執行完;
echo 0 >/proc/sys/vm/drop_caches --> 改回默認值
5. 總結
經過上面的分析能夠知道,當空閒物理內存很少時,不必定表示系統運行狀態不好,由於內存的cache及buffer部分能夠隨時被重用,在某種意義上,這兩部份內存也能夠看做詩額外的空閒內存。swap若是被頻繁調用,bi,bo長時間不爲0,則纔是內存資源是否緊張的依據。經過free看資源時,實際主要關注-/+ buffers/cache的值就能夠知道內存到底夠不夠了。
更多精彩內容,請訪問:圈裏圈外