ps 및 operf에 따른 CPU 사용량

ps 및 operf에 따른 CPU 사용량

사람들이 신뢰할 수 있다고 생각하는 두 소스의 겉보기에 상충되는 데이터가 있습니다. 아마도 출처 중 하나를 잘못 읽었을 것입니다.

서버 환경은 Ubuntu 14.04.2 LTS, 3.13.0-53-generic입니다.

한편으로는 CPU 사용량을 샘플링하여 Grafana가 렌더링한 InfluxDB에 넣는 Python 스크립트가 있습니다. 사용된 명령은 다음과 같습니다.

ps -eLo pid,lwp,pcpu | grep 2924  | awk {'print $2,$3'}
...
2924  2924  0.1
2924  2926  2.4
2924  2927  2.4
2924  2930  2.4
2924  2933  2.4
2924  2935  0.0
2924  3096  0.0
2924  3099  9.0
2924  3100  5.7

CPU 사용량은 45초마다 샘플링되지만 대부분의 경우 그래프는 예상대로 보고됩니다.

이 그래프에 따르면 Foo()생성 시 호출된 스레드는 위에서 언급한 모든 스레드 중에서 CPU 사용량이 가장 높습니다. 실제로 위 실제 출력의 TID 3099가 문제의 스레드입니다. 이러한 높은 사용량은 데이터 로드 등에 따라 하루 종일 계속될 수 있습니다.

반면에 OProfile 제품군이 있습니다. 나는 operf -gl어제 이 프로그램을 몇 시간 동안 실행했고 그 대가로 건강한 데이터 덩어리를 받았습니다. 렌더링을 사용할 때 opreport -gc다음 줄이 표시됩니다.

46423     0.2396  FooManager.cpp:625      foobinary.V0.28       Foo()

이것은 들여쓰기되지 않은 줄입니다 Foo(). 이에 대한 내 해석은 다음과 같습니다. Foo()항상 다른 스레드보다 CPU 사용량이 더 많습니다. 그러나 분석 결과, 캡처된 샘플 중 0.2396%만이 호출 스택의 기능을 보여주었습니다.

이것은 불가능해 보인다. 확실히 CPU 사용량이 가장 높은 스레드가 동료에 비해 프로필 샘플에서 가장 큰 비율을 차지하게 될까요?

관련 정보