我很难理解 报告的内存使用情况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
值不符。 的总和为。这是的双精度值。如果我将和相加,则得到。因此,现在和的总和大于 的总和。used
RES
15225.7
used
7881.9
used
buff/cache
18321.3
used
buff/cache
RES
更多发现:
- 注意到
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/cache
available
当我从输出中添加
free
字段used
、shared
和 时buff/cache
,我得到了19213
。这又超过了总和!然而,这是意料之中的,因为我们同意和RES
的输出从摘要的角度来看是匹配的。free
top
我期望
RES
(来自top
)的总和将等于/接近于used
、shared
和buff/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 !used
shared
buff/cache
free
13533
RES
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
都不匹配!top
free
RES
我看不懂这些数字!作为一名应用程序开发人员(或软件工程师),我不知道我编写的应用程序实际上占用了多少内存,如果遇到内存问题,我也无法调查!我完全搞不懂了。如果有人能解释一下发生了什么,我将不胜感激!
我查看了其他问题,但没有一个真正解决了这个问题。例如:为什么“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_mem
和smem
工具(您可以在系统上安装它们)可以提供更好的内存使用情况报告。它们为每个进程提供USS
和PSS
值。USS
是每个进程的唯一内存使用情况,不包括共享库。可以将其视为运行该进程所消耗的内存。这是您终止进程时释放的内存量。PSS
是USS
+ 共享库消耗在共享进程之间平均分配。
示例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_mem
和smem
时,的sudo
总和等于 的总和。PSS
smem
ps_mem
- 当您使用 运行
ps_mem
和smem
时,的sudo
总和等于 的总和。RSS
smem
RSS
top
- 当您
smem
不使用运行时sudo
,PSS
summation =used
fromtop
。使用sudo
可以获取其他用户(或特权进程)运行的更多进程。来自 的RSS
summationsmem
与 的 summation 不匹配top
。
提示:我仅针对当前用户ps_mem
安装了。但是,为了使用 运行它,我运行了以下命令:pip
--user
sudo
sudo PATH="${PATH}" PYTHONPATH="${HOME}/.local/lib/python3.10/site-packages" -s ps_mem