进程内存未添加到顶部

进程内存未添加到顶部

我很难理解 报告的内存使用情况top。内存摘要部分列出了以下内容。 所有数字都在 中MiB

MiB Mem :  31884.1 total,  13562.7 free,   7881.9 used,  10439.4 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.  22665.9 avail Mem

但是,当我将列值相加时,它们的总和与摘要中报告的RES值不符。 的总和为。这是的双精度值。如果我将和相加,则得到。因此,现在和的总和大于 的总和。usedRES15225.7used7881.9usedbuff/cache18321.3usedbuff/cacheRES

更多发现:

  • 注意到top内存摘要几乎与 的摘要相匹配free。以下是free -m输出。
               total        used        free      shared  buff/cache   available
Mem:           31884        7881       13555         886       10446       22658
Swap:           2047           0        2047

如您所见,、、used以及都free具有几乎相同的值。buff/cacheavailable

  • 当我从输出中添加free字段usedshared和 时buff/cache,我得到了19213。这又超过了总和!然而,这是意料之中的,因为我们同意和RES的输出从摘要的角度来看是匹配的。freetop

  • 我期望RES(来自top)的总和将等于/接近于usedsharedbuff/cache(来自free)的总和,因为top文档列出了每个进程的内存包括私有部分和共享部分。

象限图解记忆类型

      RES  - anything occupying physical memory which, beginning with
            Linux-4.5, is the sum of the following three fields:
            RSan - quadrant 1 pages, which include any
                   former quadrant 3 pages if modified
            RSfd - quadrant 3 and quadrant 4 pages
            RSsh - quadrant 2 pages
  • 每当我清除系统缓存时,RES总和总是大于预期总和。这是我清除系统缓存的方法:sudo sync && sudo sysctl -w vm.drop_caches=1。有趣的是,RES总和增加到了18175.2!以下是top清除缓存后的内存摘要。您可以注意到buff/cache,正如预期的那样,显着减少。但是,我没想到字段会显着增加!输出中的、和的总和为。这比used总和少了大约 5 GiB !usedsharedbuff/cachefree13533RES
MiB Mem :  31884.1 total,  19358.2 free,   8795.6 used,   3730.2 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.  21626.5 avail Mem
  • 已尝试,但值与、或 的总和smem都不匹配!topfreeRES

我看不懂这些数字!作为一名应用程序开发人员(或软件工程师),我不知道我编写的应用程序实际上占用了多少内存,如果遇到内存问题,我也无法调查!我完全搞不懂了。如果有人能解释一下发生了什么,我将不胜感激!

我查看了其他问题,但没有一个真正解决了这个问题。例如:为什么“top”中的内存使用量没有累加?这个幸运的是他们的数字检查结果正确......而且更多,但仍然没有找到明确的答案!

我也看了这个:为什么 top 命令中的总 RES 与已用内存不匹配?[重复]这个也没有(正确确定 Linux 中的内存使用情况) 回答问题。

答案1

有很多非常好的帖子解释了这些差异:

我没有必要在这些帖子中重复答案,所以我只标记要点:

请记住,“活动”内存和“已消耗”内存之间存在区别。Linux 倾向于将大量数据存储在内存中,以备将来需要。但进程可能不会主动使用这些内存 - 在这种情况下,它们会报告较低的“已使用”内存量。

如果某个进程突然需要更多内存,那么内核就会释放一些缓存数据,并允许该进程使用它。

因此从技术上来说,内存同时处于“已使用”和“空闲”状态。

我还喜欢使用 htop 而不是 top,因为它可以显示这些差异。

还建议使用 ps_mem

准确报告程序核心内存使用情况的实用程序。

答案2

并非真正解决来自不同实用程序的令人困惑/冲突的值,但您可以从中获取任何给定进程的实际内存使用情况/proc/"PID of process"/status。您可能还想研究瓦尔格林德监视应用程序在运行时的内存管理。

答案3

我找到了我认为是该问题的答案,因此我将其发布在这里。

RSS进程总和不相等的used原因是top因为它top表示进程的内存使用情况。

您会看到,RSS是应用程序运行时使用的内存。通常,应用程序依赖于共享库(至少执行基本操作),操作系统会将这些共享库加载到内存中一次,并让所有需要它们的应用程序都可以访问它们。top应用程序内存消耗的因素包括:应用程序消耗的内存 + 它所需的共享库。因此,top由于共享库的存在,内存使用量会重复计算。而 是usage应用程序消耗的内存总和,其中只计算了一次共享库消耗。因此,RSS总和将始终大于或等于used字段。

ps_memsmem工具(您可以在系统上安装它们)可以提供更好的内存使用情况报告。它们为每个进程提供USSPSS值。USS是每个进程的唯一内存使用情况,不包括共享库。可以将其视为运行该进程所消耗的内存。这是您终止进程时释放的内存量。PSSUSS+ 共享库消耗在共享进程之间平均分配。

示例ps_mem输出:

 Private  +   Shared  =  RAM used       Program
...
331.6 MiB +  20.2 MiB = 351.9 MiB       /opt/google/chrome/chrome
363.1 MiB +  21.3 MiB = 384.5 MiB       /snap/code/158/usr/share/code/code --no-sandbox --force-user-env
388.4 MiB + 933.5 KiB = 389.4 MiB       /usr/sbin/mysqld
---------------------------------
                          6.5 GiB
=================================

示例smem输出:

  PID User                      Command                                                                                                                                              Swap     USS     PSS     RSS
...
 6840 ahmad.elkomey             /opt/google/chrome/chrome                                                                                                                               0  332.5M  352.6M  482.4M
 7223 ahmad.elkomey             /snap/code/158/usr/share/code/code --no-sandbox --force-user-env                                                                                        0  363.1M  384.3M  460.0M
 1952 mysql                     /usr/sbin/mysqld                                                                                                                                        0  388.4M  389.3M  398.3M
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  236 17                                                                                                                                                                                0    5.5G    6.5G   12.1G

一般观察:

  • 当使用 运行ps_memsmem时,的sudo总和等于 的总和。PSSsmemps_mem
  • 当您使用 运行ps_memsmem时,的sudo总和等于 的总和。RSSsmemRSStop
  • 当您smem不使用运行时sudoPSSsummation = usedfrom top。使用sudo可以获取其他用户(或特权进程)运行的更多进程。来自 的RSSsummationsmem与 的 summation 不匹配top

提示:我仅针对当前用户ps_mem安装了。但是,为了使用 运行它,我运行了以下命令:pip--usersudo

sudo PATH="${PATH}" PYTHONPATH="${HOME}/.local/lib/python3.10/site-packages" -s ps_mem

相关内容