duża liczba wątków
jerry - 20-11-2006 00:32
duża liczba wątków
Witam, Pisałem jakiś czas temu o projekcie aplikacji, teraz o szczegółach...
Projektuję system klient-server, który będzie monitorował sieć LAN/WAN. Upraszczając sprawę, server pinguje hosty (zarejestrowane w systemie) i zapisuje informację o ich stanie (odpowiedział/nie odpowiedział). Tworzy dzienny raport i agreguje dane przygotowując je do łatwego pobrania i wyświetlenia na webie przez klienta.
Problemy tkwią w liczbach: liczba hostów <= 10 000; Operacja PING trwa - serwery mogą odpowiedzieć po 20 ms, po 2 sek, albo też i wcale (zakładam, że czekam określony czas na odpowiedź). Stąd nie można tego badania zrobić w banalnej pętli - lecac po serwerach, dlatego, że badanie będzie co 10 min i może się okazać, że jedno się nie skończy, a drugie juz się zacznie - system sie zatka. Tu potrzeba wątków....
Wątki w javie. Dla każdego hosta utworzę nowy wątek w którym będę go badał. W takim wątku wyśle pinga, poczekam na odpowiedź (np. 5 sek), dokonam odpowiednich zapisów do bazy i zakończę wątek. Teraz pytanie, wątki będę tworzył w pętli i może ich być bardzo wiele (max 10 000). - Czy taka liczba wątków jest mozliwa? jak OS(np. linux) wpływa na liczbę wątków? Jakie są ograniczenia? - widze tu poważne wąskie gardło, może macie pomysł jak inaczej "rozgałęzić" tę aplikację? (procesy zamiast wątków?) - warunek: musi działać pod dowolnym OS. - istotny problem - przed rozpoczęciem badania wiele wątków utworzonych podczas ostatniego badania może jeszcze trwać!!! Stąd przed rozpoczęciem badania aplikacja musi sprawdzić czy jakieś wątki są "aktywne" i musi je zabić. Ale to też kapa, bo zabite wątki nie dokonają wpisów do bazy i będzie to tak jakby pominięto te hosty przy badaniu.... - może zainteresować się serwerem aplikacji (jboss) i na niego przerzucic calą pracę związaną z cyklicznym sprawdzaniem hostów ale nie wiem czy te problemy nie będa tam także obecne.
Z góry dziękuję za jakieś wskazówki
Bartek Jablonski - 20-11-2006 00:32
jerry wrote: > Problemy tkwią w liczbach: liczba hostów <= 10 000; Operacja PING trwa > - serwery mogą odpowiedzieć po 20 ms, po 2 sek, albo też i wcale > (zakładam, że czekam określony czas na odpowiedź). Stąd nie można tego > badania zrobić w banalnej pętli - lecac po serwerach, dlatego, że > badanie będzie co 10 min i może się okazać, że jedno się nie skończy, a > drugie juz się zacznie - system sie zatka. Tu potrzeba wątków....
> Z góry dziękuję za jakieś wskazówki
Poczytaj o pulach watkow (Thread pool), np:
http://www.informit.com/articles/art...p?p=30483&rl=1
W javie 1.5 masz juz pool out of the box
http://java.sun.com/j2se/1.5.0/docs/...ThreadPool(int)
Bartek
Krzysztof Rudnik - 20-11-2006 00:32
jerry wrote:
> Witam, > Pisałem jakiś czas temu o projekcie aplikacji, teraz o szczegółach... > > Projektuję system klient-server, który będzie monitorował sieć LAN/WAN. > Upraszczając sprawę, server pinguje hosty (zarejestrowane w systemie) i > zapisuje informację o ich stanie (odpowiedział/nie odpowiedział). Tworzy > dzienny raport i agreguje dane przygotowując je do łatwego pobrania i > wyświetlenia na webie przez klienta. > > Problemy tkwią w liczbach: liczba hostów <= 10 000; Operacja PING trwa > - serwery mogą odpowiedzieć po 20 ms, po 2 sek, albo też i wcale > (zakładam, że czekam określony czas na odpowiedź). Stąd nie można tego > badania zrobić w banalnej pętli - lecac po serwerach, dlatego, że > badanie będzie co 10 min i może się okazać, że jedno się nie skończy, a > drugie juz się zacznie - system sie zatka. Tu potrzeba wątków.... > > Wątki w javie. Dla każdego hosta utworzę nowy wątek w którym będę go > badał. W takim wątku wyśle pinga, poczekam na odpowiedź (np. 5 sek), > dokonam odpowiednich zapisów do bazy i zakończę wątek. Teraz pytanie, > wątki będę tworzył w pętli i może ich być bardzo wiele (max 10 000). > - Czy taka liczba wątków jest mozliwa? jak OS(np. linux) wpływa na > liczbę wątków? Jakie są ograniczenia? > - widze tu poważne wąskie gardło, może macie pomysł jak inaczej > "rozgałęzić" tę aplikację? (procesy zamiast wątków?) - warunek: musi > działać pod dowolnym OS. > - istotny problem - przed rozpoczęciem badania wiele wątków utworzonych > podczas ostatniego badania może jeszcze trwać!!! Stąd przed > rozpoczęciem badania aplikacja musi sprawdzić czy jakieś wątki są > "aktywne" i musi je zabić. Ale to też kapa, bo zabite wątki nie dokonają > wpisów do bazy i będzie to tak jakby pominięto te hosty przy badaniu.... > - może zainteresować się serwerem aplikacji (jboss) i na niego > przerzucic calą pracę związaną z cyklicznym sprawdzaniem hostów ale nie > wiem czy te problemy nie będa tam także obecne. > > Z góry dziękuję za jakieś wskazówki
Po co watki - tworzysz tablice hostow, do kazdego wysylasz request, i czekasz na odpowiedzi - o przyjdzie odpowiedz to oznaczasz w tablicy ze host dziala. Masz 2 mozliwosci zakonczenia - wszyscy odpowiedzieli, uplynal zadany czas. Problem tylko w tym jak realizujesz ten ping - przydaloby sie tak, by odpowiedzi dostawac na jeden socket z identyfikacja nadawcy, a wiec albo oryginalne ICMP (da sie przenosnie w javie?), albo cos po UDP. Requesty powinny byc numerowane, by jakas spozniona odpowiedz nie zostala potraktowana jako aktualna.
-- Krzysiek Rudnik
jerry - 20-11-2006 00:33
> Po co watki - tworzysz tablice hostow, do kazdego wysylasz request, > i czekasz na odpowiedzi - o przyjdzie odpowiedz to oznaczasz w tablicy > ze host dziala. Masz 2 mozliwosci zakonczenia - wszyscy odpowiedzieli, > uplynal zadany czas.
Co w przypadku, gdy upłynął czas po którym rozpoczyna się kolejne badanie? Badania będą się odbywać co 10 min. Jeżeli zbiorę sobie hosty do tablicy i będę po niej iterował to przy liczbie 10 000 hostów bardzo prawdopodobna jest sytuacja w której rozpocznie się kolejne badanie podczas gdy kolejne wciąż trwa. Co wtedy? Zakończyć stare badanie bez sprawdzania hostów, które pozostały? To nie może mieć miejsca. Musze zapewnić, że każdy host zostanie odpytany w kazdym badaniu. Przyszla mi do glowy inna mysl - zamiast watek dla kazdego badanego hosta...moze wystarczy wątek dla każdego badania?? !!
> Problem tylko w tym jak realizujesz ten ping - > przydaloby sie tak, by odpowiedzi dostawac na jeden socket z > identyfikacja nadawcy, a wiec albo oryginalne ICMP (da sie > przenosnie w javie?), albo cos po UDP. Requesty powinny byc numerowane, > by jakas spozniona odpowiedz nie zostala potraktowana jako aktualna.
Pytałem o to na tej grupie jakiś czas temu, gdyż na codzień nie używam javy. Polecono mi :
java 1.5: http://java.sun.com/j2se/1.5.0/docs/...dress.html#isR...)
+ http://www.rgagnon.com/javadetails/java-0093.html
Krzysztof Wolny - 20-11-2006 00:33
Krzysztof Rudnik napisał(a):
> Po co watki - tworzysz tablice hostow, do kazdego wysylasz request, > i czekasz na odpowiedzi -
po to, ze tak jak pytajacy napisal hostow moze byc do 10000, odpowiedz na ping moze trwac nawet kilka sek (nie wiem jak jest z metoda isReachable()), a odpytywanie ma byc co 600 sek...
-- ================================ Krzysztof Wolny
[ http://rtfm.bsdzine.org ][ http://tiny.pl/g776 ]
O: No bo normalnie to każdy czyta z góry na dół... P: Dlaczego ??? O: Pisanie nad cytatem ! P: Co należy do bardziej wkurzających obyczajów niektorych ludzi ?
A.R. - 20-11-2006 00:33
jerry: > Przyszla mi do glowy inna mysl - zamiast watek dla kazdego badanego > hosta...moze wystarczy wątek dla każdego badania?? !!
Skorzystaj z porady w pierwszej odpowiedzi - zaimplementuj albo skorzystaj z gotowej puli wątków. Stwórz tyle wątków ile Ci pasuje (10? 50? 100?). W pętli lecisz po hostah - pobierasz wątek i delegujesz do niego sprawdzenie danego hosta. Nie masz zwłoki pomiędzy kolejnymi hostami, a sprawdzenie może przebiegać dowolnie długo. Po sprawdzeniu wątek wraca do puli. Jeśli ping się przeciąga na zbyt wielu hostah - pula może się oczywiście wyczerpać. W tym momencie sam musisz zdecydować - czekasz czy coś się jednak zwolni, zwiększasz liczbę wątków w puli, czy ogłaszasz alarm. Tyle.
Pozdrawiam A.R.
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Krzysztof Rudnik - 20-11-2006 00:33
jerry wrote:
> >> Po co watki - tworzysz tablice hostow, do kazdego wysylasz request, >> i czekasz na odpowiedzi - o przyjdzie odpowiedz to oznaczasz w tablicy >> ze host dziala. Masz 2 mozliwosci zakonczenia - wszyscy odpowiedzieli, >> uplynal zadany czas. > > Co w przypadku, gdy upłynął czas po którym rozpoczyna się kolejne > badanie? Badania będą się odbywać co 10 min. Jeżeli zbiorę sobie hosty
To jest timeout
> do tablicy i będę po niej iterował to przy liczbie 10 000 hostów bardzo > prawdopodobna jest sytuacja w której rozpocznie się kolejne badanie > podczas gdy kolejne wciąż trwa. Co wtedy? Zakończyć stare badanie bez
Ale tylko wysylasz requesty, nie czekasz na odpowiedz. Na to potrzeba kilka sekund max.
> sprawdzania hostów, które pozostały? To nie może mieć miejsca. Musze > zapewnić, że każdy host zostanie odpytany w kazdym badaniu. > Przyszla mi do glowy inna mysl - zamiast watek dla kazdego badanego > hosta...moze wystarczy wątek dla każdego badania?? !! > >> Problem tylko w tym jak realizujesz ten ping - >> przydaloby sie tak, by odpowiedzi dostawac na jeden socket z >> identyfikacja nadawcy, a wiec albo oryginalne ICMP (da sie >> przenosnie w javie?), albo cos po UDP. Requesty powinny byc numerowane, >> by jakas spozniona odpowiedz nie zostala potraktowana jako aktualna. > > Pytałem o to na tej grupie jakiś czas temu, gdyż na codzień nie używam > javy. Polecono mi : > > java 1.5: > http://java.sun.com/j2se/1.5.0/docs/...dress.html#isR...) > > + http://www.rgagnon.com/javadetails/java-0093.html
Sprawdzilem te linki - wychodzi ze w javie nie da sie zaimplementowac opisanej przeze mnie metody - echo chodzi po TCP (trzeba by oddzielny socket dla kazdego polaczenia, ale chyba tez jest po UDP), poza tym pewnie rzadko ktory host ma to uruchomione. isReachable jest zaimplemetowane jako gotowa funkcja - nie da sie oddzielnie wyslac a oddzielnie czekac na odpowiedz, tak by mozna bylo jednym watkiem i jednym socketem realizowac kilka pingow rownoczesnie. Krotko mowiac tak jak w tym drugim linku jest napisane: "Socket class is not low-level enough for that operation" A jesli nie da sie rozdzielic wysylania i czekania na odpowiedz to zostaja watki.
-- Krzysiek Rudnik
Tomasz Woroniecki - 20-11-2006 00:33
To wszystko brzmi jak jakiś straszny overkill... Przypomina się powiedzenie: "jak się ma duży młotek to wszystko wygląda jak gwóźdź". A Java to duży młotek :)
Przede wszystkim w Javie nie da się ręcznie wysłać pakietu ICMP (takiego jak ping). Od 1.5 jest metoda java.net.InetAddress.isReachable(int), ale jak już pisano ona blokuje się, więc z nią to rzeczywiście jedyne rozwiązanie to tysiące wątków.
Rozwiązanie z ilością wątków równą ilości hostów jest odrażające, no ale tak się niestety stało, że w Javie to częste rozwiązanie (przed 1.4 jedyne). Pula wątków nie wnosi tu nic mądrego.
Oczywiste rozwiązanie, to już zaproponowane tu wcześniej - najpierw rozsyłamy do hostów jakieś pakiety i w miarę jak przychodzą odpowiedzi odhaczamy sobie, że dany host odpowiedział. Wystarczy tu dokładnie jeden wątek. Gdyby nie całe zamieszanie z Javą, to nikt by się nie pytał tylko robił tak od razu, ale jak już się ma ten młotek...;) Kluczem jest użycie asynchronicznej komunikacji sieciowej - java.nio., java.nio.channels. Niestety nie da się tak wysłać pakietu ICMP (bo w ogóle się nie da), więc ze standardowego pinga nici. Ale można sobie zdefiniować jakieś własne pakiety UDP, tylko na docelowych hostach musi być jakiś program, który na nie odpowie.
-- Tomasz Woroniecki
Krzysztof Wolny - 20-11-2006 00:34
Tomasz Woroniecki napisał(a):
> Rozwiązanie z ilością wątków równą ilości hostów jest odrażające, no ale tak > się niestety stało, że w Javie to częste rozwiązanie (przed 1.4 jedyne). > Pula wątków nie wnosi tu nic mądrego.
wlasnie wnosi bo pula sluzy temu by ilosc watkow nie byla rowna ilosci zadan... owszem, potrwa to troche dluzej niz majac tyle watkow ile hostow, ale to ejst IMHO rozsadny kompromis wlasnie.
-- ================================ Krzysztof Wolny
[ http://rtfm.bsdzine.org ][ http://tiny.pl/g776 ]
O: No bo normalnie to każdy czyta z góry na dół... P: Dlaczego ??? O: Pisanie nad cytatem ! P: Co należy do bardziej wkurzających obyczajów niektorych ludzi ?
Tomasz Woroniecki - 20-11-2006 00:34
Krzysztof Wolny wrote:
> wlasnie wnosi bo pula sluzy temu by ilosc watkow nie byla rowna ilosci > zadan... owszem, potrwa to troche dluzej niz majac tyle watkow ile hostow, > ale to ejst IMHO rozsadny kompromis wlasnie.
No dobra, zgadzam się, że może być to użyteczne. Rzeczywiście, przy 100 wątkach i 10000 hostów badanie będzie trwać 100 razy dłużej niż badanie 1 hosta (czyli powiedzmy 100 * 6 sekund= 10 minut, do zaakceptowania, chociaż trzeba by jednak więcej wątków).
Po prostu uważam za błędne rozwiązanie z wątkami jak i podejście pytającego, który w lesie nie widzi drzew (cyt. "[...]system sie zatka. Tu potrzeba wątków....", jakby z nimi to się nie miał nigdy zatkać).
Gdyby pisał taki program w C, to nawet do głowy by mu nie przyszły żadne wątki, tylko zrobiłby jedną pętlę z asynchronicznym wysyłaniem i odbieraniem pakietów. Program byłby w stanie wysłać 10000 pakietów w mniej niż sekundę pewnie, po następnych sześciu byłby już koniec całego badania.
-- Tomasz Woroniecki
Krzysztof Wolny - 20-11-2006 00:34
Tomasz Woroniecki napisał(a): > Krzysztof Wolny wrote: > >> wlasnie wnosi bo pula sluzy temu by ilosc watkow nie byla rowna ilosci >> zadan... owszem, potrwa to troche dluzej niz majac tyle watkow ile hostow, >> ale to ejst IMHO rozsadny kompromis wlasnie. > > No dobra, zgadzam się, że może być to użyteczne. Rzeczywiście, przy 100 > wątkach i 10000 hostów badanie będzie trwać 100 razy dłużej niż badanie 1 > hosta (czyli powiedzmy 100 * 6 sekund= 10 minut, do zaakceptowania, chociaż > trzeba by jednak więcej wątków).
> Po prostu uważam za błędne rozwiązanie z wątkami jak i podejście pytającego, > który w lesie nie widzi drzew (cyt. "[...]system sie zatka. Tu potrzeba > wątków....", jakby z nimi to się nie miał nigdy zatkać).
moze mowiac 'zatka' mial na mysli ze nei zdazy odpytac po kolei hostow, przed nastepnym odpytaniem.
> Gdyby pisał taki program w C, to nawet do głowy by mu nie przyszły żadne > wątki, tylko zrobiłby jedną pętlę z asynchronicznym wysyłaniem i > odbieraniem pakietów. Program byłby w stanie wysłać 10000 pakietów w mniej > niż sekundę pewnie, po następnych sześciu byłby już koniec całego badania.
ok, ale ping dziala 'nizej' niz java (tcp,udp) :)
-- ================================ Krzysztof Wolny
[ http://rtfm.bsdzine.org ][ http://tiny.pl/g776 ]
O: No bo normalnie to każdy czyta z góry na dół... P: Dlaczego ??? O: Pisanie nad cytatem ! P: Co należy do bardziej wkurzających obyczajów niektorych ludzi ?
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Czy duza jest roznica miedzy Corel Draw Graphic Suite X3 ENG Box Upgrade a Corel Draw Graphic Suite 11?
Liczba =?ISO-8859-2?Q?odpowiadaj=B1cych_rekord=F3w_z_drugi?==?ISO-8859-2?Q?ej_tabeli?=
Jak wciągnąć dużą porcję danych do bazy danych Oracle 10 g Express
duża baza open source - szukam doświadczonych
Ciekawe kompozycje z duza grafika na stronie glownej...
[Sybase ASA 7.0.2] linux 2.6 - liczba procesow przy starcie servera?
Zapytanie - duża ilość danych - rozwiązania
[MySQL] Duza ilosc Aborted_clients
MySQL zabiera dużą ilośc RAM'u - dlaczego ?
Bardzo duza ilosc danych i ich analiza
zanotowane.pldoc.pisz.plpdf.pisz.plmarcelq.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|