2015-05-09 18 views
10

Używam Gunicorn do obsługi aplikacji Django, działało to w porządku, dopóki nie zmieniłem limitu czasu z 30 na 900000, musiałem to zrobić, ponieważ miałem przypadek, w którym trzeba było załadować ogromny plik i przetwarzane (proces zabiera więcej niż 30 mw niektórych przypadkach), ale po tej zmianie Gunicorn przestaje reagować po kilku godzinach, myślę, że problem polega na tym, że wszyscy pracownicy (mający 30) będą zajęci niektórymi prośbami po tym czasie, ta dziwna rzecz jest zdarza się to, nawet jeśli nie uruchomię tak długiego żądania i dzieje się to przy normalnym eksplorowaniu w administratorze django. Chcę wiedzieć, czy istnieje sposób, aby monitorować wnioski dotyczące gunicorn i zobaczyć, jak pracownicy są zajęci, jakie wnioski, chcę dowiedzieć się, że wnioski są dla nich zajęte. Próbowałem --log-file=- --log-level=debug, ale nie mówi nic o żądaniach, potrzebuję bardziej szczegółowych dzienników.Gunicorn nie odpowiada

+0

Moje przeczucie polega na tym, że może występować zakleszczenie w niektórych kodach obsługi żądań. Po 30-sekundowym limicie czasu dotknięci pracownicy ostatecznie się zwolnią. Przy przekroczeniu czasu 0,9 megasekundy skutecznie tego nie zrobią. –

+0

Rozumiem, dlatego potrzebuję dzienników, aby dowiedzieć się, co się dzieje. – Sassan

Odpowiedz

-1

Podczas gdy ja również szukam dobrej odpowiedzi, aby zobaczyć, jak wielu pracowników jest zajęty, rozwiązujesz ten problem w niewłaściwy sposób. W przypadku zadania, które trwa tak długo, potrzebny jest pracownik, na przykład Seler/RabbitMQ, do asynchronicznego wykonywania ciężkiego podnoszenia, a cykl żądania/odpowiedzi pozostaje szybki.

Mam skrypt na moim miejscu, które może potrwać 5+ minut, aby zakończyć, a tu jest dobry wzór używam:

  1. Gdy żądanie pierwszy przychodzi, tarło zadanie i po prostu zwróci HTTP 202 Zaakceptowany. Jego celem jest "Wniosek został zaakceptowany do przetwarzania, ale przetwarzanie nie zostało zakończone."
  2. Wypełnij ankietę z tego samego punktu końcowego (co 30 sekund powinno wystarczyć). Dopóki zadanie nie jest kompletne, zwróć 202
  3. Ostatecznie po zakończeniu zwraca 200, wraz z dowolnymi danymi, których może wymagać front-end.

Dla mojej witryny chcemy zaktualizować dane, które mają więcej niż 10 minut. Przekazuję nagłówek Accept-Datetime, aby wskazać, ile starych danych jest akceptowanych. Jeśli nasza lokalna kopia w pamięci podręcznej jest starsza, odradzamy cykl zadań.

+0

Nie, to nie zawsze jest dobre rozwiązanie, "zwykle" to prawda, ale nie zawsze. Czasami logika polega na tym, aby użytkownik poczekał, aż odpowiedź będzie gotowa (jakkolwiek to potrwa) i pokaże mu odpowiedź.W moim przypadku musiałem to zrobić i dlatego spytałem go tutaj (w każdym razie nie jestem tym, który przegłosował twoją odpowiedź) – Sassan

+0

OK, jasne. To, co zaproponowałem, jest zazwyczaj tylko odpowiedzią. Ale w jaki sposób "sprawić, by użytkownik czekał"? Co się stanie, jeśli odświeżą się? Czy praca jest kontynuowana, czy musi zacząć od nowa. Jeśli to się powtórzy, w jaki sposób otrzymają aktualizację statusu? – user3681414

+0

Właśnie założyłem konto z Datadogiem. Mają integrację z gunicorn, która pozwoli ci zobaczyć, ilu pracowników jest zajęty w porównaniu do wolnych. – user3681414