Jak profilować zegar ścienny?

Sep 09 2020

W moim programie czas trwania w czasie rzeczywistym jest czasem nawet 3 razy dłuższy niż czas procesora. Jest to aplikacja z jednym wątkiem, która zajmuje się alokacją dużej ilości pamięci i podstawowym odczytem / zapisem NFS. Więc wątpię, czy to albo wymiana pamięci, albo odczyt i zapis NFS spowalniają rzeczy. Na przykład następujące dane wyjściowe to/usr/bin/time a.out

2165.32user 64.93system 6036.33elapsed

Czy istnieje narzędzie do profilowania w czasie rzeczywistym? Wiem i korzystałem z wielu narzędzi do profilowania czasu procesora, ale nie jestem pewien, czy jest coś, co mogłoby pomóc i wskazać NFS / mem-swap lub inne spowolnienia zegara ściennego.

Mój program jest napisany w C ++

EDYCJA : /usr/bin/timedaje mi podsumowanie na koniec - tego nie szukam. Szukam sposobu na skorelowanie zużycia w czasie rzeczywistym podczas określonych bloków programu mojej aplikacji. Program profilujący, taki jak collect / gprof, który może mi powiedzieć takie rzeczy, jak

  • obszar, w którym występuje większość zmian kontekstu z powodu oczekiwania.
  • określone funkcje, w których ma miejsce dostęp do NFS.

Ponieważ mój system jest dedykowany, nie martwię się o inne procesy, które mogą mieć wpływ na te profile.

Odpowiedzi

StephenKitt Sep 22 2020 at 21:48

Podejrzewam, że okaże się to perf timechartbardzo przydatne. Domyślnie rejestruje stan procesora i procesu oraz rysuje wykres pokazujący, jak ten stan zmienia się w czasie:

Na górze widać zajętość procesora, a poniżej procesy - niebieski oznacza „uruchomiony”, żółty oznacza, że ​​proces oczekuje na procesor, czerwony oznacza, że ​​proces jest zablokowany we / wy, szary oznacza, że ​​proces jest uśpiony. perf timechartwyświetla SVG, który można powiększyć do dowolnego poziomu szczegółowości.

Może również śledzić I / O (dysk i sieć) oraz rozgałęzienia.

perfma inne moduły, które pomogą zbadać szczegóły; perf recordmogą być zapisywane znaczniki czasu i aktualne informacje oparte na czasie, wykorzystując dowolne zdarzenia, którymi jesteś zainteresowany (jeśli twój system je obsługuje).

SandeepKothari Sep 22 2020 at 21:22

Nie jestem pewien ... ale wygląda na to, że potrzebujesz strace ...

Przykład:

Tutaj, powiedz, jeśli mam proces z identyfikatorem procesu 1055, a następnie robię coś takiego:

 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

czytaj więcej tutaj:

man strace

a także tutaj:

https://strace.io/