2011-10-24 26 views
197

Linux內存管理中的RSS和VSZ是什麼?在多線程環境中,這些可以如何管理和跟蹤?什麼是Linux內存管理中的RSS和VSZ

+0

[Understanding the Linux oom-killer's logs](http://stackoverflow.com/questions/9199731/understanding-the-linux-oom-killers-logs) – msangel

回答

0

他們沒有管理,但測量和可能有限(請參閱getrlimit系統調用,也在getrlimit(2))。

RSS表示resident set size(虛擬地址空間的一部分坐在RAM中)。

可以查詢過程1234的使用proc(5)cat /proc/1234/maps及其狀態(包括內存消耗)通cat /proc/1234/status

+0

這個鏈接可能回答這個問題,最好在這裏包含答案的基本部分,並提供參考鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/18966880) – Maak

+0

我提供了第二個鏈接。其中一個將保持有效 –

36

RSS的virtual address space是駐留集大小(物理駐留內存 - 這在機器的物理內存目前佔用空間),而VSZ是虛擬內存大小(地址空間分配 - 這個地址分配在進程的內存映射中,但是現在不一定有任何實際的內存)。

請注意,在常見虛擬機的這些日子裏,機器視點的物理內存可能不是真正的物理內存。

+0

提供比簡稱更多的信息? – Pithikos

282

RSS是Resident Set Size(駐留集大小),用於顯示爲該進程分配了多少內存並位於RAM中。它不包括被換出的內存。只要來自這些庫的頁面實際上在內存中,它就包含來自共享庫的內存。它確實包含了所有堆棧和堆內存。

VSZ是虛擬內存大小。它包括進程可以訪問的所有內存,包括被換出的內存和來自共享庫的內存。

因此,如果進程A有一個500K的二進制文件,並鏈接到共享庫2500K,具有200K的堆棧/堆分配,其中100K實際上在內存中(其餘部分被交換),並且實際上只加載了1000K的共享庫和自己的二進制的400K則:

RSS: 400K + 1000K + 100K = 1500K 
VSZ: 500K + 2500K + 200K = 3200K 

由於記憶的一部分是共享的,許多過程可能會使用它,因此,如果你把所有的RSS值,你可以很容易地用得比較多空間,最終你係統有。

還有PSS(比例組大小)。這是一種較新的方法,它將共享內存作爲當前進程使用的比例進行跟蹤。因此,如果有使用相同的共享庫由前兩個過程:

PSS: 400K + (1000K/2) + 100K = 400K + 500K + 100K = 1000K 

線程共享相同的地址空間,所以RSS,VSZ和PSS爲每個線程是相同的所有過程中的其他線程。使用ps或top在linux/unix中查看這些信息。

沒有比這樣更給它,瞭解更多檢查以下參考資料:

另見:

+8

我相信RSS *包含來自動態鏈接庫的內存。如果有3個使用'libxml2.so'的進程,共享庫將被計入每個RSS中,所以它們的RSS總和將超過實際使用的內存。 – nfm

+1

這是正確的。我已經解決了我的答案,謝謝你的提高。 – jmh

+0

我在Ubuntu 16.04上,並且有一個java進程擁有1.2G RES和4.5G VIRT從'top'命令顯示。這個系統沒有任何交換,'swapon --show'什麼都不返回。你如何解釋這個?如果vsz是交換+共享庫,在這種情況下,共享庫超過3.3G?可能嗎?只是非常困惑... –

1

我覺得很多已經說過,關於RSS vs VSZ。從管理員/程序員/用戶的角度來看,當我設計/編寫應用程序時,我更關心RSZ(駐留內存),因爲當你不停地拉動越來越多的變量(堆積)時,你會看到這個值開始上升。嘗試一個簡單的程序,在循環中構建基於malloc的空間分配,並確保在malloc'd空間中填充數據。 RSS繼續向上移動。 就VSZ而言,它更像是Linux所做的虛擬內存映射,它的核心功能之一源自傳統的操作系統概念。 VSZ管理由內核的虛擬內存管理完成,關於VSZ的更多信息,請參閱Robert Love關於mm_struct和vm_struct的描述,它們是內核中基本task_struct數據結構的一部分。