저는 다중 스레드 데이터베이스 서버의 성능을 연구하고 있습니다. 특정 시스템에서 실행하는 데 약 61초가 걸리는 특정 작업 부하가 있었습니다. 워크로드에 대해 perf를 실행할 때 데이터베이스 프로세스의 pid는 79894입니다.
데이터베이스 서버의 소프트웨어 스레드 외에도 일반적으로 유휴 시스템에서는 휴면 상태이지만 워크로드가 실행될 때 활성화되는 Linux 관련 스레드가 많이 있습니다. 그래서 -p 옵션뿐만 아니라 perf의 -a 옵션도 사용하고 싶습니다.
나는 두 가지 방법으로 성능을 실행하고 각 방법마다 다른 결과를 얻습니다.
창에서 다음 perf 명령을 실행한 첫 번째 방법
perf stat -p 2413 -a
즉시 다른 창에서 데이터베이스 워크로드를 실행합니다. 데이터베이스 워크로드가 완료되면 C를 제어하여 perf를 종료하고 다음 결과를 얻습니다.
Performance counter stats for process id '79894':
1,842,359.55 msec cpu-clock # 30.061 CPUs utilized
3,798,673 context-switches # 0.002 M/sec
153,995 cpu-migrations # 0.084 K/sec
16,038,992 page-faults # 0.009 M/sec
4,939,131,149,436 cycles # 2.681 GHz
3,924,220,386,428 stalled-cycles-frontend # 79.45% frontend cycles idle
3,418,137,943,654 instructions # 0.69 insn per cycle
# 1.15 stalled cycles per insn
402,389,588,237 branches # 218.410 M/sec
5,137,510,170 branch-misses # 1.28% of all branches
61.28834199 seconds time elapsed
두 번째 방법은 실행하는 것입니다
perf stat -a sleep 61
즉시 다른 창에서 데이터베이스 워크로드를 실행합니다. 61초 후에 perf와 워크로드가 모두 완료되고 perf는 다음 결과를 생성합니다.
Performance counter stats for 'system wide':
4,880,317.67 msec cpu-clock # 79.964 CPUs utilized
8,274,996 context-switches # 0.002 M/sec
202,832 cpu-migrations # 0.042 K/sec
14,605,246 page-faults # 0.003 M/sec
5,022,298,186,711 cycles # 1.029 GHz
7,599,517,323,727 stalled-cycles-frontend # 151.32% frontend cycles idle
3,421,512,233,294 instructions # 0.68 insn per cycle
# 2.22 stalled cycles per insn
402,726,487,019 branches # 82.521 M/sec
5,124,543,680 branch-misses # 1.27% of all branches
61.031494851 seconds time elapsed
두 버전 모두에서 -a를 사용했기 때문에 대략 동일한 결과를 얻을 것으로 예상했습니다.
하지만 잠과 함께,
cpu-clock is 2.5 times what you get with the -p version,
context-switches are double what you get with the -p version
and the other values are more or less the same
질문 2개,
(1) which set of results do I believe?
and
(2) how can there be more stalled-cycles-frontend than cycles in the sleep version?