为什么 systemd 服务报告的内存使用情况与 top 中的内存使用量总和不同?

为什么 systemd 服务报告的内存使用情况与 top 中的内存使用量总和不同?

我正在 Linux 系统上运行一个名为的 systemd 服务agent.service,并且我注意到该服务报告的内存使用情况与命令中观察到的其组成进程的组合内存使用情况之间存在差异top

以下是相关输出systemctl status agent.service

● agent.service -  Agent
     Loaded: loaded (/etc/systemd/system/agent.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-04-10 16:01:44 +07; 15min ago
   Main PID: 151812 (agent)
      Tasks: 58 (limit: 18691)
     Memory: 198.3M (limit: 200.0M)
     CGroup: /system.slice/agent.service
             ├─151812 /root/agent --opampServer=false --nodeExporter=true
             ├─151822 /root/agent --opampServer=false --nodeExporter=true
             ├─151830 /proc/151822/fd/3
             └─151839 /proc/151822/fd/8 --config /tmp/otelcol/otelcol-config.yaml

此外,这里是命令的输出top,显示与特定进程相关的内存使用情况(RES 列)agent.service

PID    USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND  
134031 root      20   0 1491940 261288 260052 S   0.0   1.6   0:00.77 vcoagent
134050 root      20   0 1466668 146340 112240 S   0.0   0.9   0:06.04 8 
151830 root      20   0 1241644  17628  10732 S   0.0   0.1   0:01.18 3
151812 root      20   0 1639660   7964   6944 S   0.0   0.0   0:00.71 vcoagent

RES中的列表示top每个进程的常驻(非交换)内存使用情况。从top输出中可以看出,RES进程134031134050151830和的值的151812总和似乎与 的报告内存使用情况(198.3M)不相等agent.service

agent.service我的问题是:为什么( ) 报告的内存使用量与其组成进程的198.3M综合常驻内存 ( ) 使用量之间存在差异? systemd 对内存使用量的计算是否与单个进程的显示不同?REStoptop

我将非常感激任何关于 systemd 如何计算和报告服务内存使用情况的见解或说明,与如何RES在诸如 之类的工具中显示单个进程内存()进行比较top

谢谢你!

我想知道为什么 systemd 服务报告的内存使用情况与 top 中的内存使用总和不同?

答案1

分配给一个进程的页面包括该进程独有的页面和与其他进程共享的页面。

该服务的内存使用数量可能来源于 cgroup,它可能不会重复计算大多数共享页面,而将 top 中的 RSS 相加肯定会重复计算共享页面。

此外,一些共享页面将与 cgroup 之外的内容共享,这些页面可能会或可能不会计入 cgroup 总数。

最重要的是,您看到的任何数字都是时间快照,因为内存使用情况会随时间发生巨大变化,并且跨多个进程提取同步样本会产生大量开销,因此不会这样做。因此,会出现采样错误。

简而言之,这些地方的内存数字充其量只是一个估计值,实际的内存使用情况比单个数字(甚至是上面列出的 3-4 个数字)所能表达的要复杂得多。

内核公开的每个进程内存使用数字对于确定哪个进程使用的内存最多很有用,并且可能有助于估计所需内存和其他与性能相关的用途。但它对于计算系统中使用的总内存量没有用。这些数字可以在其他地方找到,而且也很复杂,有很多重叠。 wc -l /proc/meminfo列出了我正在使用的当前内核中的 55 个条目。

相关内容