2015-08-08 30 views
29

W moim /etc/defaults/celeryd pliku konfiguracyjnym, mam ustawione:Seler, pracowników i AutoScaling

CELERYD_NODES="agent1 agent2 agent3 agent4 agent5 agent6 agent7 agent8" 
CELERYD_OPTS="--autoscale=10,3 --concurrency=5" 

Rozumiem, że demon ikra 8 pracowników seler, ale całkowicie nie jestem pewien co autoscale i concurrency robić razem. Sądziłem, że współbieżność jest sposobem na określenie maksymalnej liczby wątków, których pracownik może użyć, a autoskalowanie to sposób, w jaki pracownik może w razie potrzeby skalować i zmniejszać liczbę pracowników pracujących z dziećmi.

Zadania mają duży ładunek (około 20-50kB) i są podobne do 2-3 milionów takich zadań, ale każde zadanie trwa mniej niż sekundę. Widzę wzrost zużycia pamięci, ponieważ broker dystrybuuje zadania do każdego pracownika, co powoduje wielokrotne replikowanie ładunku.

Myślę, że problem tkwi w konfiguracji i że połączenie pracowników + współbieżność + autoskalowanie jest nadmierne i chciałbym lepiej zrozumieć, co robią te trzy opcje.

+0

Dokumentacja do [autoskalowania] (http://celery.readthedocs.org/en/latest/userguide/workers.html#autoscaling) i [współbieżność] (http://celery.readthedocs.org/en/latest /userguide/workers.html#concurrency) jest całkiem jasne. Czego nie rozumiesz. W szczególności nie ma sensu precyzować obu naraz. I jaki dokładnie jest twój problem? Spike pamięci? Czy to rzeczywiście jest problem - czyli czy trafiasz na swap, czy wywołujesz OOM? – scytale

+1

@scytale Widzę wywoływaną OOM. Wiele procesów zostaje po prostu zakończonych za pomocą 'Killed', kiedy rośnie. Wydaje mi się, że teraz jestem jasny na temat autoskalowania i współbieżności. Myślałem, że '--autoscale' doda więcej pracowników, ale jest to po prostu dynamiczne ustawienie dla określania współbieżności zamiast stałego ustawienia z' --concurrency'. Domyślam się, że moje jedyne zamieszanie wokół "dodaje więcej pracowników przy mniejszej współbieżności lub dodaj mniej pracowników o większej współbieżności". Nie wiem, jak ocenić ten kompromis. – Joseph

+0

rozróżnijmy pracowników i procesy robocze. odrodzisz pracownika selera, a następnie spawnuje szereg procesów (w zależności od rzeczy takich jak -koncurrency i --autoscale). Nie ma sensu uruchamianie więcej niż jednego procesora, chyba że chcesz robić routing, słuchać różnych kolejek itp. Powiedziałbym, aby uruchomić jeden robot z domyślną liczbą procesów (tj. Pominąć --concurrency i --autoscale i będzie domyślnie tyle procesów, ile jest rdzeni). Następnie przetestuj swoją aplikację w celu ustalenia poziomu współbieżności, który odpowiada Twoim potrzebom. – scytale

Odpowiedz

22

Rozróżnijmy pracowników od procesów roboczych. Przywołujesz pracownika selera, który następnie uruchamia wiele procesów (w zależności od rzeczy takich jak --concurrency i --autoscale, domyślnie jest to spawnowanie tylu procesów, ile rdzeni na komputerze). Nie ma sensu uruchamianie więcej niż jednego pracownika na konkretnym komputerze, chyba że chcesz przeprowadzić routing.

Proponuję uruchomić tylko 1 pracownika na maszynę z domyślną liczbą procesów. Zmniejszy to zużycie pamięci, eliminując powielanie danych między pracownikami.

Jeśli nadal masz problemy z pamięcią, zapisz dane w sklepie i przekazuj pracownikom tylko identyfikator.

+0

[Dokumenty] (http://docs.celeryproject.org/en/latest/userguide/workers.html#concurrency) mówią, że istnieje korzyść w prowadzeniu wielu pracowników na jednym komputerze. Może to się zmieniło w ciągu lat, odkąd to opublikowałeś. – Travis

+2

Po pierwsze, doktorzy mówią tylko, że * może * być zaletą w prowadzeniu wielu pracowników, ale sugeruje eksperymentowanie: "Istnieją nawet dowody na poparcie tego, że uruchomienie wielu instancji pracowników może działać lepiej niż posiadanie pojedynczego pracownika". Po drugie w tym przypadku ładunek był bardzo duży. Ponieważ każde zadanie jest dystrybuowane do każdego pracownika, oznacza to, że wymaganie pamięci = rozmiar ładunku * liczba zadań w kolejce * liczba pracowników, która powodowała problemy z pamięcią. W takim przypadku użycie 1 pracownika zmniejszyłoby zużycie pamięci. Jednak lepszym rozwiązaniem było nie przekazanie tak dużego ładunku. – scytale

+2

Jeśli określisz zarówno '--concurrency' i' --autoscale', który z nich ma pierwszeństwo? – speedplane