最近有几个问题询问为什么 Ubuntu 似乎使用了比进程/服务所占的内存更多的内存 -这里和这里。
但是,我的情况正好相反。在我的服务器上,所有进程使用的内存似乎都高于使用的总内存。让我提供证据。
输出free -m
:
total used free shared buff/cache available
Mem: 64277 15014 34424 31 14837 48530
Swap: 8191 0 8191
输出arcstat
:
time read miss miss% dmis dm% pmis pm% mmis mm% size c avail
09:38:57 0 0 0 0 0 0 0 0 0 9.8G 9.8G 41G
输出ps aux | awk '{sum +=$6}END{print sum}'
:
6351512
所以这对我来说意味着:
free -m
报告总共使用了 15.0 GB 内存(共享内存可以忽略不计)。arcstat
从ZFS ARC 缓存报告的这个 9.8 GB 中减去。剩余的结果是大约 5.2 GB 的“真实”使用内存。但是(RSS - 驻留集大小)中第 6 列的ps aux
总和为 6.35 GB。这意味着报告的所有进程使用的内存比实际显示的高 1.15 GB free -m
。
我想知道是否有一种方法可以正确计算所有进程使用的内存,使其与使用的内存相匹配(减去 ZFS 缓存和共享 ramdisks 之后)?
因此,正如许多人可能知道的那样,
ps
由于共享内存页面,由(以及指标 RSS 本身)报告的内存统计信息并不完全准确。还有另一个名为 的工具
smem
,它可以正确报告每个进程的比例集大小——即每个进程的内存消耗,其中共享内存在进程之间以合理的方式划分。来自
man smem
:但是,有一些安装和配置的实用技巧
smem
可以轻松报告所有进程实际使用的内存。安装和配置
smem
首先,如果要安装
smem
,则需要启用 Universe 存储库。确保此行在/etc/apt/sources.list
(对于 Ubuntu 22.04)中未被注释:当您通常尝试安装时,它需要安装大量依赖项(超过 100 个包),因为它具有生成图形图表
smem
的推荐依赖项。python3-matplotlib
因为我不需要这个(而且任何有服务器的人可能也不需要它),所以可以只用这个命令安装基础包:
请注意后面的破折号
python3-matplotlib
- 这表示不应安装此软件包。另一种选择是使用:这具有相同的结果,只会安装
smem
包。最后一个技巧是修复列,这样您就可以正确使用
awk
,或者以您可以信任列的方式导出指标。为此,我们需要将command
列移动到最右边的位置,因为该command
字段可能包含我们无法控制的额外空间。要修复列布局和大小,
smem
应使用以下选项运行:此外,要包括所有进程,它必须作为
sudo
. 我已经为 定义了以下别名smem
:所以在下面,当我键入命令时
smem
,它实际上会使用上述选项运行命令。比较
smem
和ps
指标现在我们可以正确比较 和 的
ps aux
指标smem
。我原以为“实际”使用的内存为 5.2 GB,但ps aux
报告使用了 6.35 GB。以下是来自的结果smem
。RSS 计数来自
smem
:PSS 计数来自
smem
:现在很明显,报告的 RSS 大致相似(比 高一点
smem
)。但同样清楚的是,比例集大小 (PSS) 更正确地匹配进程间的预期内存使用量 - 5.2 GB。因此,为了正确测量总进程内存使用量,PSS 指标
smem
似乎给出了最有意义的结果。