線上叢集後端某台Web伺服器例行檢查時,我觀察到+buffers/cache值(即Linux記憶體的實際使用情況)一直都是5365左右,就算停掉Nginx+FastCGI程式和其它程式也是一樣,考慮到這台機器經常在使用rsync+inotify,肯定會存在着頻繁存取檔案的情況。而Linux系統有一個特性:在Linux下頻繁存取檔案時,就會占用實體記憶體。當程式結束時并不會自動釋放被占用的記憶體,而是一直作為Cache存在。實際上核心結束一個程式後,它是會釋放記憶體的,但是核心并沒有立刻将這部分收集到free當中,而是存在在cached或者buffer當中,提高系統的io效率,cache和buffered的記憶體是由核心進行動态的配置管理,如果系統的free大小不夠的時候,系統會自動釋放cache buffer的記憶體給程式使用(是以如果是看到used很多,來手動釋放記憶體其實是不需要的,我前面的文章及書籍其實也說明了我們應該如何觀察Linux系統的實際記憶體使用情況,這裡就不再多描述了)。
操作步驟:
1、查詢目前記憶體使用情況和釋放緩存的參數
free -m
指令結果如示所示:
1
2
3
4
<code> </code><code>total used </code><code>free</code> <code>shared buffers cached</code>
<code>Mem: 10988 6792 4196 0 168 1001</code>
<code>-/+ buffers</code><code>/cache</code><code>: 5622 5365</code>
<code>Swap: 4295 0 4295</code>
檢視釋放緩存參數的指令,如下所示:
<code>cat</code> <code>/proc/sys/vm/drop_caches</code>
系統預設顯示為0,0為預設值,即表示不釋放。
2、使用sync指令,将系統緩存區中的髒資料寫入磁盤中,包括已修改的i-node、已延遲的塊I/O和讀寫映射檔案,指令如下:
<code>sync</code>
3、配置檔案/proc/sys/vm/drop_caches中記錄了緩存釋放的參數,指令如下:
<code>echo</code> <code>3 > </code><code>/proc/sys/vm/drop_caches</code>
4、不重新開機機器使配置改生效,指令如下:
<code>sysctl -p</code>
執行以上操作以後, +buffers/cache值由5365漲到了9500,這個值就恢複正常了。不過個人覺得Linux系統(尤其是CentOS系統)管理記憶體的方式其實是很優異的,很多時候并不需要手動釋放記憶體;另外,工作中感覺rsync+inotify的方式還是存在着很多缺陷,正在慢慢将其往rsync+puppet環境遷移。
本文轉自 撫琴煮酒 51CTO部落格,原文連結:http://blog.51cto.com/yuhongchun/1430026,如需轉載請自行聯系原作者