내 프로그램에서 실시간 지속 시간은 때때로 CPU 시간의 최대 3배입니다. 이는 많은 메모리 할당과 NFS 기본 읽기/쓰기 작업을 수행하는 단일 스레드 애플리케이션입니다. 따라서 mem-swap이나 NFS 읽기 및 쓰기로 인해 속도가 느려지는 것으로 의심됩니다. 예를 들어, 다음의 출력은 다음과 같습니다./usr/bin/time a.out
2165.32user 64.93system 6036.33elapsed
실시간 분석 도구가 있나요? 나는 CPU 시간 분석을 위해 여러 도구를 알고 사용해 봤지만 NFS/mem-swap 또는 기타 벽시계 속도 저하를 지적하고 도움이 될 수 있는 도구가 있는지 확실하지 않습니다.
내 프로그램은 C++로 작성되었습니다.
편집하다: /usr/bin/time
마지막에 요약을 주었습니다. 제가 찾고 있던 것은 아니었습니다. 저는 애플리케이션의 특정 블록 동안 실시간 소비를 연관시키는 방법을 찾고 있습니다. Collect/gprof와 같은 프로파일러는 다음과 같은 내용을 알려줄 수 있습니다.
- 대기로 인해 대부분의 컨텍스트 전환이 발생하는 영역입니다.
- NFS 액세스가 발생하는 특정 기능입니다.
내 시스템은 전용이므로 이러한 구성 파일에 영향을 줄 수 있는 다른 프로세스에 대해 걱정하지 않습니다.
답변1
확실하지는 않지만 .. strace가 필요할 것 같습니다 ...
예:
여기에서는 프로세스 ID가 1055인 프로세스가 있다고 가정하고 다음 작업을 수행합니다.
neo $ sudo strace -w -c -p1055
strace: Process 1055 attached
^Cstrace: Process 1055 detached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
77.38 5.738820 534 10730 read
5.35 0.396752 114 3480 clone
4.17 0.309514 10 30741 rt_sigprocmask
2.31 0.171203 13 12761 close
1.56 0.115981 16 6960 3480 wait4
1.47 0.108800 10 10441 rt_sigaction
1.43 0.106307 8 11890 fcntl
0.98 0.072344 19 3770 openat
0.86 0.063769 18 3480 write
0.85 0.062820 18 3480 pipe
0.84 0.062443 15 4060 dup2
0.67 0.049338 9 5220 lseek
0.57 0.042007 11 3770 3770 ioctl
0.49 0.036669 10 3480 rt_sigreturn
0.47 0.035150 10 3480 fchmod
0.29 0.021420 12 1740 unlink
0.25 0.018666 10 1740 getpid
0.06 0.004745 16 290 stat
자세한 내용은 여기를 참조하세요:
man strace
그리고 여기:
답변2
당신이 찾을 수 있을지 의심스럽습니다perf timechart
굉장히 유용하다. 기본적으로 CPU 및 프로세스 상태를 기록하고 시간에 따른 상태 변화를 보여주는 그래프를 표시합니다.
상단에는 CPU 사용량이 표시되고 아래에는 프로세스가 표시됩니다. 파란색은 "실행 중"을 의미하고, 노란색은 프로세스가 CPU를 기다리고 있음을 의미하고, 빨간색은 프로세스가 I/O에서 차단되었음을 의미하고, 회색은 프로세스가 절전 모드임을 의미합니다. perf timechart
원하는 세부 수준으로 확장할 수 있는 SVG를 출력합니다.
또한 I/O(디스크 및 네트워크) 및 분기를 추적할 수 있습니다.
perf
세부 사항을 확인하는 데 도움이 되는 다른 모듈이 있습니다. perf record
관심 있는 이벤트(시스템이 지원하는 경우)를 사용하여 타임스탬프를 기록하고 시간 기반 정보를 표시할 수 있습니다.
답변3
이것이 귀하가 요구하는 것인지 완전히 확신할 수는 없지만 이것은 /usr/bin/time
벽시계와 유사하며 단지 측정만 합니다.
#!/bin/bash
start=$(date +%s%N)
"$@"
end=$(date +%s%N)
echo "$(($end - $start)) nanoseconds elapsed"
저장하고 wallclock
다음과 같이 실행하십시오.
$ ./wallclock sleep 1
1006622540 nanoseconds elapsed
답변4
나는 또한 벽시계 분석기를 찾고 있었습니다. 내 기대에 가장 잘 부합하는 도구는 다음과 같습니다.https://softwarerecs.stackexchange.com/a/55146/78636. 그 원리는 매우 간단합니다. GDB에서 프로세스를 시작한 다음 정기적으로 GDB를 중단하여 역추적을 기록합니다.