Linux內存工具解析之RSS/VSS/USS/PSS區別於聯繫

對於Linux系統程序開發人員,經常需要和進程所使用的內存情況打交道,比如,分析程序的內存泄漏問題。這時候我們可能使用ps、top、procrank、dumpsys(後兩個命令爲Android系統)來跟蹤、調試進程內存的使用情況。上述幾個工具進程涉及到的幾個比較的重要的概念:VSS、RSS、PSS、USS,對於這幾個概念,大家總是存在一種似曾相識,卻又不甚瞭解的感覺,這對於真正的把握進程內存使用情況是十分有害的。所以,本文旨在徹底分析這個四個概念,弄清各個量之間的聯繫和區別,提供有助於解釋各種工具的內存報告的信息,以便確定Linux進程和系統的實際內存使用量,爲以後分析內存問題提供堅實的理論基礎。

基本概念

  • VSS:Virtual Set Size 虛擬耗用的內存(包含與其他進程共享佔用的虛擬內存)
  • RSS:Resident Set Size 實際使用的物理內存(包含與其他進程共享佔用的內存)
  • PSS:Proportional Set Size 實際使用的物理內存(按比例包含與其他進程共享佔用的內存)
  • USS:Unique Set Size 進程肚子佔用的物理內存(不包含與其他進程共享佔用的內存)

對於單個進程,一般來說內存佔用大小排序如下:VSS >= RSS >= PSS >= USS

概念解析

Android有一個名爲procrank(/system/xbin/procrank)的工具,它列出了Linux進程的內存使用量,並按使用量的高低排序。每個進程報告的內存使用情況分爲VSS、RSS、PSS和USS。

爲了簡單起見,在這個描述中,內存將用頁面而不是字節來表示。像我們這樣的Linux系統在最低級別上以4096字節的頁面管理內存。

下面分別具體解釋一下各個概念的含義:

  1. VSS(ps工具中表示爲VSZ)表示進程總的可訪問地址空間。這個大小還包括可能不駐留在RAM中的內存,比如使用malloc分配內存後,尚未寫入數據的內存。VSS對於確定進程的實際內存使用量幾乎沒有什麼用處。

  2. RSS表示一個進程在RAM中實際擁有的總內存。RSS可能具有誤導性,因爲它包括了該進程與其他進程共享的實際物理內存使用量,例如,對於共享庫,其往往只加載到內存中一次,而不管有多少進程使用它。RSS不能準確地表示單個進程的內存使用情況。

  3. PSS與RSS不同之處是,對於進程間共享的內存,其按比例報告其所使用的共享物理內存大小。比如有n進程同時在使用一個共享庫,那對於單個進程其佔用的該共享庫的內存爲1/n。如果三個進程都使用一個有30頁的共享庫,那麼這個庫將只向每個進程報告的PSS貢獻10頁。PSS是一個非常有用的數字,因爲當系統中所有進程的PSS加在一起時,就可以很好地表示系統中總的內存使用量。當一個進程被終止時,貢獻給它的PSS的共享庫將按比例分配給仍然使用該庫的其他進程的PSS總數。這樣,PSS可能有點誤導人,因爲當進程被終止時,PSS不能準確地表示返回到整個系統的內存。

  4. USS表示進程佔用的總的物理內存大小,也就是說這部分內存是該進程完全獨佔的。 USS是一個非常有用的數字,因爲它表示運行特定進程的實際增量成本。當進程被終止時,USS是實際返回給系統的總內存。當最初懷疑某個進程存在內存泄漏時,USS是最好的監視數字。

對於使用Python的系統,還有一個很好的工具叫做ledsmem,它可以報告內存統計信息,包括所有這些類別。

NOTE:這裏有幾個問題需要注意

  1. 兩個進程共享的部分,遠遠不是隻有共享庫,比如我們在Linux裏面開2個bash進程,那麼這2個bash,實際是共享1個代碼段;其他的mmap()的時候shared的映射當然也是兩個進程共享的內存。

  2. 共享庫裏面的內存,也不是都共享,只是代碼段等不會做CoW(寫時拷貝)的內存纔會跨進程共享。

  3. USS去掉的是所有跨進程共享的內存,不是隻去掉了共享庫。

實例解析

下面通過一個實例,具體解析各個量之間的關係。假設Linux下有兩個bash進程、一個cat進程,進程ID分別爲1044、1045、1054,下面通過公式分別計算VSS、RSS、PSS、USS:

在這裏插入圖片描述

  • VSS = 1 + 2 + 3
  • RSS = 4 + 5 + 6
  • PSS = 4/3 + 5/2 + 6
  • USS = 6

上圖中的4這片內存,是libc的代碼段在內存駐留的部分,被3個進程共享;5這段內存,是bash的代碼段,被2個進程(1044和1045)指向。在計算PSS的時候,這些都需要被比例化。

監測工具

對於Linux系統,一般都會提供ps、top兩個命令,Android系統還會提供procrank、dumpsys這兩個命令。對於ps、top其只能查到VSS、RSS這兩個值;procrank、dumpsys可以提供PSS、USS信息,dumpsys meminfo 可以查出native和dalvik分別佔用多少內存。另外,dumpsys可以查詢到很多有用的系統信息,比如meminfo、cpuinfo、activity、window、wifi、account等信息。

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