Wpis z mikrobloga

Mireczki mam pytanie do jakiegos ogarniacza z #programowanie #python #celery. Mam problem ze stabilnoscia aplikacji. Tworze aplikacje oblugujaca wysylanie i odbieranie wiadomosci pewnej aplikacji. Korzystam z zewnetrznej biblioteki dla tego protokolu. Do dzialania potrzebuje stworzyc dwie petle. Jedna nasluchujaca protokol a druga (w odzielnym watku) wysylajaca wiadomosci. Wrzucam to wszystko w task celery. Aby uruchomic nasluchiwanie dla jednego konta uruchamiam (nieskonczony) task. Niestety po pewnym czasie serwer sie zapycha i calosc przestaje dzialac.
concurency mam ustawione na 20 (serwer posiada 1core i 1GB RAM). Czy to jest jednoznaczne z tym, ze moge uruchomic 20 taskow jednoczesnie ? W przyslosci serwer mam obslugiwac tysiace kont a nie radzi sobie z tak mala iloscia. Jakie ustawienia dla celery wybrac w moim przypadku ? moze lepiej autoscale lub jakis greenlet czy moze calkowicie zrezygnowac z celery ? Problemem jest rowniez duze zuzycie pamieci RAM. Co moze powodowac przepelnienie ?
Link do so: klik
  • 7
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

concurency mam ustawione na 20 (serwer posiada 1core i 1GB RAM). Czy to jest jednoznaczne z tym, ze moge uruchomic 20 taskow jednoczesnie


@Skalpel_: Tak, ale nie na jednym core, ustawiłeś zdecydowanie za dużo. Jeśli Twoje taski są IO-bound, możesz użyć gevent albo evenlet:
http://docs.celeryproject.org/en/latest/userguide/concurrency/eventlet.html

Czy Twoja pętla działa wewnątrz taska? Jeśli tak, to wywal pętlę, a użyj celerybeat
  • Odpowiedz
@Skalpel_: Czy dobrze zrozumiałem, że celery uruchamia programy będące serwerem? Dlaczego każdy użytkownik w osobnym procesie? Tak po mojemu (o ile dobrze zrozumiałem pomysł) to źle to zaplanowałeś i celery (czy dowolna inna kolejka zadań) do tego nie służy.
  • Odpowiedz
@stacktrace: W tym tasku znajduje sie nasluch po sockecie. To jest protokol XMPP. Jakie rozwiazanie bys proponowal ? Wybralem celery by latwo mozna bylo zarzadzac taskami, lapac sygnaly, restartowac itd
  • Odpowiedz
@Skalpel_: Jeżeli uruchamiasz workera, który uruchamia nasłuch na sockecie a dodatkowo obsługuje komunikację z celery to jest ok. Natomiast jeżeli ta pętla jest wewnątrz tasku celery to jest fatalne rozwiązanie.

Dobra, dopiero teraz zauważyłem link do SO. No to tak się nie robi. Raczej coś na taki kształt: https://gist.github.com/anonymous/c1db72fd3750a37a97c75bb42a6708be
Potrzebujesz tylko jednego serwera, który obsłuży tych użytkowników. Może być oparty o wątki lub non-blocking io. Natomiast uruchamianie wielu procesów zwiększa
  • Odpowiedz
@stacktrace: No ok zrobilem to na wątkach, ale mysle ze mozna to zrobic lepiej. Podpowiesz moze jak to zrealizowac w twisted ? Powiedzmy ze potrzebuje 100 takich klientow odpalonych jednoczesnie
  • Odpowiedz