Linux内存管理中的RSS和VSZ是什么?在多线程环境中,如何管理和跟踪这两者呢?
当前回答
它们不是管理的,而是度量的,并且可能是有限的(参见getrlimit系统调用,也在getrlimit(2)上)。
RSS意味着常驻集大小(位于RAM中的虚拟地址空间的一部分)。
可以使用proc(5)和cat /proc/1234/maps查询1234进程的虚拟地址空间,通过cat /proc/1234/status查询1234进程的状态(包括内存消耗)
其他回答
RSS是常驻设置大小,用于显示分配给该进程的内存大小和内存大小。它不包括被换出的内存。它确实包括来自共享库的内存,只要来自这些库的页面实际上在内存中。它确实包括所有堆栈和堆内存。
VSZ是虚拟内存大小。它包括进程可以访问的所有内存,包括交换出的内存、已分配但未使用的内存以及来自共享库的内存。
因此,如果进程A有500K的二进制文件,并链接到2500K的共享库,有200K的堆栈/堆分配,其中100K实际在内存中(其余的被交换或未使用),并且它实际上只加载了1000K的共享库和400K的自己的二进制文件,那么:
RSS: 400K + 1000K + 100K = 1500K
VSZ: 500K + 2500K + 200K = 3200K
由于部分内存是共享的,许多进程可能会使用它,因此如果您将所有RSS值加起来,您很容易得到比系统拥有的更大的空间。
在程序实际使用之前,分配的内存也可能不在RSS中。因此,如果您的程序预先分配了一堆内存,然后随着时间的推移使用它,您可以看到RSS增加,而VSZ保持不变。
还有PSS(比例设定大小)。这是一种较新的测量方法,用于跟踪当前进程使用的共享内存的比例。因此,如果有两个进程使用之前的相同共享库:
PSS: 400K + (1000K/2) + 100K = 400K + 500K + 100K = 1000K
所有线程共享相同的地址空间,因此每个线程的RSS、VSZ和PSS与进程中所有其他线程相同。使用ps或top在linux/unix中查看此信息。
还有比这更多的方法,要了解更多,请查看以下参考资料:
http://manpages.ubuntu.com/manpages/en/man1/ps.1.html https://web.archive.org/web/20120520221529/http://emilics.com/blog/article/mconsumption.html
还看到:
一种方法来确定进程的“真实”内存使用,即私有脏RSS?
I think much has already been said, about RSS vs VSZ. From an administrator/programmer/user perspective, when I design/code applications I am more concerned about the RSZ, (Resident memory), as and when you keep pulling more and more variables (heaped) you will see this value shooting up. Try a simple program to build malloc based space allocation in loop, and make sure you fill data in that malloc'd space. RSS keeps moving up. As far as VSZ is concerned, it's more of virtual memory mapping that linux does, and one of its core features derived out of conventional operating system concepts. The VSZ management is done by Virtual memory management of the kernel, for more info on VSZ, see Robert Love's description on mm_struct and vm_struct, which are part of basic task_struct data structure in kernel.
它们不是管理的,而是度量的,并且可能是有限的(参见getrlimit系统调用,也在getrlimit(2)上)。
RSS意味着常驻集大小(位于RAM中的虚拟地址空间的一部分)。
可以使用proc(5)和cat /proc/1234/maps查询1234进程的虚拟地址空间,通过cat /proc/1234/status查询1234进程的状态(包括内存消耗)
总结@jmh的精彩回答:
在#linux中,进程的内存包括:
它自己的二进制 它的共享库 它的堆栈和堆
由于分页,并不是所有这些都总是完全在内存中,只有有用的、最近使用的部分(页面)是。其他部分被换出(或换出),以便为其他进程腾出空间。
下面的表格摘自@jmh的回答,它展示了一个用于特定进程的常驻内存和虚拟内存的示例。
+-------------+-------------------------+------------------------+
| portion | actually in memory | total (allocated) size |
|-------------+-------------------------+------------------------|
| binary | 400K | 500K |
| shared libs | 1000K | 2500K |
| stack+heap | 100K | 200K |
|-------------+-------------------------+------------------------|
| | RSS (Resident Set Size) | VSZ (Virtual Set Size) |
|-------------+-------------------------+------------------------|
| | 1500K | 3200K |
+-------------+-------------------------+------------------------+
总而言之:常驻内存是当前物理内存中实际存在的内存,而虚拟大小是加载所有组件所需的全部物理内存。
当然,这些数字不能相加,因为库是在多个进程之间共享的,并且它们的内存是为每个进程单独计算的,即使它们只加载一次。
虚拟集大小
虚拟集大小是在初始执行期间分配给进程(程序)的内存大小。虚拟集大小内存只是一个进程可用于执行的内存数量。
RSS -常驻设置大小(有点RAM)
相对于VSZ(虚拟集大小),RSS是进程当前使用的内存。这是以千字节为单位的当前进程使用RAM的实际数字。
源