해결책을 찾으려고 노력했지만 내가 찾은 것은 작업 세트 또는 sched_setaffinity를 사용하여 프로세스를 CPU에 고정하는 방법뿐이었습니다. 그러나 이는 프로세스에 CPU에 대한 독점 액세스를 부여하지 않는 것으로 보입니다. 즉, 스케줄러가 해당 CPU에 다른 프로세스를 할당할 수 있습니다. CPU가 프로세스 전용인지 확인하는 방법이나 명령이 있습니까? 작업 세트를 사용하면 특정 프로세스가 특정 CPU에서만 실행되도록 할 수 있지만, 그 반대 방향으로도 실행되기를 원합니다. 즉, CPU가 프로세스에 바인딩되어 있습니다. 비슷한 질문을 찾았습니다특정 양의 CPU 성능을 프로세스에 할당하는 방법은 무엇입니까?그리고Linux에서 하나의 CPU 코어만 사용하도록 프로세스를 제한하는 방법은 무엇입니까?하지만 중복으로 표시되어 있어요Linux에서 프로세스의 프로세서 선호도를 설정하는 방법은 무엇입니까?이것은 내가 원하는 것이 아닙니다.
답변1
전체 스케줄링에서 CPU를 제외해야 하며 다음을 통해 CPU에 프로세스를 할당할 수 있습니다.
taskset
당신이 이미 발견했듯이. CPU를 제외하려면 시작 매개변수를 추가하세요.
isolcpus=N
숫자(N)는 0부터 시작합니다.
답변2
systemd를 실행하는 시스템에서는 systemd 구성에서 구성할 수도 있습니다. 시스템에 4개의 코어가 있다고 가정하면
[Manager]
CPUAffinity=0-2
/etc/systemd/system.conf
systemd(PID 1)가 처음 3개의 CPU에서 실행되도록 합니다 . 기본적으로 systemd에 의해 직접 또는 간접적으로 시작된 프로세스(모든 프로세스에 해당)는 이 설정을 상속하므로 4번째 CPU(3번)를 사용하지 않습니다. 그냥 추가하세요
[Service]
CPUAffinity=3
네 번째 코어에서 실행하려는 서비스의 단위 파일에 추가합니다. 이 접근 방식의 한 가지 장점은 LimitMEMLOCK
같은 장소에서 다른 실시간 관련 설정을 조정할 수 있다는 것입니다. LimitRTPRIO
여러 가지 도구를 사용할 필요가 없습니다.
참고: 첫 번째 변경 사항을 적용하려면 systemd에 대해 시스템을 재부팅해야 합니다. 서비스 구성만 수정한 경우 영향을 받는 서비스를 다시 시작하는 것으로 충분합니다.
systemctl daemon-reload
systemctl restart my-service.service