我正在 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
进程134031
、134050
、151830
和的值的151812
总和似乎与 的报告内存使用情况(198.3M
)不相等agent.service
。
agent.service
我的问题是:为什么( ) 报告的内存使用量与其组成进程的198.3M
综合常驻内存 ( ) 使用量之间存在差异? systemd 对内存使用量的计算是否与单个进程的显示不同?RES
top
top
我将非常感激任何关于 systemd 如何计算和报告服务内存使用情况的见解或说明,与如何RES
在诸如 之类的工具中显示单个进程内存()进行比较top
。
谢谢你!
我想知道为什么 systemd 服务报告的内存使用情况与 top 中的内存使用总和不同?
答案1
分配给一个进程的页面包括该进程独有的页面和与其他进程共享的页面。
该服务的内存使用数量可能来源于 cgroup,它可能不会重复计算大多数共享页面,而将 top 中的 RSS 相加肯定会重复计算共享页面。
此外,一些共享页面将与 cgroup 之外的内容共享,这些页面可能会或可能不会计入 cgroup 总数。
最重要的是,您看到的任何数字都是时间快照,因为内存使用情况会随时间发生巨大变化,并且跨多个进程提取同步样本会产生大量开销,因此不会这样做。因此,会出现采样错误。
简而言之,这些地方的内存数字充其量只是一个估计值,实际的内存使用情况比单个数字(甚至是上面列出的 3-4 个数字)所能表达的要复杂得多。
内核公开的每个进程内存使用数字对于确定哪个进程使用的内存最多很有用,并且可能有助于估计所需内存和其他与性能相关的用途。但它对于计算系统中使用的总内存量没有用。这些数字可以在其他地方找到,而且也很复杂,有很多重叠。 wc -l /proc/meminfo
列出了我正在使用的当前内核中的 55 个条目。