시스템의 나머지 부분이 유휴 상태인지 여부에 관계없이 작업은 동일한 리소스 할당을 받아야 하며 그 이상은 할당받지 않아야 합니다. 목표는 시스템의 다른 부하에 관계없이 예측 가능한 시간 내에 작업을 완료하는 것입니다.
노력하다체계CPUAllocation
, 및 CPUQuota
를 간단한 단일 스레드 테스트 프로그램과 함께 사용 하면 더 적은 횟수로 실행할수록 시간이 더 오래 걸리는 것을 알 수 있습니다.
제한이 없으면 프로세스를 실행하는 데 15초가 걸립니다. CPU의 20%로 제한되었을 때 예상대로 5개의 인스턴스를 실행하는 데 각각 약 75초가 걸렸습니다 5*15=75
.
따라서 CPU의 20%로 제한되면 인스턴스 수(CPU당 최대 5개)에 관계없이 각 인스턴스를 실행하는 데 75초가 걸립니다.
그러나 점점 더 적은 수의 인스턴스를 실행하는 데(사용되지 않은 CPU 용량은 남겨두고) 예상 75초보다 오래 걸렸고, 단일 인스턴스를 실행하는 데(다른 시스템 로드 없이) 250초가 걸렸습니다.
이것은 말이 되지 않습니다. 단일 프로세스는 75초가 걸리며, 이는 5개의 프로세스를 실행하는 데 걸리는 시간과 같습니다.
사용되지 않은 CPU 용량을 "흡수"하기 위해 다른 프로세스를 실행하는 경우 75초 내에 완료되는 인스턴스 수가 줄어들 것으로 예상할 수 있습니다.
왜 이런 일이 발생합니까?
그리고
다른 시스템 로드에 관계없이 작업을 실행하는 데 비슷한 시간이 걸리도록 보장하여 원하는 효과를 달성하는 더 적절한 방법이 있습니까?
(체계실험 중에 사용되었지만 직접적으로 사용됨cgroup더 적절할 수도 있고 더 적절할 수도 있습니다).
테스트용 systemd 서비스 단위 파일
$ cat /etc/systemd/system/cputest\@.service
[Service]
User=nobody
SyslogIdentifier=cputest
ExecStart=/usr/local/bin/cputest.rb
CPUAffinity=1
CPUQuota=20%
테스트 절차가 의도적으로 비효율적입니다.파이의 알고리즘:
$ cat cat /usr/local/bin/cputest.rb
#!/usr/bin/ruby
PRECISION = 10 ** 8 # decimal places
PI_TARGET = (Math::PI * PRECISION).to_i
d = neg = 1
pi_test = pi = 0
START = Time.now.to_f
def elapsed() Time.now.to_f - START end
while pi_test != PI_TARGET do
pi += neg * (4.0/d)
pi_test = (pi * PRECISION).to_i
d+=2
neg*=-1
end
puts elapsed()
다음으로 실행
for i in {1..4}; do sudo systemctl start cputest@$i; done
산출물 수집
sudo journalctl -xft cputest
답변1
활용도가 낮은 CPU가 느려지는 것은 CPU에 적용된 절전 기술 때문인 것으로 보입니다. CPU가 최대치에 도달하면 허용터보차저그리고 더 빨리 달리세요. 20%로 제한되면 최대치에 도달하지 않으므로 실행 속도가 느려집니다.
저는 이 CPU를 탑재한 노트북에서 개발을 하고 있습니다. 서버를 찾아서 다시 테스트를 실행했는데 예상했던 결과를 얻었습니다.
"성능" 튜너를 사용하는 것 외에는 어떤 테스트도 하지 않았지만 별 차이가 없었습니다. 아직 BIOS 설정이나 이와 유사한 항목에 들어 가지 않았습니다. 이러한 동작은 전력을 절약하도록 설계된 시스템에서 프로세스의 CPU를 제한할 때 주의해야 할 사항이라고 생각합니다.