10

Czy poniższe wskazówki są prawidłowe?Kiedy używać wzorca zakłócenia i kiedy lokalny magazyn z kradzieżą pracy?

  • disruptor pattern ma lepszą wydajność i skalowalność równoległego, jeśli każdy wpis musi być przetwarzany na wiele sposobów (IO operacji adnotacje), ponieważ może to odbywać się równolegle za pomocą wielu konsumentów bez rywalizacji.
  • Przeciwnie, work stealing (tj przechowywania wpisy lokalnie i kradzież wpisy z innych wątków) ma lepszą równoległego wydajność i skalowalność, jeśli każdy wpis musi być przetwarzane tylko w jeden sposób, ponieważ disjointly dystrybucją wpisy na wielu wątków w Disruptor wzór powoduje rywalizację.

(I jest wzorem disruptor nadal o wiele szybciej niż w przypadku innych kolejek Wielu konsumentów lockless Wielu producentów (np from boost), gdy wielu producentów (tj CAS operations) są zaangażowane?)


My Szczegółowa sytuacja::

Przetwarzanie wpisu może spowodować utworzenie kilku nowych wpisów, które również muszą zostać przetworzone. Wydajność ma najwyższy priorytet, wpisy przetwarzane w kolejności FIFO mają drugi priorytet.

W bieżącej implementacji każdy wątek używa lokalnego FIFO, w którym dodaje nowe wpisy. Idle threads nici kradną pracę z lokalnego FIFO innego wątku. Zależności między przetwarzaniem wątku są rozwiązywane przy użyciu tabeli bez blokady, mechanically sympathetic (CAS przy zapisie, z ziarnistością wiadra). Powoduje to dość małą rywalizację, ale kolejność FIFO jest czasami zerwana.

Używanie wzorca zakłócenia zagwarantowałoby zamówienie FIFO. Ale czy rozpowszechnianie wpisów na wątkach nie powodowałoby dużo większego sporu (np. CAS na kursie odczytu) niż w przypadku lokalnych FIFO z kradzieżą pracy (przepustowość każdego wątku jest mniej więcej taka sama)?


Referencje Znalazłem

testów wydajności w the standard technical paper on the disruptor (rozdział 5 + 6) nie pokrywają rozłączny podział pracy.

https://groups.google.com/forum/?fromgroups=#!topic/lmax-disruptor/tt3wQthBYd0 to jedyne odniesienie, które znalazłem na temat kradzieży z zakłóceniami i pracą. Stwierdza, że ​​kolejka na wątek jest znacznie wolniejsza, jeśli istnieje jakiś stan współdzielony, ale nie zawiera szczegółów ani nie wyjaśnia dlaczego. Wątpię, aby to zdanie odnosiło się do mojej sytuacji, gdy:

  • udostępniony stan został rozwiązany przy użyciu tabeli bez blokady;
  • konieczności rozłącznej dystrybucji wpisów wśród konsumentów;
  • z wyjątkiem kradzieży pracy, każdy wątek czyta i zapisuje tylko w swojej lokalnej kolejce.

Odpowiedz

12

Update - Konkluzja góry za max wydajność: Musisz napisać zarówno w idiomatycznym składni Disruptor i pracy kradzież, a następnie punkt odniesienia.

