CPU 统计不适用于分配给独立核心的服务

CPU 统计不适用于分配给独立核心的服务

我正在对某些服务设置 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。我打算尝试一下,但听起来cpusets 使调度程序在隔离核心上启用,这是我不希望的,因为我的目标是为隔离核心提供类似实时的设置,并尽可能减少中断。

答案1

我最终通过反复试验弄清楚了为什么这行不通。

事实证明,问题的真正原因是隔离的服务使用了实时fifo调度程序,并且使用该调度程序对服务启用 systemd CPU 统计似乎是不可能的。更具体地说,它看起来已启用,但只是不起作用,而实际上该服务现在处于不良状态。如果您尝试重新启动它,您会遇到错误,特别是中描述的错误这篇红帽文章。

相关内容