Linux-Memory小記--free -m
以前我對這塊認識很模糊,而且還有錯誤的認識;所以我決定來好好的縷縷這塊的關系。
圖:


1.參數含義
-
1.Mem:表示物理內存統(tǒng)計
total: 表示系統(tǒng)總物理內存5993156kb(約5852M)
used: 表示總計分配給緩存(包含buffers 與cached),但其中可能部分緩存未實際使用
free:表示未分配的內存
shared: 表示共享內存
buffers:表示系統(tǒng)分配但未被使用的buffers數量
cached:表示系統(tǒng)分配但未被使用的cache的數量
在Free命令中顯示的buffer和cache,它們都是占用內存:
buffer : 作為buffer cache的內存,是塊設備的讀寫緩沖區(qū),更靠近存儲設備,或者直接就是disk的緩沖區(qū)。
cached: 作為page cache的內存, 文件系統(tǒng)的cache,是memory的緩沖區(qū) 。
如果cached 的值很大,說明cache住的文件數很多。如果頻繁訪問到的文件都能被cache住,那么磁盤的讀IO 必會非常小 。
-
- -/+ buffers/cached: 表示物理內存的緩存統(tǒng)計
used: 表示實際使用的buffers與cache的總量,這就是實際使用的內存總量
free: 表示未被使用的buffers與cache和未被分配的內存之和,這就是系統(tǒng)當前實際可能內存(所以一般linux機器看可用內存就看此值)
3.Swap: 表示硬盤上交換分區(qū)的使用情況。只有mem被當前進程實際占用完,即沒有了buffers和cache時,才會使用到swap。
2.常用概念
物理內存總大小 :
mem.total=mem.used+mem.free
mem.total=(-/+ buffers/cached).used+(-/+ buffers/cached).free已經分配的內存大?。?br> mem.used=mem.buffers+mem.cached+(-/+ buffers/cached).used
實際可用內存大小:
(-/+ buffers/cached).free=mem.free+mem.buffers+mem.cached
3.手工清除緩存
# sync
# echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
cache釋放:
a.To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
b.To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
c.To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches
說明,釋放前最好sync一下,防止丟數據。
4.常見疑惑
1.用戶常見的疑問是,為什么free這么小,是否關閉應用后內存沒有釋放?
但實際上,我們都知道這是因為Linux對內存的管理與Windows不同,free小并不是說內存不夠用了,應該看的是free的第二行最后一個值:-/+ buffers/cache: 2592892Kb,這才是系統(tǒng)可用的內存大小。2.free內存還有200M,cache里有58G,然后程序就跪了,拋了個tcmalloc allocation failed 65536, out of memory(needed 65312 bytes). 需要內存時為什么cache里面的沒能釋放?
cache 中有程序在占用就無法釋放了。3.有時候free太小,cached特別大時啟動mysql會報錯,這個是什么原因?
這說明內存確實不夠,cached并不是全部可以釋放的,有程序占用就不能釋放了4.我的Linux上cache占滿RAM時系統(tǒng)非常慢,系統(tǒng)也不自動釋放cache。所以號稱“cache對性能只有好處而沒壞處”是假的!
這個要看你實際是使用的應用是什么。cache能帶來的好處是,減輕頻繁讀寫硬盤的需要,也就是降低IO,這特別是對于服務器上的應用來說是很常見的。相反,如果cache需要頻繁更新,那會出現您提到的問題了。