벽시계 시간을 분석하는 방법은 무엇입니까?

벽시계 시간을 분석하는 방법은 무엇입니까?

내 프로그램에서 실시간 지속 시간은 때때로 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

그리고 여기:

https://strace.io/

답변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를 중단하여 역추적을 기록합니다.

관련 정보