Linux-Memory小記

hackeruncle發表於2016-12-30
以前我對這塊認識很模糊,而且還有錯誤的認識;今天由我同事提醒,所以我決定來好好的縷縷這塊的關係。

圖:

Linux-Memory小記

Linux-Memory小記
  

-------------------------------------------1.引數含義-----------------------------------------------------------------------
Mem:表示實體記憶體統計
   total: 表示系統總實體記憶體5993156kb(約5852M)
   used: 表示總計分配給快取(包含buffers 與cached),但其中可能部分快取未實際使用
   free:表示未分配的記憶體
   shared: 表示共享記憶體
   buffers:表示系統分配但未被使用的buffers數量
   cached:表示系統分配但未被使用的cache的數量

在Free命令中顯示的buffer和cache,它們都是佔用記憶體:
buffer :   作為buffer cache的記憶體,是塊裝置的讀寫緩衝區,更靠近儲存裝置,或者直接就是disk的緩衝區。
cached:  作為page cache的記憶體, 檔案系統的cache,是memory的緩衝區 。
如果cached 的值很大,說明cache住的檔案數很多。如果頻繁訪問到的檔案都能被cache住,那麼磁碟的讀IO 必會非常小 。


-/+ buffers/cached:   表示實體記憶體的快取統計
   used: 表示實際使用的buffers與cache的總量,這就是實際使用的記憶體總量
   free:  表示未被使用的buffers與cache和未被分配的記憶體之和,這就是系統當前實際可能記憶體(所以一般linux機器看可用記憶體就看此值

Swap:   表示硬碟上交換分割槽的使用情況。只有mem被當前程式實際佔用完,即沒有了buffers和cache時,才會使用到swap。

-------------------------------------------2.常用概念-----------------------------------------------------------------------
實體記憶體總大小 :
mem.total=mem.used+mem.free
mem.total=(-/+ buffers/cached).used+(-/+ buffers/cached).free

已經分配的記憶體大小:
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,這才是系統可用的記憶體大小。

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時系統非常慢,系統也不自動釋放cache。所以號稱“cache對效能只有好處而沒壞處”是假的!
   這個要看你實際是使用的應用是什麼。cache能帶來的好處是,減輕頻繁讀寫硬碟的需要,也就是降低IO,這特別是對於伺服器上的應用來說是很常見的。相反,如果cache需要頻繁更新,那會出現您提到的問題了


  
5.我們該怎樣定位出記憶體洩露問題?(這個問題我一直在思考,也有工具去檢測,假如有很好的方法的話,希望小夥伴們給我留言,謝謝

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30089851/viewspace-2131678/,如需轉載,請註明出處,否則將追究法律責任。