2012-01-11 5 views
5

C/C++로 프로그램을 작성하여 Linux에서 맨 위 명령처럼 작동 시키려고합니다. 몇 가지 조사를했으며 프로세스의 CPU 사용량을 계산하는 방법을 이미 알고 있습니다. 현재 시간과 몇 초 후에/proc/[PID]/stat에서 stime + utime을 계산하여 CPU 사용량을 얻을 수 있습니다. 그런 다음 stime + utime 차이를 계산하고 가동 시간 차이가있는 결과를 나누면 CPU 사용률이됩니다. 단일 프로세스/다중 스레드 프로세스에서 매우 쉽습니다.리눅스에서 다중 프로세스 응용 프로그램의 CPU 사용량을 계산하는 방법

문제는 다중 프로세스로 작동하는 httpd와 같은 경우입니다. 웹 서버가 바쁠 때, httpd는 자식 프로세스를 포크하여 요청들을 처리합니다. 그런 다음 총 프로세스 수를 계산해 봅니다. 500이라고 가정합니다. 프로세스의 CPU 사용량을 계산하려고하지만이를 요약하면 1 개의 CPU 사용량 만 표시됩니다. 하지만 내가 위에서 말한 것처럼 알고리즘을 수행하면 몇 초 후에 < 500으로 프로세스 수가 감소 할 때 계산이 이렇게 될 것이므로 음수 값을 얻습니다. (예를 들어, 임의의 숫자를 선택하면됩니다. 위의 예를 보면, STIME + UTIME의 델타 프로세스의 수부터 음의 값에서 결과가 감소됩니다

Uptime: 155123, No of processes : 500, Stime + Utime total of 500 processes : 3887481923874 
Uptime: 155545, No of processes : 390, Stime + Utime total of 390 processes : 2887123343874 

, 그리고 몇 밀리 초 후에 낮은 값을 제공 :) 당신에게 간단한 설명을 제공합니다. 난 단지 알고 싶어, 같은 다른 프로세스가 이런 식으로 행동을 계산할 수 있습니까? 고맙습니다.

+0

프로세스 집합을 어떻게 알 수 있습니까? 해당 프로세스 그룹에 의해? 프로그램 이름으로? –

+0

먼저, 주요 부모 프로세스를 얻습니다. 나는 그것이 ppid 1을 가지고 있고 그것의 pid 1227을 말하자. 그 다음 ppid 1227이있는/proc/디렉토리 전체를 찾는다./proc/pid1/stat에 ppid 1227이 있으면 그 utime과 stime을 다음에 추가한다. 1227 utime과 stime. –

답변

1

각 프로세스의 데이터를 별도로 보관하는 것이 좋습니다.
새 샘플을 만들 때 각 프로세스는 다음 세 범주 중 하나에 속할 수 있습니다.
1. 이전 및 이후 모두 존재 - 이전에서 새 값을 빼십시오.
2. 존재하지만 이전이 아닌 현재 존재합니다. 새 값을 가져옵니다.
3. 이전에는 없었지만 무시되었습니다. 샘플 기간의 90 % 동안 CPU를 사용했을 수 있으므로 여기에 뭔가 빠졌지 만 완벽한 정확성이 필요하지 않기를 바랍니다.

샘플간에 더 많은 데이터를 유지하고 더 복잡한 데이터 구조를 사용해야하지만 합리적인 결과가 있어야합니다.

+0

그래, 그게 문제를 해결할 것이라고 생각하지만 복잡한 작업이 필요해. 나는 충분히 오래 존재하는 TOP 200 PID를 유지하려고 노력할 것이고, 0이 생길 때까지 빼기를 계속하고 그것을 새로 온 사람과 교체 할 것입니다. 뺄셈은 컨테이너에 추가되며, 새 컨테이너와 섞일 것입니다. 나는 그걸 시도해야한다고 생각해. 고맙습니다. –

0

정확한 결과가 필요하거나 프로세스의 수명이 짧으면 프로세스가 종료 될 때 프로세스의 사용 시간을 읽어야합니다.

1) 프로세스 종료를 기다릴 wait4(2) 또는 wait3(2) 기능을 사용

이어야 두 가지 방법이있다. 이러한 함수는 프로세스의 utime 및 stime을 반환합니다.

2) /prox/<pid>/stat을 읽을 때까지 종료 된 프로세스를 좀비 상태로 유지하십시오.

관련 문제