Jak profilować zegar ścienny?
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
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).
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/