Linux内存管理中的RSS和VSZ是什么
Linux内存管理中的RSS和VSZ是什么?在多线程环境中如何管理和跟踪这两者?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
Linux内存管理中的RSS和VSZ是什么?在多线程环境中如何管理和跟踪这两者?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(7)
RSS 是驻留集大小,用于显示分配给该进程的 RAM 内存量。它不包括换出的内存。它确实包含来自共享库的内存,只要这些库中的页面实际上位于内存中。它确实包括所有堆栈和堆内存。
VSZ 是虚拟内存大小。它包括进程可以访问的所有内存,包括换出的内存、已分配但未使用的内存以及来自共享库的内存。
因此,如果进程 A 有 500K 的二进制文件并链接到 2500K 的共享库,有 200K 的堆栈/堆分配,其中 100K 实际上在内存中(其余部分已交换或未使用),并且它仅实际加载了 1000K 的共享库以及 400K 的自己的二进制文件:
由于部分内存是共享的,因此许多进程可能会使用它,因此如果将所有 RSS 值相加,您可以轻松得到结果比您的系统拥有更多的空间。
分配的内存在被程序实际使用之前也可能不会出现在 RSS 中。因此,如果您的程序预先分配了一堆内存,然后随着时间的推移使用它,您可能会看到 RSS 上升而 VSZ 保持不变。
还有 PSS(比例设置大小)。这是一种较新的测量方法,它跟踪共享内存作为当前进程使用的比例。因此,如果有两个进程使用之前的同一个共享库:
线程都共享相同的地址空间,因此每个线程的 RSS、VSZ 和 PSS 与进程中的所有其他线程相同。在 linux/unix 中使用 ps 或 top 查看此信息。
事情远不止于此,要了解更多信息,请查看以下参考文献:
另请参阅:
RSS is the Resident Set Size and is used to show how much memory is allocated to that process and is in RAM. It does not include memory that is swapped out. It does include memory from shared libraries as long as the pages from those libraries are actually in memory. It does include all stack and heap memory.
VSZ is the Virtual Memory Size. It includes all memory that the process can access, including memory that is swapped out, memory that is allocated, but not used, and memory that is from shared libraries.
So if process A has a 500K binary and is linked to 2500K of shared libraries, has 200K of stack/heap allocations of which 100K is actually in memory (rest is swapped or unused), and it has only actually loaded 1000K of the shared libraries and 400K of its own binary then:
Since part of the memory is shared, many processes may use it, so if you add up all of the RSS values you can easily end up with more space than your system has.
The memory that is allocated also may not be in RSS until it is actually used by the program. So if your program allocated a bunch of memory up front, then uses it over time, you could see RSS going up and VSZ staying the same.
There is also PSS (proportional set size). This is a newer measure which tracks the shared memory as a proportion used by the current process. So if there were two processes using the same shared library from before:
Threads all share the same address space, so the RSS, VSZ and PSS for each thread is identical to all of the other threads in the process. Use ps or top to view this information in linux/unix.
There is way more to it than this, to learn more check the following references:
Also see:
RSS 是 Resident Set Size(物理驻留内存 - 当前在机器物理内存中占用的空间),VSZ 是 Virtual Memory Size(分配的地址空间 - 这在进程的内存映射中分配了地址,但不一定有任何地址)现在就在它背后的实际记忆)。
请注意,在当今常见的虚拟机中,从机器的角度来看,物理内存可能并不是真正的物理内存。
RSS is Resident Set Size (physically resident memory - this is currently occupying space in the machine's physical memory), and VSZ is Virtual Memory Size (address space allocated - this has addresses allocated in the process's memory map, but there isn't necessarily any actual memory behind it all right now).
Note that in these days of commonplace virtual machines, physical memory from the machine's view point may not really be actual physical memory.
最小可运行示例
为了使这一点有意义,您必须了解分页的基础知识:x86 分页是如何工作的? 特别是操作系统可以在 RAM 或磁盘上实际拥有后备存储之前通过页表/其内部内存簿记录(VSZ 虚拟内存)分配虚拟内存(RSS 常驻内存)。
现在,为了观察实际情况,让我们创建一个程序:
mmap
分配比物理内存更多的 RAMmain.c
GitHub 上游。
编译并运行:
其中:
echo 1 | sudo tee /proc/sys/vm/overcommit_memory
:Linux 需要允许我们进行大于物理 RAM 的 mmap 调用:malloc 可以分配的最大内存程序输出:
退出状态:
由128 + 信号编号规则意味着我们得到了信号编号
9
,man 7 signal
表示的是 SIGKILL,由 Linux 内存不足杀手 。输出解释:
printf '0x%X\n' 0x40009A4 KiB ~= 64GiB
(ps
值以 KiB 为单位)。extra_memory_commissed 0
,这意味着我们尚未触及任何页面。 RSS 是一个很小的 1648 KiB
,已分配用于正常程序启动,如文本区域、全局变量等。8388608 KiB == 8GiB
的页面。结果,RSS 正好增加了 8GIB,达到8390256 KiB == 8388608 KiB + 1648 KiB
另请参阅:https://unix.stackexchange.com/questions/35129/need-解释-on-resident-set-size-virtual-size
OOM杀手日志
我们的
dmesg
命令已经显示了OOM杀手日志。有关这些内容的确切解释,请访问:
日志的第一行是:
所以我们看到,有趣的是,总是在我的笔记本电脑后台运行的 MongoDB 守护进程首先触发了 OOM 杀手,大概是当这个可怜的东西试图分配一些内存时。
然而,OOM杀手并不一定会杀死唤醒它的人。
调用之后,内核打印一个表或进程,包括 oom_score :
再往前我们看到我们自己的小 main.out 实际上在上一次调用中被杀死了
:日志提到该进程的得分为 865,大概是最高(最差)的 OOM 杀手得分,如下所述:https://unix.stackexchange.com/ questions/153585/how-does-the-oom-killer-decide-which-process-to-kill-first
另外有趣的是,一切显然发生得如此之快,以至于在释放的内存被计算之前,
oom
再次被DeadlineMonitor
进程唤醒:这次杀死了一些 Chromium 进程,该进程通常是我的计算机的正常内存占用:
在 Ubuntu 19.04、Linux 内核 5.0 中测试。 0。
Linux 内核文档
https:// /github.com/torvalds/linux/blob/v5.17/Documentation/filesystems/proc.rst 有一些要点。那里没有使用术语“VSZ”,但使用了“RSS”,并且没有什么太有启发性的(惊讶?!)
内核似乎使用术语
VmSize
而不是VSZ,它出现在<代码>/proc/$PID/status。一些感兴趣的引言:
所以我们可以猜测更多的事情:
Minimal runnable example
For this to make sense, you have to understand the basics of paging: How does x86 paging work? and in particular that the OS can allocate virtual memory via page tables / its internal memory book keeping (VSZ virtual memory) before it actually has a backing storage on RAM or disk (RSS resident memory).
Now to observe this in action, let's create a program that:
mmap
main.c
GitHub upstream.
Compile and run:
where:
echo 1 | sudo tee /proc/sys/vm/overcommit_memory
: required for Linux to allow us to make a mmap call larger than physical RAM: Maximum memory which malloc can allocateProgram output:
Exit status:
which by the 128 + signal number rule means we got signal number
9
, whichman 7 signal
says is SIGKILL, which is sent by the Linux out-of-memory killer.Output interpretation:
printf '0x%X\n' 0x40009A4 KiB ~= 64GiB
(ps
values are in KiB) after the mmap.extra_memory_committed 0
, which means we haven't yet touched any pages. RSS is a small1648 KiB
which has been allocated for normal program startup like text area, globals, etc.8388608 KiB == 8GiB
worth of pages. As a result, RSS increased by exactly 8GIB to8390256 KiB == 8388608 KiB + 1648 KiB
See also: https://unix.stackexchange.com/questions/35129/need-explanation-on-resident-set-size-virtual-size
OOM killer logs
Our
dmesg
commands have shown the OOM killer logs.An exact interpretation of those has been asked at:
The very first line of the log was:
So we see that interestingly it was the MongoDB daemon that always runs in my laptop on the background that first triggered the OOM killer, presumably when the poor thing was trying to allocate some memory.
However, the OOM killer does not necessarily kill the one who awoke it.
After the invocation, the kernel prints a table or processes including the
oom_score
:and further ahead we see that our own little
main.out
actually got killed on the previous invocation:This log mentions the
score 865
which that process had, presumably the highest (worst) OOM killer score as mentioned at: https://unix.stackexchange.com/questions/153585/how-does-the-oom-killer-decide-which-process-to-kill-firstAlso interestingly, everything apparently happened so fast that before the freed memory was accounted, the
oom
was awoken again by theDeadlineMonitor
process:and this time that killed some Chromium process, which is usually my computers normal memory hog:
Tested in Ubuntu 19.04, Linux kernel 5.0.0.
Linux kernel docs
https://github.com/torvalds/linux/blob/v5.17/Documentation/filesystems/proc.rst has some points. The term "VSZ" is not used there but "RSS" is, and there's nothing too enlightening (surprise?!)
Instead of VSZ, the kernel seems to use the term
VmSize
, which appears e.g. on/proc/$PID/status
.Some quotes of interest:
So we can guess a few more things:
VSZ - 虚拟集大小
RSS - 驻留集大小(类似于 RAM)
来源
VSZ - Virtual Set Size
RSS - Resident Set Size (kinda RAM)
Source
我想关于 RSS 与 VSZ 的问题已经说了很多了。从管理员/程序员/用户的角度来看,当我设计/编码应用程序时,我更关心 RSZ(驻留内存),因为当您不断提取越来越多的变量(堆积)时,您会看到该值不断上升。尝试一个简单的程序在循环中构建基于 malloc 的空间分配,并确保在该 malloc 空间中填充数据。 RSS 不断上升。
就VSZ而言,它更多的是Linux所做的虚拟内存映射,其核心功能之一源自传统操作系统概念。 VSZ的管理是通过内核的虚拟内存管理来完成的,有关VSZ的更多信息,请参阅Robert Love对mm_struct和vm_struct的描述,它们是内核中基本task_struct数据结构的一部分。
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.
总结@jmh优秀答案:
在#linux中,进程的内存包括:
由于分页,并非所有这些都始终完全存储在内存中,只有有用的、最近使用的部分(页面)。其他部分被调出(或换出)以为其他进程腾出空间。
下表取自 @jmh 的答案,显示了特定进程的常驻内存和虚拟内存的示例。
总结一下:常驻内存是当前物理内存中实际存在的内存,虚拟大小是加载所有组件所需的总物理内存。
当然,数字不会相加,因为库在多个进程之间共享,并且它们的内存是为每个进程单独计算的,即使它们只加载一次。
To summarize @jmh excellent answer :
In #linux, a process's memory comprises :
Due to paging, not all of those are always fully in memory, only the useful, most recently used parts (pages) are. Other parts are paged out (or swapped out) to make room for other processes.
The table below, taken from @jmh's answer, shows an example of what Resident and Virtual memory are for a specific process.
To summarize : resident memory is what is actually in physical memory right now, and virtual size is the total, necessary physical memory to load all components.
Of course, numbers don't add up, because libraries are shared between multiple processes and their memory is counted for each process separately, even if they are loaded only once.
它们不是受管理的,而是经过衡量的,并且可能受到限制(请参阅
getrlimit
系统调用,也在 getrlimit(2) 上) 。RSS 表示驻留集大小(位于 RAM 中的虚拟地址空间部分)。
您可以使用 虚拟地址空间 man7.org/linux/man-pages/man/proc.5.html" rel="nofollow noreferrer">proc(5) 与
cat /proc/1234/maps
及其状态(包括内存消耗)通过cat /proc/1234/status
They are not managed, but measured and possibly limited (see
getrlimit
system call, also on getrlimit(2)).RSS means resident set size (the part of your virtual address space sitting in RAM).
You can query the virtual address space of process 1234 using proc(5) with
cat /proc/1234/maps
and its status (including memory consumption) thrucat /proc/1234/status