是什么原因导致 systemctl 显示或隐藏服务的内存或 CPU 使用情况?

是什么原因导致 systemctl 显示或隐藏服务的内存或 CPU 使用情况?

今天早上:

# systemctl status udev
? systemd-udevd.service - udev Kernel Device Manager
   Loaded: loaded (/lib/systemd/system/systemd-udevd.service; static; vendor preset: enabled)
   Active: active (running) since Sat 2021-03-13 12:08:58 CET; 5 days ago
     Docs: man:systemd-udevd.service(8)
           man:udev(7)
 Main PID: 451 (systemd-udevd)
   Status: "Processing..."
    Tasks: 1
   Memory: 4.5M
      CPU: 6.038s
   CGroup: /system.slice/systemd-udevd.service
           └─451 /lib/systemd/systemd-udevd

刚才(同一系统 - 带有 Ubuntu16LTS 的 VM):

# systemctl status udev
? systemd-udevd.service - udev Kernel Device Manager
   Loaded: loaded (/lib/systemd/system/systemd-udevd.service; static; vendor preset: enabled)
   Active: active (running) since Sat 2021-03-13 12:08:58 CET; 5 days ago
     Docs: man:systemd-udevd.service(8)
           man:udev(7)
 Main PID: 451 (systemd-udevd)
   Status: "Processing..."
   CGroup: /system.slice/systemd-udevd.service
           └─451 /lib/systemd/systemd-udevd

请注意省略了Tasks:Memory:CPU:行。
这里有什么变化?(我并没有故意改变任何东西……)

编辑:ps输出看起来不引人注目:

# ps l 451
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0   451     1  20   0  45672  4732 ep_pol Ss   ?          0:01 /lib/systemd/systemd-udevd

我认为这与此无关,udev而是systemd因为我也可以在其他服务中看到同样的效果(缺少 CPU 等)。

编辑#2:systemctl --version报告 229。

# systemctl show udev | grep Accounting
CPUAccounting=no
BlockIOAccounting=no
MemoryAccounting=no
TasksAccounting=no

# cgmanager
The program 'cgmanager' is currently not installed.

输出摘录findmnt

/sys/fs/cgroup
├─/sys/fs/cgroup/systemd
├─/sys/fs/cgroup/memory
├─/sys/fs/cgroup/blkio
├─/sys/fs/cgroup/cpu,cpuacct
├─/sys/fs/cgroup/pids
├─/sys/fs/cgroup/net_cls,net_prio
├─/sys/fs/cgroup/freezer
├─/sys/fs/cgroup/devices
├─/sys/fs/cgroup/cpuset
├─/sys/fs/cgroup/hugetlb
└─/sys/fs/cgroup/perf_event

编辑#3:重新启动相关虚拟机后,我再次获得了测量结果,但会计功能仍然处于禁用状态:

# systemctl show udev | grep Accounting
CPUAccounting=no
BlockIOAccounting=no
MemoryAccounting=no
TasksAccounting=no

# systemctl status udev
...
 Main PID: 444 (systemd-udevd)
   Status: "Processing..."
    Tasks: 1
   Memory: 18.9M
      CPU: 4.211s
   CGroup: /system.slice/systemd-udevd.service
           └─444 /lib/systemd/systemd-udevd

因此,这些值看起来不像是由会计设置生成的。
甚至全局默认值也是关闭的:

# systemctl show | grep Accounting
DefaultCPUAccounting=no
DefaultBlockIOAccounting=no
DefaultMemoryAccounting=no
DefaultTasksAccounting=no

答案1

内存使用情况通过选项报告MemoryAccounting=,该选项从 v238 开始默认启用(除非发行版另有选择),当然也可以由需要设置内存限制的单个单元启用。此选项使用“内存”cgroup 控制器,似乎适用于 v1 和 v2 层次结构。

如果使用“统一”(仅限 v2)cgroup 层次结构,则从内核 v4.15 及更高版本上的 v240 开始,默认会报告 CPU 使用率。在旧版本中,可以使用CPUAccounting=每个单元启用它,但影响更大,因为在 4.15 之前,“CPU”cgroup 控制器是获取此信息所必需的。

TasksAccounting=使用“pids”cgroup 控制器的选项也会报告任务数量。

所有三个功能都可以全局启用(在 systemd/system.conf 中)或按单元启用。它们也可以针对正在运行的服务动态更改。当然,如果其他进程(例如 cgmanager)干扰 cgroup 控制器分配,或者这些控制器突然从 /sys 中消失(检查findmnt),或者 pid1 被 LSM 拒绝访问它们(坏主意),它们将停止工作。

相关内容