Uważam, że rozróżnienie to przede wszystkim podział na komunikat i skupienie na zadaniu, a więc na sposobie, w jaki chcesz myśleć o problemie. Spróbuj rozwiązać swój problem, a jeśli jest skoncentrowany na zadaniu, to Disruptor jest dobrym rozwiązaniem. Jeśli problem dotyczy wiadomości, możesz lepiej dopasować się do innej techniki, takiej jak kradzież pracy.

  • Zastosowanie praca kradzież gdy implementacja jest wiadomość koncentruje. Każdy wątek może odebrać wiadomość i przeprowadzić ją do końca. Na przykład serwer HTTP - do każdego przychodzącego żądania http przydzielony jest wątek. Że wątek koncentruje się na obsłudze rozpoczęcia żądania do końca - zalogowaniu wniosek, sprawdzenie kontroli bezpieczeństwa, robi vhost wyszukiwanie, pobieranie plików, wysyłanie odpowiedzi i zamykając połączenie

  • Zastosowanie disruptor gdy implementacja jest zadanie koncentruje . Każdy wątek może działać na określonym etapie przetwarzania. Alternatywny przykład: w przypadku koncentracji na zadaniu proces przetwarzania zostałby podzielony na etapy, więc użytkownik miałby wątek, który logował, wątek kontroli bezpieczeństwa, wątek do wyszukiwania vhostów itp .; każdy wątek koncentruje się na zadaniu i przekazuje żądanie do następnego wątku w potoku. Etapy mogą być paralelizowane, ale ogólna struktura jest wątkiem skoncentrowanym na określonym zadaniu i przekazuje wiadomość między wątkami.

Oczywiście, możesz zmienić swoją implementację, aby lepiej odpowiadała każdemu podejściu.

W twoim przypadku inaczej skonstruowałbym problem, gdybyś chciał użyć Disruptora. Zasadniczo wyeliminowałbyś współdzielony stan, gdyby jeden wątek był właścicielem stanu i przekazywał wszystkie zadania przez ten wątek pracy - wyszukaj SEDA dla wielu takich schematów. Może to przynieść wiele korzyści, ale znowu zależy od Twojej implementacji.

Niektóre więcej gadatliwość:

  • Disruptor - bardzo przydatna, gdy ścisła kolejność etapów jest wymagane dodatkowe korzyści, gdy wszystkie zadania mają długość spójny np: brak blokowania w systemie zewnętrznym, a bardzo podobna ilość przetwarzania za zadanie. W tym scenariuszu można założyć, że wszystkie wątki będą działać równomiernie w systemie, a zatem rozmieścić N wątków do przetwarzania wszystkich N wiadomości. Lubię myśleć o Disruptorze jako o skutecznym sposobie implementacji systemów podobnych do SEDA, w których wątki przetwarzają etapy. Oczywiście można mieć aplikację z pojedynczym etapem i wieloma równoległymi jednostkami wykonującymi tę samą pracę na każdym etapie, ale nie jest to w moim przekonaniu tak naprawdę. To całkowicie pomijałoby koszt wspólnego państwa.
  • Kradzież pracy - użyj tej opcji, gdy zadania mają różny czas trwania, a kolejność przetwarzania komunikatów nie jest ważna, ponieważ pozwala to wątkom, które są wolne i już zużyły swoje wiadomości, aby kontynuować postęp z kolejnej kolejki zadań. W ten sposób, jeśli na przykład masz 10 wątków i 1 jest blokowany w IO, reszta nadal będzie je przetwarzać.
+0

Dzięki za odpowiedź. Rozróżnij kilka dobrych dźwięków paradygmatu, niestety nie wiem, jaka jest różnica ostrości wiadomości od ostrości zadania. – DaveFar

+0

Zrobiłem projekt rozwiązania mojego problemu z zakłóceniami: jeden konsument notuje wpisy w (wielu) zakłóceniach z ich wartościami skrótu, inny konsument umieszcza je w lokalnej tablicy asocjacyjnej i notuje pozycje z flagą, czy były one w tablica hash już. To rozwiązanie może być szybsze, ale nie skaluje się liniowo pod względem liczby wątków, jak ma to miejsce w przypadku tablicy bez blokady.Kolejny destruktor, wdrażający FIFO dla wszystkich nowo utworzonych pozycji, ma wielu producentów, więc nie jestem pewien, czy dezruptor poprawia tę część implementacji. – DaveFar

+0

Btw, moje zadania mają z pewnością różny czas trwania, ale kolejność przetwarzania wiadomości jest nieco ważna ... – DaveFar

Powiązane problemy