Dlaczego „strace” nie pokazuje, że ten proces na coś czeka?

11

Potężny stracemnie zawiódł. Jak to jest możliwe?


time foopokazuje, że foouruchomienie zajmuje kilka sekund („rzeczywisty”), ale zużywa nieznaczny czas procesora, zarówno w przestrzeni użytkownika („użytkownik”), jak i w jądrze („sys”). Dla ciekawskich foozdefiniowano poniżej.

Dlatego spędza większość czasu czekając na coś innego, nie wykonując instrukcji procesora. Zwykle widzę, jak czeka strace- tzn. Jakie wywołanie systemowe blokuje przez długi czas. Niestety takie podejście nie zadziałało.

strace -ttt -T -C -w foopokazuje wywołania systemowe, znaczniki czasu oraz podsumowanie (rzeczywistego) czasu spędzonego na wywołaniach systemowych. Ale ten szczególny proces pokazał, że spędzanie nieistotnego czasu (w czasie rzeczywistym) wewnątrz wywołań systemowych.


foojest właściwie journalctl -b -u dev-hugepages.mount. Tyle że musiałem za każdym razem zmieniać ostatni argument na inną jednostkę systemową, aby to odtworzyć. Innymi słowy, opóźnienie, które badam, zdarzyło się po raz pierwszy, gdy próbuję uzyskać dzienniki dla dowolnej jednostki systemowej. EDYCJA : po udzieleniu odpowiedzi na główne pytanie, zdałem sobie również sprawę z tego, dlaczego miałem problem z odtworzeniem opóźnienia .

Czas spędzony przez ten proces jest szczególnym problemem, najwyraźniej nie występuje we wszystkich systemach. https://github.com/systemd/systemd/issues/7963

sourcejedi
źródło
Hmm ... ponieważ twój program „foo” nie jest zwykłym procesem jedno-procesowym i jednowątkowym, lepiej byś był obsługiwany, mówiąc strace, by śledził i dołączał do widelców. „-ff” jest twoim przyjacielem! :) Będziesz także chciał użyć „-o / dev / shm / strace-foo”, aby skorygować wszystkie pliki wyjściowe procesu przetwarzania w jedno miejsce. Tylko sugestia.
Jesse Adelman
@JesseAdelman Myślę, że journalctldziała tylko jeden proces. Mam wrażenie, że journalctlużywa jednego dodatkowego wątku z jakiegokolwiek powodu - iirc była jedna rozmowa clone (). Myślę, że oznacza to, że masz techniczną rację, ale jest to również technicznie nieistotne dla pytania. timepatrzy na proces jako całość i wykazał, że proces jako całość jest raczej senny (blokuje na czymś). stracenie pokazał wystarczającej ilości snu. Nie ma znaczenia, czy śpi drugi wątek, główny wątek również musi być bardzo śpiący, aby wyjaśnić timewynik.
sourcejedi

Odpowiedzi:

18

Zwykle powodem tego problemu jest to, że proces blokuje błędy stron. Są to odczyty lub zapisy plików wykonywanych poprzez mapowanie pamięci aka mmap(). Być może zauważyłeś pewne mmap()ślady wywołań systemowych.

Jeśli używałeś /usr/bin/timeprogramu zamiast timewbudowanej powłoki, mógłbyś również zauważyć:

0.04user 0.10system 0:02.29elapsed 6%CPU (0avgtext+0avgdata 40464maxresident)k
73632inputs+0outputs (376major+1081minor)pagefaults 0swaps

majorbłędy strony są tymi, które wymagają IO systemu plików. minorbłędy strony są znacznie mniej znaczące (prawdopodobnie tylko „brak TLB”).

Podejrzewam, że inputsto całkowita liczba przeczytanych stron. Obecnie uważam, że strony mapowane na plik mają zawsze ten sam rozmiar. 4096 bajtów w większości przypadków, ale można to sprawdzić getconf PAGESIZE.

Oznacza to ~ 290 megabajtów, odczyt z prędkością ponad 100 megabajtów na sekundę, standardową prędkością dla dysku twardego takiego jak mój. Zagadka rozwiązana!


Pamiętaj również, że zakładasz, że masz cały wolny procesor dla tego procesu. W przeciwnym razie proces można po prostu zablokować, czekając, aż inne procesy zwrócą CPU.

stracepokazuje tylko, kiedy proces wchodzi do jądra (a następnie opuszcza go) z powodu wywołania systemowego. Lub gdy dostarczany jest sygnał uniksowy. Istnieją jednak inne rodzaje przerwań, którestrace ogóle się nie wyświetlają. Więc to obejmuje

  • Błędy strony.
  • Timer przerywa. Służy to do przełączania się na inny proces, gdy bieżący wyczerpał przydzielony przedział czasu na CPU.
sourcejedi
źródło
1
Dobra odpowiedź, gratulacje! Rzeczywiście ważne jest, aby zrozumieć ograniczenia narzędzi, z których się korzysta. +1; Lubię też te tematy: unix.stackexchange.com/questions/418354/… i unix.stackexchange.com/questions/419697/...
Rui F Ribeiro