일부 서비스에서 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
격리된 코어에서 스케줄러를 활성화하는 것처럼 들리는데, 내 목표는 중단을 최소화하면서 격리된 코어에 대해 실시간과 같은 설정을 갖는 것이기 때문에 원하지 않습니다. 가능한.
답변1
결국 시행착오를 통해 이것이 작동하지 않는 이유를 알아냈습니다.
문제의 실제 원인은 격리된 서비스가 실시간 fifo
스케줄러를 사용하고 있으며, 해당 스케줄러를 사용하여 서비스에 대해 systemd CPU 통계를 활성화하는 것이 불가능해 보입니다. 보다 구체적으로 말하면 활성화된 것처럼 보이지만 실제로는 서비스가 잘못된 상태에 있는데도 작동하지 않습니다. 다시 시작하려고 하면 오류, 특히 다음에 설명된 오류가 발생합니다.이 Red Hat 기사.