您好,登錄后才能下訂單哦!
進程內存使用PSS和VSZ的區別,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
可以使用 ps aux 命令獲取每進程的內存使用,其中VSZ表示虛擬內存使用大小,RSS(resident set size)表示常駐內存的大小,來自于/proc/PID/status文件。
~ # ps aux | head USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.4 0.1 18984 1968 ? Ss 10:58 0:47 /sbin/hello root 2 0.0 0.0 0 0 ? S 10:58 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 10:58 0:10 [ksoftirqd/0]
但RSS并不代表進程的實際內存消耗,因為不同的進程之間會共享內存,所以把所有進程RSS進行累加的方法會重復計算共享內存,得到的結果是偏大的。正確的方式是累加/proc/PID/smaps中的Pss(process's proportional share of this mapping)字段。選取某個vma的統計數據:
01e70000-01ef6000 rw-p 00000000 00:00 0 [heap] Size: 536 kB Rss: 408 kB Pss: 408 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 408 kB Referenced: 408 kB Anonymous: 408 kB AnonHugePages: 0 kB ShmemPmdMapped: 0 kB Shared_Hugetlb: 0 kB Private_Hugetlb: 0 kB Swap: 0 kB SwapPss: 0 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Locked: 0 kB VmFlags: rd wr mr mw me ac sd
每個虛擬內存區域(VMA)是一個連續的虛擬地址范圍,并且它們不會重疊。一個vm_area_struct實例完整的描述了一個內存區域,包括起止地址、訪問權限標志以及用于指出被映射文件(如果存在)的vm_file字段。其中,size表示這段虛擬空間的大小,Rss表示駐留內存的大小,Pss表示分攤后的內存大小,Referenced表示總共被引用或被訪問的內存大小,Anonymous表示沒有映射到文件的內存大小,Swap也是匿名內存,表示交換分區內存的大小。各個字段的關系如下:
USS = Private_Clean + Private_Dirty Pss = USS + (Shared_Clean + Shared_Dirty)/n RSS = USS + Shared_Clean + Shared_Dirty
以hello進程為例,使用前面介紹的統計內存的數據:
使用ps ~ # ps aux | grep /sbin/hello root 1182 0.7 0.2 474208 5636 ? Sl 11:00 1:38 /sbin/hello
grep -w Pss /proc/1182/smaps | awk 'BEGIN{sum=0} {sum+=$2} END {print "total mem:"sum}' total mem:1752
可以看到,RSS與PSS相差非常大。進程的內存統計一定是使用Pss。
關于進程內存使用PSS和VSZ的區別問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。