각 프로세스의 CPU 시간을 제한하려는 경우 cgroups
작업을 수행하는 두 가지 매개변수인 cpu.cfs_period_us
및 를 전달할 수 있습니다 cpu.cfs_quota_us
.
- cpu.cfs_기간_us: 대역폭 결정에 사용되는 각 스케줄러 기간의 기간(마이크로초)입니다. 기본값은 100000us 또는 100ms입니다. 기간이 길면 처리량이 향상되지만 스케줄러가 CPU 집약적인 워크로드를 더 오랫동안 유지할 수 있으므로 대기 시간이 늘어납니다. 더 짧은 기간의 경우에는 그 반대입니다. 이는 CFS 스케줄러에 의해 예약된 비RT 작업에만 영향을 미칩니다.
- cpu.cfs_quota_us: 현재 그룹의 각 cfs_기간_us 기간 동안 실행이 허용되는 최대 시간(마이크로초)입니다. 예를 들어, CPU_기간_us를 절반으로 설정하면 cgroup은 해당 시간의 50%만 최대 작업을 수행할 수 있습니다. 이는 시스템에 있는 모든 CPU의 총 시간을 나타냅니다. 따라서 예를 들어 두 CPU를 완전히 활용하려면 이 값을 cfs_period_us 값의 두 배로 설정해야 합니다.
프로세스를 CPU 코어 1개로 제한하고 싶다고 가정해 보겠습니다. 이는 다음을 통해 수행할 수 있습니다.
cpu.cfs_quota_us 1.000.000
cpu.cfs_period_us 1.000.000
그리고
cpu.cfs_quota_us 100.000
cpu.cfs_period_us 100.000
그리고
cpu.cfs_quota_us 10.000
cpu.cfs_period_us 10.000
이 세 가지 옵션의 차이점은 무엇입니까? Firefox 프로세스가 있다고 가정해 보겠습니다. cpu.cfs_period_us
더 길거나 더 짧은 것은 무엇이며, 그 이유는 무엇입니까?
답변1
인용문에서 알 수 있듯이 숫자가 낮을수록 대기 시간이 짧아집니다. 프로세스는 예약되기까지 오래 기다릴 필요가 없습니다. 각 프로세스는 곧 차례를 갖게 됩니다. 그러나 일정을 변경하면 비용이 더 많이 듭니다. 시간이 다 되어 다른 프로세스를 실행할 준비가 될 때마다 일정이 변경됩니다.
일정 변경에는 스택의 모든 레지스터 저장, 스택 포인터를 작업 제어 블록에 저장, 작업 제어 블록 전환, 가상 페이지 테이블의 일부 비활성화/활성화, 스택 포인터 다시 로드 및 레지스터 복원이 포함됩니다. 또한 더 많은 캐시 누락이 발생할 수도 있습니다. 즉, 상황이 더 느리게 진행됩니다.
장기 실행 비대화형 작업의 경우 스케줄러 기간이 길수록 좋습니다. 배치 스케줄러는 표준 대화형 스케줄러보다 예약 기간이 길고 우선 순위가 낮습니다.