프로세스가 CPU를 사용하는 데 시간이 걸리나요?

프로세스가 CPU를 사용하는 데 시간이 걸리나요?

나는 burnP6(cpuburn 패키지에서) 1초 동안 실행한 다음 프로그램을 종료하는 단일 코어 x86 시스템을 가지고 있습니다.

while true; do /usr/bin/burnP6 & sleep 1; pkill burnP6; sleep 1; done

CPU 사용률을 확인하는 데 사용하는 경우 top -d 1프로세스 로드는 burnP6일반적으로 50% 미만입니다. 이 명령을 실행하면 while true; do ps -e -o cmd,pcpu | grep burnP6; doneCPU 로드는 다음과 같은 특성을 갖습니다.

/usr/bin/burnP6              0.0
/usr/bin/burnP6              9.0
/usr/bin/burnP6             10.0
/usr/bin/burnP6             10.0
/usr/bin/burnP6             11.0
/usr/bin/burnP6             11.0
/usr/bin/burnP6             12.0
/usr/bin/burnP6             12.0
/usr/bin/burnP6             13.0
/usr/bin/burnP6             14.0
/usr/bin/burnP6             15.0
/usr/bin/burnP6             15.0
/usr/bin/burnP6             16.0
/usr/bin/burnP6             16.0
/usr/bin/burnP6             17.0
/usr/bin/burnP6             18.0
/usr/bin/burnP6             18.0
/usr/bin/burnP6             19.0
/usr/bin/burnP6             20.0
/usr/bin/burnP6             20.0
/usr/bin/burnP6             21.0
/usr/bin/burnP6             22.0
/usr/bin/burnP6             22.0
/usr/bin/burnP6             23.0
/usr/bin/burnP6             24.0
/usr/bin/burnP6             24.0
/usr/bin/burnP6             25.0
/usr/bin/burnP6             25.0
/usr/bin/burnP6             26.0
/usr/bin/burnP6             27.0
/usr/bin/burnP6             28.0
/usr/bin/burnP6             28.0
/usr/bin/burnP6             28.0
/usr/bin/burnP6             30.0
/usr/bin/burnP6             30.0
/usr/bin/burnP6             31.0
/usr/bin/burnP6             31.0
/usr/bin/burnP6             32.0
/usr/bin/burnP6             32.0
/usr/bin/burnP6             33.0
/usr/bin/burnP6             33.0
/usr/bin/burnP6             35.0
/usr/bin/burnP6             35.0
/usr/bin/burnP6             36.0
/usr/bin/burnP6             36.0
/usr/bin/burnP6             37.0
/usr/bin/burnP6             38.0
/usr/bin/burnP6             38.0
/usr/bin/burnP6             39.0
/usr/bin/burnP6             40.0
/usr/bin/burnP6             40.0
/usr/bin/burnP6             41.0
/usr/bin/burnP6             42.0
/usr/bin/burnP6             42.0
/usr/bin/burnP6             43.0
/usr/bin/burnP6             44.0
/usr/bin/burnP6             44.0
/usr/bin/burnP6             45.0
/usr/bin/burnP6             45.0
/usr/bin/burnP6             46.0
/usr/bin/burnP6             46.0
/usr/bin/burnP6             47.0
/usr/bin/burnP6             48.0
/usr/bin/burnP6             48.0
/usr/bin/burnP6             49.0
/usr/bin/burnP6             50.0
/usr/bin/burnP6             50.0
/usr/bin/burnP6             51.0
/usr/bin/burnP6             52.0
/usr/bin/burnP6             52.0
/usr/bin/burnP6             53.0
/usr/bin/burnP6              0.0

위에 표시된 대로 부하가 0%에서 53%로 빠르게 증가하지만 프로세스가 burnP6종료됩니다. 즉, 99% - 100% 활용도에 도달하기에는 너무 짧은 시간 동안 실행됩니다. 이러한 결과는 측정 방법에 따른 것입니까? 실제로 burnP6프로세스는 첫 번째 마이크로초부터 CPU를 100% 사용합니까? :) 아니면 프로세스가 CPU 시간을 모두 가져오는 데 실제로 1~2초가 걸리나요?

답변1

CPU 로드를 표시하는 데 사용하는 명령은 긴밀한 루프에서 실행되므로 CPUburn과 경쟁합니다. 경합 없이 CPUburn의 CPU 부하를 관찰하려면 sleep 1루프에 다음과 같은 것을 추가하십시오.

테스트에서 처음에는 관찰자 루프가 거의 모든 CPU를 차지한 다음 점차적으로 burnP6CPU 점유율을 점점 더 많이 차지합니다. 이는 Linux 스케줄링 정책의 결과입니다. Linux 커널에는 복잡한 스케줄러가 있습니다. 실제로 많은 스케줄링 알고리즘이 있으며 런타임에 어떤 스케줄링 알고리즘이 사용되는지 구성할 수 있습니다. 읽다sched(7) 매뉴얼 페이지더 자세한 내용을 알아보려면 커널 문서와 참고 서적을 참조하세요.

나보다 지식이 풍부한 사람은 이 출력을 사용하여 시스템에서 어떤 스케줄러가 활성화되어 있는지 확인할 수 있습니다. 나는 할 수 없다. ps | grepCPU를 많이 사용하는 I/O 프로그램(실행 파일 로드, 프로세스 생성 및 데이터 전달 외에는 아무것도 수행하지 않는 루프)의 우선 순위를 지정하는 것을 볼 수 있습니다 . 이는 많은 상황에서 의미가 있습니다. CPU 집약적인 프로그램은 계산에 1초 대신 1.1초를 소비하는 것을 꺼리지 않을 수 있지만, I/O 집약적인 프로그램은 일반적으로 빠른 응답 시간(낮은 대기 시간)이 필요한 사용자 인터페이스 스레드 또는 네트워크 서비스입니다. ) 감사합니다. 분명히 모든 CPU를 차지하는 프로세스 그룹에서 균형을 맞추는 일종의 공정성 조치가 있습니다.

설정을 시험해 보고 동작이 어떻게 바뀌는지 확인하면 /proc/sys/kernel/sched*도움이 될 것입니다 .

관련 정보