통계수집

통계수집

저는 CPU 코어에서 실행되는 스레드가 있는 간단한 프로그램을 작성했습니다. 약간 공격적으로 회전하며 CPU 코어를 100% 사용합니다. top+ 로 이것을 볼 수 있습니다 1.

N분 후에 다음 사항을 알고 싶습니다.

커널은 실행 중인 스레드를 몇 번이나 선점(중단)합니까?

답변1

이것이 Linux 이벤트 후크의 용도이며 다음과 결합할 수 있습니다.perf

통계수집

간단한 것부터 시작하겠습니다.

sudo perf state -e sched:sched_switch yourprogram 

이 시도:

busyloop.c

#include <stdint.h>
int main()
{
    for (volatile uint_fast64_t i = 0; i < (1ULL<<34); ++i) {
    }
}

엮다:

gcc -O3 -o busyloop busyloop.c

달리기:

$ sudo perf stat -e sched:sched_switch ./busyloop

 Performance counter stats for './busyloop':

               134      sched:sched_switch

      26.534402995 seconds time elapsed

      26.496337000 seconds user
       0.000996000 seconds sys

그것이 당신의 대답입니다. 그때 일정이 바뀌어요. 여기에는 프로세스가 중단되지 않고 커널 자체에 들어가는 것이 포함됩니다.

sched_switch시스템 호출 입력 횟수와 둘 다를 지정할 때 얻는 숫자를 뺍니다.

$ sudo perf stat -e sched:sched_switch,raw_syscalls:sys_enter ./busyloop

 Performance counter stats for './busyloop':

               765      sched:sched_switch
                30      raw_syscalls:sys_enter

      26.528107216 seconds time elapsed

      26.473054000 seconds user
       0.002994000 seconds sys

로드가 많은 이 예제 실행에는 765개의 컨텍스트 스위치가 있었지만 그 중 30개만이 시스템 호출을 수행하는 프로세스 자체로 인해 발생했습니다.

실시간 통계

perf stat동일한 명령줄 옵션을 사용하여 실시간으로 수행할 수 있는 작업을 확인하는 것도 종종 가능합니다.perf top

./busyloop &
sudo perf top -e sched:sched_switch,raw_syscalls:sys_enter -p $!

( perf top,,, 관찰할 지정된 이벤트 없이 꽤 놀라운 일을 수행합니다. CPU 코어가 어떤 기능에 얼마나 자주 있는지 관찰합니다. 이는 실제 작업 부하 상황에 최적화되어 있습니다. 소프트웨어를 위한 훌륭한 perf record첫 번째 단계 perf report있지만 이는 먼 길로 이어질 수 있습니다)

심층 추적

매우 자세한 내용을 원하는 경우 perf sched이는 놀라울 정도로 강력한 도구입니다 .

$ # make a recording
$ sudo perf sched record -- ./busyloop
[ perf record: Woken up 75 times to write data ]
[ perf record: Captured and wrote 161,058 MB perf.data (1458691 samples) ]
$ # evaluate the recording
$ sudo perf sched map
  *A0                               179778.272339 secs A0 => migration/0:17
  *.                                179778.272347 secs .  => swapper:0
   .  *B0                           179778.272413 secs B0 => migration/1:21
   .  *.                            179778.272419 secs
   .   .  *C0                       179778.272494 secs C0 => migration/2:26
   .   .  *.                        179778.272503 secs
   .   .   .  *D0                   179778.272576 secs D0 => migration/3:31
   .   .   .  *.                    179778.272585 secs
   .   .   .   .  *E0               179778.272659 secs E0 => migration/4:36
   .   .   .   .  *.                179778.272670 secs
   .   .   .   .   .  *F0           179778.272714 secs F0 => migration/5:41
   .   .   .   .   .  *.            179778.272733 secs
   .   .   .   .   .   .  *G0       179778.272815 secs G0 => migration/6:46
   .   .   .   .   .   .  *.        179778.272821 secs
   .   .   .   .   .   .  *H0       179778.272948 secs H0 => perf-exec:1315372
………

여기서 각 열은 CPU 코어이고 각 행은 이벤트입니다. man perf-sched나보다 더 자세히 설명할 수 있다. perf schedule latency로그를 가져와 일정 내 각 작업 실행이 얼마나 지연되었는지 알려줍니다.

$ sudo perf sched latency | grep busyloop
  busyloop:1315372      |  26548.094 ms |      677 | avg:   0.055 ms | max:   0.660 ms | max start: 179800.883053 s | max end: 179800.883713 s

매우 간단합니다!

관련 정보