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:
- 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. - 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. - 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ć?
Czy przełączania (do selera) znacznie zwiększyć wydajność? Mam ten sam problem. –
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! –