2012-03-22 13 views
7

Posiadam długo działający serwer twisted.Profilowanie długo działającego serwera Pythona

W dużym teście systemowym, w jednym konkretnym punkcie kilka minut po teście, kiedy niektórzy klienci wchodzą w konkretny stan i zdarza się określone zdarzenie zewnętrzne, następnie ten serwer zajmuje kilka minut 100% procesora i wykonuje swoją pracę bardzo powoli. Chciałbym wiedzieć, co robi.

Jak uzyskać profil dla określonego przedziału czasu na serwerze z długim czasem działania?

Mogę łatwo wysyłać komunikaty o uruchomieniu i zatrzymaniu serwera przez HTTP, jeśli istnieje sposób na włączenie lub wstrzyknięcie profilera w czasie wykonywania?

Zależnie od wyboru, chciałbym profilować stack-based/call-graph, ale nawet próbkowanie liści może dać wgląd.

Odpowiedz

11

yappi Profiler można uruchamiać i zatrzymywać w czasie wykonywania.

3

Nie bardzo pythonowa odpowiedź, ale może strace proces ten daje pewien wgląd (zakładając, że jesteś na Linuksie lub podobnym).

Używając ściśle Pythona, dla takich rzeczy używam śledzenia wszystkich połączeń, przechowywania ich wyników w buforze pierścieniowym i użycia sygnału (być może mógłbyś to zrobić za pośrednictwem wiadomości HTTP), aby zrzucić ten bufor dzwonka. Oczywiście śledzenie spowalnia wszystko, ale w twoim scenariuszu możesz włączyć śledzenie również za pomocą komunikatu HTTP, więc będzie włączone tylko wtedy, gdy twój problem będzie również aktywny.

+0

Czy możesz zrobić te rzeczy w procesie Pythona, który działa, bez zatrzymywania go? –

+0

Pewnie. Musi być na to przygotowany. W Pythonie po prostu wywołaj 'sys.settrace (bla)', a funkcja 'bla()' zostanie wywołana dla praktycznie wszystkiego, co się dzieje (wywoływanie funkcji, wykonywanie linii itp.). Debugery i profilery zazwyczaj polegają na tym mechanizmie. Ale jest dość proste, aby coś na tym zbudować, a następnie przygotować się do włączenia go po otrzymaniu specjalnej wiadomości HTTP. – Alfe