Ubuntu Linux 16.10 시스템 모니터의 CPU 사용률 측정이 "pcpu"와 대략적으로 일치하기를 원합니다 ps
. 이는 4개의 코어가 있는 Lenovo Thinkstation 데스크탑에서 실행되는 단일 Firefox 브라우저 프로세스의 CPU 사용률입니다.
Ubuntu Linux 16.10 시스템 모니터 기본 설정은 현재 다음과 같이 설정되어 있습니다.
Update interval in seconds: 3.00
Enable smooth refresh: Yes
Alert before ending or killing processes Yes
Divide CPU usage by CPU count : Yes
Firefox 프로세스의 ps 출력은 다음과 같습니다.
$ ps -eo pid,rss,c,pcpu,cputime,cmd | grep firefox
2848 726024 3 3.5 00:50:23 /usr/lib/firefox/firefox -new-window
읽고 나서Linux: 프로세스의 마지막 순간의 CPU 사용량 보기, CPU 사용량의 마지막 순간을 보는 방법을 배웠습니다. Firefox 프로세스의 최고 출력은 다음과 같습니다.
$ top -b -d 1 | grep -in "firefox"
8: 2848 ratio 20 0 1980240 641516 115240 S 18.8 15.9 73:10.86 firefox
Firefox 브라우저 애플리케이션의 경우 pcpu가 3.5%인 ps -eo pid,rss,c,pcpu,cputime,cmd
반면, 동일한 Firefox 브라우저 애플리케이션의 경우 GUI 애플리케이션 Ubuntu System Monitor는 CPU 사용률을 5%로 표시합니다. 또한 Firefox의 top -b -d 1 | 우리 CPU가 사용하는 4개의 코어를 4로 나누면 최고 출력의 4.0%를 얻습니다.
ps
최고 출력과 시스템 모니터 값을 어떻게 일관되게 만들 수 있나요 ? "CPU 사용량을 CPU 수로 나누기" 확인란을 활성화해야 합니까?
답변1
빠른 답변: 아니요, 실제로는 불가능합니다.
여기서 문제는 우선 CPU "백분율"이라는 개념입니다. 엄밀히 말하면 이것은 실제로 아무 의미가 없습니다. CPU에는 작업 중(100%) 또는 대기 중이라는 두 가지 상태만 있습니다.
따라서 프로세스의 CPU 사용량이 50%로 보고된다고 해서 CPU의 50%만 사용되었다는 의미는 아닙니다. 이는 특정 기간 동안 CPU가 프로세스에 전체 시간의 50%를 소비한다는 의미입니다. 예를 들어 새로 고침 간격이 1초로 설정되고 CPU가 프로세스 N에서 0.5초 동안 작업하는 경우 프로세스 N의 CPU%는 50%로 표시됩니다.
이를 염두에 두고 CPU%를 확인하는 다양한 방법을 살펴볼 수 있습니다. 의 경우 ps
(에서)로 측정됩니다 man ps
.
CPU usage is currently expressed as the percentage of time spent
running during the entire lifetime of a process. This is not ideal,
and it does not conform to the standards that ps otherwise conforms to.
CPU usage is unlikely to add up to exactly 100%.
따라서 보고된 백분율은 ps
실제로 프로세스의 전체 수명에 대한 평균입니다. 대조적으로, top
보고서는 다음과 같이 기술했습니다.
The task's share of the elapsed CPU time since the last screen
update, expressed as a percentage of total CPU time.
비슷하게 작동한다고 가정합니다 gnome-system-monitor
. CPU %는 마지막 새로 고침 이후 CPU가 특정 프로세스에 소비한 시간의 백분율이기도 합니다. 내 C++ 지식은 기본적으로 존재하지 않지만 다음 줄은proctable.cpp
( gnome-system-monitor
소스 코드의 일부)는 마지막 새로 고침 이후 평균을 취함을 보여줍니다.
/* FIXME: total cpu time elapsed should be calculated on an individual basis here
** should probably have a total_time_last gint in the ProcInfo structure */
glibtop_get_cpu (&cpu);
app->cpu_total_time = MAX(cpu.total - app->cpu_total_time_last, 1);
app->cpu_total_time_last = cpu.total;
아니요, CPU가 프로세스에 소비한 시간의 비율을 표시하므로 동의 ps
할 수 없습니다.gnome-system-monitor
ps
그 과정이 시작된 이후로gnome-system-monitor
백분율을 표시 하고마지막 새로고침 이후.
또한 두 값이 일치해야 하는 이유도 상상할 수 없습니다. 내 생각에 우리는 어떤 종류의XY 문제. 궁극적인 목표가 무엇인지, 두 가치를 일치시켜 해결하려는 문제를 설명하는 새로운 질문을 하고 싶을 수도 있습니다.