ďťż
 
duża liczba wątków ďťż
 
duża liczba wątków
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • marcelq.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com