Przesyłam dane wyjściowe z jednego programu do napisanego przeze mnie Perla. To długotrwały proces, czasem dni, więc chcę dowiedzieć się, gdzie są moje wąskie gardła i spróbować je otworzyć. Chcę wiedzieć, czy dane są przesyłane do mojego skryptu szybciej niż mój skrypt może to przetworzyć. W takim przypadku postaram się ulepszyć mój skrypt, ale nie, jeśli nie będę musiał. Widzę mówienie o ustawianiu flagi, gdy bufor jest pełny, co uniemożliwia dalsze zapisywanie do niego, ale jak sprawdzić, czy lub jak często ta flaga jest ustawiona? Jakieś pomysły?
11
pv
gdzieś wzdłuż łańcucha rur.Odpowiedzi:
Śledziłbym twój skrypt Perla za pomocą narzędzia do śledzenia wywołań systemowych:
strace
(Linux),dtruss
(OS X),ktrace
(FreeBSD),truss
(Solaris) itp. Celem byłoby sprawdzenie, ile czasu twój skrypt Perla czeka na czytanie z jego stdin i ile czasu drugi program spędza na pisaniu na standardowe wyjście.Tutaj testuję to z pisarzem jako wąskim gardłem:
Pierwszy numer to czas od początku poprzedniego połączenia systemowego, a ostatni numer to czas spędzony na wywołaniu systemowym. Więc możemy trochę przetworzyć za pomocą Perla, aby go zagregować ... [*]
Możesz zrobić coś bardziej fantazyjnego i stworzyć skrypt SystemTap lub DTrace, który śledzi obie strony jednocześnie, śledzi tylko poprawny deskryptor pliku i drukuje ładną aktualizację statusu co sekundę z procentem czasu, jaki każdy czekał na drugą.
[*] - Ostrzeżenie: moja prymitywna agregacja nie jest w porządku, jeśli odczyt / zapis jest wywoływany w innych deskryptorach plików; w takim przypadku nie doceniają czasu pracy.
Wersja dtrace jest właściwie całkiem fajna.
I wersja SystemTap:
źródło
Możesz wstawić
pv -TC
polecenie do linii potoku:pv
używa własnego bufora i-T
sprawia, że raportuje, jak pełny jest średnio co 1 sekundę (domyślnie).Jeśli zawsze jest to 100%, oznacza
cmd1
to , że produkcja jest szybsza niżcmd2
konsumpcja. Jeśli nie, to jest na odwrót. Uważaj, że same rury mogą pomieścić 64kB.Zobacz także,
-B
aby określićpv
rozmiar bufora. Możesz użyć kilkupv
s jak w:źródło