我正在对某些服务设置 CPU 统计,并注意到其中一些服务没有正确报告 CPU 使用情况。似乎未报告任何使用情况的服务是通过分配CPUAffinity
仅在我使用内核参数在内核级别隔离的核心上运行的服务isolcpus
。
以下是此类服务状态的示例片段:
Drop-In: /etc/systemd/system.control/gnss.service.d
└─50-CPUAccounting.conf, 50-MemoryAccounting.conf
Active: active (running) since Fri 2023-12-15 22:31:10 UTC; 2 days ago
Main PID: 1233 (quectel_lg69t_g)
Tasks: 4 (limit: 8479)
Memory: 3.7M
CPU: 0
CGroup: /system.slice/gnss.service
而同一系统中的另一个服务正在正确报告使用情况:
Drop-In: /etc/systemd/system.control/cameras.service.d
└─50-CPUAccounting.conf, 50-MemoryAccounting.conf
Active: active (running) since Mon 2023-12-18 17:29:43 UTC; 1s ago
Main PID: 3253648 (cameras)
Tasks: 1 (limit: 8479)
Memory: 3.7M
CPU: 27ms
CGroup: /system.slice/cameras.service
我可以在 中看到使用 CPU 的服务htop
,因此我确信它不仅仅是空闲/冻结,而且实际上没有使用任何 CPU。
我认为这一定是由于核心隔离的副作用,但我不知道从哪里开始。也许 systemd 需要在独立核心上运行一些东西,以便跟踪分配到那里的任务的 CPU 时间使用情况?
在研究这个问题时,我还发现它isolcpus
可能已被弃用,我应该改用它cpuset
。我打算尝试一下,但听起来cpuset
s 使调度程序在隔离核心上启用,这是我不希望的,因为我的目标是为隔离核心提供类似实时的设置,并尽可能减少中断。
答案1
我最终通过反复试验弄清楚了为什么这行不通。
事实证明,问题的真正原因是隔离的服务使用了实时fifo
调度程序,并且使用该调度程序对服务启用 systemd CPU 统计似乎是不可能的。更具体地说,它看起来已启用,但只是不起作用,而实际上该服务现在处于不良状态。如果您尝试重新启动它,您会遇到错误,特别是中描述的错误这篇红帽文章。