2013-03-11 14 views
13

Próbujesz użyć python-rq do obsługi zaplecza naszej aplikacji internetowej, ale przesuwanie nowych zadań zajmuje bardzo dużo czasu - do 12 sekund.Niezadowalająca wydajność wykonywania zadań za pomocą Python RQ

Uderzenie wydajności występuje podczas wykonywania wywołania funkcji enqueue_call, w szczególności gdy zwiększa się liczba procesów roboczych podłączonych do systemu (ponad 200).

System działa w następujący sposób:

  1. Czo pcha pracy do serwera kolejki zadanie. Wykorzystuje to funkcję enqueue_call do przekazywania argumentów do zadania (takich jak timeout i ttl), oprócz faktycznych argumentów funkcji, która ma zostać wykonana.
  2. Wiele procesów (rozproszonych na kilku komputerach) uruchamia pracowników, każdy pod UNIX screen. Pracownicy postępują zgodnie ze schematem podanym w dokumentacji, wykonując funkcję nieskończoną pętlę, aby nasłuchiwać w kolejkach.
  3. Podczas przetwarzania niektóre z zadań odradzają nowe, zwykle w tej samej kolejce, w której są uruchomione.

o infrastrukturze:

  • Serwer Redis, który biegnie ta kolejka zadaniem jest dedykowany do niego. Ponadto utrwalanie jest wyłączone. Działa na serwerze Rackspace o pojemności 4 GB.
  • Po uruchomieniu redis-benchmark na serwerze z kolejką zadań, otrzymujemy wyniki powyżej 20000 r/s dla większości benchmarków.

Jak możemy poprawić wydajność wypychania nowych miejsc pracy w takiej sytuacji? Czy istnieje lepszy wzór, który powinniśmy zastosować?

+0

Czy przełączania (do selera) znacznie zwiększyć wydajność? Mam ten sam problem. –

+0

Nie pracuję obecnie nad tym samym projektem. Jednak nadal używaliśmy 'rq' jako back-end, a problemy z wydajnością zostały w końcu usunięte, gdy wyczyściliśmy infrastrukturę. Nie mogłem polecić przejścia na 'selera' lub pozostanie przy' rq' dla twojego konkretnego przypadku użycia; Ja * jednak * sugeruje wykonanie testów. Może nie być tak trudne, jak początkowo sądziłeś, i ** gwarantuję **, że czas poświęcony na tworzenie dobrych testów w końcu się zwróci, ponieważ lepiej zrozumiesz naturę swojego systemu. Powodzenia! –

Odpowiedz

1

12 sekund? To jest szalone.

Czy rozważałeś użycie selera?
Nigdy nie używano redis-rq, ale z tego, co widzę na podstawie dokumentów, nie jest to dobre dla dużej liczby pracowników.
Kolejka Redis zwykle jest oparta na komendzie BLPOP, która może działać z wieloma klientami, ale kto wie, ile może naprawdę radzę sobie z jednym kluczem.

więc proponuję, aby przełączyć się Seler lub pisanie własnego dystrybutora zadania dla python-rq, które przyzwyczajenie być łatwiej niż przełączanie

Powiązane problemy