top free命令真的能得到實際內存使用狀況嗎?

一.關於Virtual Memory
參考:http://serverfault.com/questions/138427/top-what-does-virtual-memory-size-mean-linux-ubuntu
這裏寫圖片描述
虛擬內存往往是在線程在內存中映射了一個很大的文件,而這個文件存儲在磁盤上,也需要佔用一個很大的地址空間,交換區的問題撇開不談。
這裏寫圖片描述
而RES內存纔是線程真正佔用的內存*
這裏寫圖片描述
最準確的,首先要排除其他線程的內存動態大幅變化的前提下,啓動線程,記錄free memory掉的情況,vmstat和free命令都可以
VIRT字段的man page:

o: VIRT  --  Virtual Image (kb)
      The  total  amount  of  virtual  memory  used  by the task.  It
      includes all code, data and shared libraries  plus  pages  that
      have been swapped out.

      VIRT = SWAP + RES.​

所以它是一個統計數據
參考:http://serverfault.com/questions/122810/apache-heavy-load-virt-vs-res-memory
VIRT在實時內存的衡量上,幾乎是不需要考慮的
二.關於Used Memory
案例:
參考http://stackoverflow.com/questions/4802481/how-to-see-top-processes-by-actual-memory-usage

這裏寫圖片描述
這裏存在一個問題,free命令或者top標題部分顯示的used統計數據,和top標題下面的部分的詳細進程的RES的累加,
差別很大,used遠大於RES的累加和
還有一個問題,就是進城的真實佔用內存,top命令顯示的是不是偏少?
三.嘗試
我們將之前消耗內存很嚴重的協處理器程序,讓他跑起來,監控86機器(87,88,89的free memory太少,數據變化很快穩定,不易觀察),在運行腳本前後,通過free -m命令和top命令監控內存變化情況:
這裏寫圖片描述
||
||
\/
這裏寫圖片描述
可見,腳本運行16分鐘後,86機器:
free memory: 37.4G —> 29.3G
HRegionserver:RES 2.1G —> 2.1G VIRT 3428m —> 3455m
關閉腳本一段時間:
這裏寫圖片描述
86機器:
free memory: 37.4g —> 29.3g —> 29.2g
HRegionserver:RES 2.1g —> 2.1g —> 2.2g VIRT 3428m —> 3455m —> 3610m
可見,free memory掉了8個G,但是top命令得到的HRegionserver等process的RES並沒有明顯增加!
仔細觀察top結果(按照m排序)中,各個process的RES都沒有大的變化,其實top下面的關於process的各項指標幾乎都變化不大!
但是,我們觀察到; swap部分:
swap cached:21.7g —> 29.8g —> 29.8g
正好cache佔用增加了8個G
然後,我們參考:
這裏寫圖片描述
總結來說,就是Linux系統並不是簡單的將內存分配給各個process,它還進行了一層內存管理
第一.訪問文件的文件數據,系統會緩存起來,以便以後訪問,就是所說的命中內存頁類似的原理,
這部分的文件緩存的處理,直接體現在swap cached統計數據裏面,也體現在VIRT Memory裏面,兩個都是統計數據,只增不減,跟process實際佔用的內存不直接相關
我們再使用smem工具分析內存的消耗:
這裏寫圖片描述
=====||||||||=====
====\\\//////====
這裏寫圖片描述
SMEM工具的右邊三列是USS PSS RSS
free memory: 29.0g —> 20.2g
而smem顯示的habse 114605 process佔用的USS穩定而且還下降了,VIRT內存不變,swap cache上漲了8個g
可見我們的process做了很多文件方面的讀寫活動,導致系統將內存分配出去緩存這些內容,成爲了“被浪費”的used memory,這部分內存需要Linux系統去回收
四.問題的進一步解答
top命令顯示的線程實際內存佔用是RES這一指標,但是所有線程的RES數之和與used memeory差別很大(至少是兩倍多)?
參考:http://serverfault.com/questions/377617/how-to-interpret-output-from-linux-top-command
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
總結就是 :
(一):used這個統計量,並不是用戶線程佔用內存之和,而是Linux系統總共消耗的內存,用戶線程是“寄生”於Linux OS之上的;
(二):對於free統計量,是“乾淨的”可以直接分配的內存,但是cached和buffered這兩種狀態的內存,主要是映射到磁盤的緩衝,也能夠被繼續分配
(三):真正被使用的內存real free memory = used - buffers - cached;真正可用的內存real free memory = total - real free memory

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章