/var/log/messages
perf로 프로세스와 cpu 분석해보기 본문
반응형
perf는 sar -f -P ALL의 %idle 필드보다 더 자세하게 cpu의 사용량을 확인할 수 있습니다.
1. CPU 코어의 중요성:
현대의 대부분의 시스템은 멀티코어 프로세서를 사용합니다. 각 코어는 독립적으로 연산을 수행할 수 있으므로, 소프트웨어는 병렬 처리를 통해 성능 향상을 꾀할 수 있습니다.
하지만, 모든 스레드나 프로세스가 고르게 코어를 사용하지 않는 경우 성능 저하의 원인이 될 수 있습니다.
2. perf와 CPU 코어:
코어별 분석 | perf를 사용하면 각 CPU 코어에서 어떤 이벤트가 발생하는지 모니터링할 수 있습니다. 예를 들면, 특정 코어에서의 CPU 캐시 미스, 분기 예측 실패 등의 이벤트를 측정할 수 있습니다. |
스레드/프로세스 추적 | perf로 특정 프로세스나 스레드가 어느 코어에서 실행되는지, 얼마나 많은 CPU 시간을 사용하는지 등의 정보를 얻을 수 있습니다. |
병목 지점 식별 | 모든 코어가 균일하게 사용되지 않는 경우, perf를 통해 해당 코어에서 발생하는 병목 지점을 식별할 수 있습니다. |
3. 사용 예시:
perf stat <명령어>를 입력해봐서 예시를 확인해보겠습니다.
0.75 msec task-clock #0.664 CPUs utilized | ls 명령이 실행되는 동안 CPU는 약 0.75 밀리초 동안 사용되었으며, 이는 약 66.4%를 사용하였음을 나타냅니다. |
0 context-switches # 0.000 /sec 0 cpu-migrations # 0.000 /sec |
ls 명령의 실행 동안 컨텍스트 스위치나 CPU 마이그레이션은 발생하지 않았습니다. |
86 page-faults # 118.167 K/sec | 페이지 폴트는 메모리 접근 중 발생하는 것으로, ls 명령이 실행되는 동안 86회의 페이지 폴트가 발생했습니다. 초당 평균 118.167K의 페이지 폴트 발생률을 가졌습니다. |
<not supported> cycles <not supported> instructions <not supported> branches <not supported> branch-misse |
일부 성능 카운터는 해당 시스템에서 지원되지 않거나, 모니터링하기 위한 권한이 없어서 값을 가져올 수 없습니다. 여기서는 cycles, instructions, branches, branch-misses에 해당하는 값들이 지원되지 않습니다. |
0.001277509 seconds time elapsed | ls 명령의 전체 실행 시간은 약 0.001277509초였습니다. |
0.001318000 seconds user 0.000000000 seconds sys |
사용자 시간은 약 0.001318초로, 이는 ls 명령이 사용자 모드에서 소비한 시간입니다. 시스템 시간은 0초로, ls 명령이 커널 모드에서 소비한 시간은 없습니다. |
4. ls의 사용률이 66%?
1. 시작 및 종료 오버헤드:
모든 프로세스나 명령어는 시작할 때와 종료할 때 일정한 양의 오버헤드를 가집니다. 프로세스를 스케줄링하거나 필요한 메모리나 리소스를 준비하고, 작업 완료 후 리소스를 해제하는 과정 등이 포함됩니다. 이러한 오버헤드는 작업의 전체 실행 시간과 관계없이 거의 일정합니다. 따라서 작업의 실제 실행 시간이 매우 짧을 경우, 이 오버헤드가 전체 CPU 사용 시간의 큰 부분을 차지하게 됩니다.
2. 상대적 측정:
CPU 사용률은 주어진 시간 동안의 CPU 활동을 측정하는 것입니다. 짧은 작업의 경우, 그 작업 동안 CPU가 바쁜 상태로 있었을 가능성이 높습니다. 예를 들어, 1 밀리초 동안의 작업이 CPU의 100%를 사용했다면, 그 작업이 1초 동안 실행되는 더 긴 작업과 비교했을 때 상대적으로 CPU 사용률이 높게 나올 것입니다.