본문으로 건너뛰기

2.2 Context switch와 perf

Context switch는 정상적인 concurrency의 일부입니다. 값이 높다는 사실보다 같은 처리량에서 증가했는지, voluntary와 involuntary switch 중 무엇이 늘었는지가 중요합니다.

pidstat -w -p ALL 1
pidstat -u -p ALL 1
perf stat -p PID -- sleep 10

pidstat -w는 process별 voluntary와 involuntary context switch를 보여 줍니다. Lock, socket, I/O를 기다리는 task는 voluntary switch가 늘 수 있고, CPU time slice를 빼앗기면 involuntary switch가 증가할 수 있습니다.

perf stat에서 볼 항목

sudo perf stat -e \
task-clock,context-switches,cpu-migrations,page-faults,cycles,instructions \
-p PID -- sleep 15

IPC는 instructions / cycles입니다. 낮은 IPC를 곧바로 비효율적인 code로 단정하지 않습니다. Cache miss, branch, memory latency, sleep이 섞일 수 있습니다. 정상 실행과 문제 실행의 동일 workload를 비교합니다.

Sampling

sudo perf record -F 99 -g -p PID -- sleep 30
sudo perf report

Sampling은 어떤 function이 CPU time을 소비하는지 찾는 데 유용하지만 symbol과 stack unwinding 조건에 영향을 받습니다. 운영에서는 낮은 frequency와 짧은 window로 시작합니다.

perf_event_paranoid와 capability 설정은 관측 범위를 제한합니다. 권한을 완화하기 전에 kernel address와 process data가 노출될 수 있음을 검토합니다.

참고: Perf events and tool security