Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako odglaviti soket???

[es] :: Java :: Kako odglaviti soket???

[ Pregleda: 3425 | Odgovora: 16 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

anon315

Član broj: 315
Poruke: 1657
*.mediaworksit.net.



+13 Profil

icon Kako odglaviti soket???18.06.2007. u 08:50 - pre 204 meseci
Javisti,

imam jedan problem koji moram hitno da resim, evo o cemu se radi:

Necu puno da davim sa nepotrebnim detaljima, ali samo da ukratko upoznam sa pricom:

Radim projekat iz grid computinga u Javi. U pitanju je distribuirana obrada slike i u pitanju je iterativni problem (bitno!). Imam 3 tipa masina: server, korisnicke masine i nodove koji rade posao. Scenario je ukratko ovakav - korisnicke masine serveru posalju sliku, server od toga napravi posao i napravi podposlove i strpa ih u distribuiranu torbu podposlova. Iz te torbe nodovi uzimaju podposlove, rade podposao i vracaju nazad.

E sad, sta je problem("citiram sam sebe"):

"
Naime, posao je podeljen na gomilu podposlova. Moji nodovi su poprilicno glupe masine koje rade po protokolu tipa: daj mi podposao, radim, evo ti nazad uradjen podposao. Kako su mi trenutni poslovi poprilicno mali i node ih brzo uradi dolazi do takvog scenarija gde se velikom brzinom odvija komunikacija gde node dobija podposao koji je relativno veliki (ima celu sliku za tu iteraciju), i skoro momentalno vraca nazad rezultat i tako stalno. Posle nekoliko takvih razmena, node posalje rezultat, ali ga server ne primi i tako mi se sistem zaglavi. Posle nekog vremena eksperimentisanja dosao sam do sleceg zakljucka: soket (ObjectOutputStream) se nekako zaglavi posle takvog cimanja i podaci vise ne mogu da se salju. Problem sam "resio" tako sto sam nodu stavio Thread.sleep(100), odnosno pustio ga da ceka 100ms posto uradi posao, pa tek onda da posalje rezultat. U toj varijanti, stvar funkcionise, doduse za relativno mali broj iteracija. Cim se broj iteracija poveca, opet se zaglavi, samo malo kasnije. Za potrebe testiranja ovo mi je ok, medjutim, na kraju moram da imam resen ovaj problem. Verujem da je resenje prosto i da nekako treba da procistim/odglavim stream. Nije u pitanju problem flushovanja, posto su mi podaci ionako veliki, mada sam i sa tim probao (flushovao stream posle svakog upisa).

Dakle, potrebno mi je resenje da node NISTA ne ceka posto uradi posao, a da stvar radi - kako odglaviti socket???
"

Ako je potrebno jos infoa, recite, mada mi se cini da je ovo neki tipican problem?

V
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.mediaworksit.net.



+13 Profil

icon Re: Kako odglaviti soket???18.06.2007. u 08:59 - pre 204 meseci
E da - kada imam ogroman broj iteracija - desava mi se outofmemoryerror!
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.mediaworksit.net.



+13 Profil

icon Re: Kako odglaviti soket???18.06.2007. u 09:26 - pre 204 meseci
Upravo sam saznao da se problemi desavaju kada se pokusa slanje istog objekta preko ObjectOutputSteama, jer on kesira objekte. I onda nece da posalje. Kod mene je to realna situacija - u nekom tenutku ce posao dobiti isti podposao, odraditi neku drugu iteraciju i pokusati da posalje nazad i tad ne uspe. Ono sto mi nije jasno, je kako je onda server uspeo da posalje drugi put isti objekat, a node to ne moze.

Resenje koje se predlaze je da se zove reset(), medjutim to je skupa operacija. Pokusao sam i sa tim - svaki put sam radio reset pre upisa, a probao sam i reset posle upisa i u oba slucaja imam isti problem?
 
Odgovor na temu

hyle
Perica Milošević
Belgrade

Član broj: 30030
Poruke: 150
82.117.206.*

Sajt: www.linkedin.com/in/peric..


+4 Profil

icon Re: Kako odglaviti soket???18.06.2007. u 09:44 - pre 204 meseci
Da nije problem na strani servera koji nije u stanju da primi ono što mu nod šalje?

Daj još neki info...
Kako je implementirana ta distribuirana torba poslova, mislim na onaj deo "distribuirana"?
Gde se dešava out of memory?
Šta server radi kada dobije obrađeni posao od noda, da se ne zaglavi on u nekoj obradi?
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.mediaworksit.net.



+13 Profil

icon Re: Kako odglaviti soket???18.06.2007. u 10:08 - pre 204 meseci
Citat:
Da nije problem na strani servera koji nije u stanju da primi ono što mu nod šalje?


Pa izgleda da je upravo to problem, jer debugovanjem sam utvrdio da node definitivno POSALJE i onda ceka sledeci posao. Sa druge strane, server je skapirao da ovaj hoce da mu salje (primio je "put" komandu) i onda je onda je pokusao da cita i tu se blokirao, dakle kao da mu ovaj nista nije poslao, a jeste!

Citat:
Kako je implementirana ta distribuirana torba poslova, mislim na onaj deo "distribuirana"?


Interno koristim ArrayList, a obmotao sam ga svojom klasom koja je sinhronizovana. Torba ekstenduje tu obmotanu klasu i ima jos neke funkcionalnosti. Postoji jedna instanca i nju drzi NodeServer da iz nje moze da vadi i da trpa. E sad, kada se pojavi novi node, NodeServer kreira nit za njega i oni onda imaju svoj prtokol price. Taj serverski protokol je dobio referencu na tu torbu. Protokol je takav da kada ovaj node kaze put, nodeserver protokl iscita ono sto je doslo i onda nesto radi, a kada kaze get, nadje posao i vrati mu ga. Dakle, distribuirana je samo termin koji oznacava da se torba nalazi na serveru, a da svi nodovi mogu da rade sa tom torbom. Realizovao sam preko postanskih sanducica, razmena poruka..

Citat:
Gde se dešava out of memory?


Na ovo jos ne mogu da ti odgovorim jer mi je za sada jedna masina glumila i server i node :)

Da ne bude zabune, problem zaglavljivanja mi se desio i kada sam imao to na odvojenim masinama, doduse tada se nije desio outofmemoryerror, pa zato ne znam gde puce, a nisam dobro pogleda stacktrace :D

Citat:
Šta server radi kada dobije obrađeni posao od noda, da se ne zaglavi on u nekoj obradi?


Tu se radi gomila nekog posla, server onda pretumbava i azurira neka stanja, prebacuje u neke druge torbe itd, ali cini mi se da to uopste nije bitno, jer u mojoj situaciji server to uspe da uradi i onda POSALJE novi podsposao (dakle nije se zaglavio), node to opet primi i vrati, ali onda ovaj slepac od servera nece da primi. Znaci, nije se on zaglavio zbog toga sto nije umeo da odradi nesto sa prvim vracenim poslom, jer je uspeo da posalje drugi i uspeo da shvati da ovaj oce opet drugi put da mu vrati rezultat.

E da, i ono sto je bitno je da kada je frekvencija razmene manja (Thread.sleep na nodu posle uradjenog posla), ovo radi!!??

[Ovu poruku je menjao Vanja Petreski dana 18.06.2007. u 11:22 GMT+1]
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.mediaworksit.net.



+13 Profil

icon Re: Kako odglaviti soket???18.06.2007. u 11:48 - pre 204 meseci
EUREKAAAA!!!!

Izgleda da mi je talija kada posaljem pitanje na ovaj forum. Obicno onda brzo resim problem :))

Iskreno, ne razumem zasto sada radi, ali sam intuitivno probao i usralo me :))

Protokol koji zaglavljuje:

Server salje nodu objekat
Node salje serveru tekst (put komanda)
Node salje serveru objekat

Protokol koji ne zaglavljuje:

Server salje nodu objekat
Node salje serveru tekst (put komanda)
Server salje nodu tekst (dummy tekst)
Node salje serveru objekat

Na ovaj nacin sam razbio dva uzastopna slanja u smeru node > server (tekst, pa objekat) i sada imamo protokol ja tebi ti meni ja tebi ti meni, a ne ja tebi ti meni ti meni...

Ako neko moze da objasni ovaj fenomen?

Perice, sad mogu da ti kazem gde se desava out of mem err: na serveru - kad mu dam sliku od 5 mb, na kraju kad treba da snimi sliku, on pukne, probacu da prepodesim alokaciju heapa, mada mi smrdi na nesto gadno, ne znam gde to curi memorija..

I sada, sarajuci po internetu sam naucio i nesto novo, a to je da oos kada mu opet saljes isti objekat, samo izmenjen, onaj tamo ko cita ce da dobije stari, to bi znacilo da moram da radim reset() svaki put? Jel to dobro? Jel to da radim pre ili posle upisa? Kakva je to prica, jel neko vise upucen?

V
 
Odgovor na temu

Dejan Lozanovic
Dejan Lozanovic
Beograd

Član broj: 691
Poruke: 2325
*.dynamic.sbb.co.yu.

Jabber: null@elitesecurity.org
Sajt: speedy-order.com


+75 Profil

icon Re: Kako odglaviti soket???18.06.2007. u 11:56 - pre 204 meseci
A mozda neki drugi (de)serializer objekata da probas da koristis :)
npr http://xstream.codehaus.org/
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.mediaworksit.net.



+13 Profil

icon Re: Kako odglaviti soket???18.06.2007. u 12:13 - pre 204 meseci
E pa to je fenomenalno, samo sto mi je sada malo kasno da ga ubacujem u pricu. Video sam kako prebaci u xml nesto sto ima proste tipove.

Ali kako ce izgledati xml ako imam na primer u objekti koji serijalizujem int[][] ili nesto kompleksnije?

Mada ukoliko ne budem mogao da se izvucem sa resetom i (ne)slanjem izmenjenih objekata, probacu sa tim ;)

Btw, resio sam problem pucanja memorije na serveru tako sto sam VMu da argumente -Xms128m -Xmx512m ;)
 
Odgovor na temu

sanchi
Sanja Jokic
Beograd

Član broj: 148256
Poruke: 104
*.cisco.com.



+8 Profil

icon Re: Kako odglaviti soket???18.06.2007. u 12:32 - pre 204 meseci
Kasno sam videla temu, a i vidim da si uglavnom resio.

Samo sam htela da ti predlozim da za razvrstavanje poslova mozda mozes da iskoristis BlockingQueue, LinkedBlockingQueue, ili neku drugu od slicnih vec postojecih sinhronizovanih javinih klasa, umesto da interno sam sinhronizujes pristup ArrayList objektu.
If people were meant to pop out of beds we would all sleep in toasters.
Google is your friend http://justfuckinggoogleit.com/
 
Odgovor na temu

hyle
Perica Milošević
Belgrade

Član broj: 30030
Poruke: 150
82.117.206.*

Sajt: www.linkedin.com/in/peric..


+4 Profil

icon Re: Kako odglaviti soket???18.06.2007. u 13:42 - pre 204 meseci
Citat:
Vanja Petreski:
Ako neko moze da objasni ovaj fenomen?

Pretpostavljam da na strani noda prvo čitaš neki String iz stream-a pa tek onda čitaš objekat. Da li je to u pitanju?

Da se nadovežem na sanchi, BlockingQueue bi ti omogućio da paralelno rade server (kreiranje podposlova) i nodovi (obrada podposlova) ali o tome razmišljaj tek ako ti ova varijanta radi dobro ali nisi zadovoljan performansama.
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.mediaworksit.net.



+13 Profil

icon Re: Kako odglaviti soket???18.06.2007. u 13:53 - pre 204 meseci
Ne, nego prvo saljem neki string, pa onda citam.

Pa meni server i radi paralelno sa nodovima, posto su to odvojene masine!
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.mediaworksit.net.



+13 Profil

icon Re: Kako odglaviti soket???18.06.2007. u 14:59 - pre 204 meseci
Dejane, probao sam xstream bez ikakvog dubokog zalazenja i video da moze da serijalizuje sta god mu das, deluje odlicno.

Probacu veceras da prebacim sistem na xstream da vidim kako to radi. Onda bi prakticno imao slanje cistih stringova koji bi se posle pretvarali u objekte.

Btw, cuo sam da je xml standard za razmenu poruka u mrezi..
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.adsl-1.sezampro.yu.



+13 Profil

icon Re: Kako odglaviti soket???18.06.2007. u 18:03 - pre 204 meseci
Deki imas pivo od mene!!! :)

Presao sam kompletno na xstream i potpuno sam izbacio objektne strimove iz sistema. Stvar je sada cista da cistija ne moze biti. Kroz mrezu mi samo ide XML (cisti stringovi), a krajnje tacke koriste Xstream da dobiju objekat. Nema vise zezanja sa memorijom, nema vise dovijanja sa oos-om, nema vise reseta (koji je UBI BOZE spor). Stvar prosto funkcionise!!

Thanx

V
 
Odgovor na temu

wiretap

Član broj: 149251
Poruke: 2
*.attribute.co.yu.



Profil

icon Re: Kako odglaviti soket???19.06.2007. u 09:18 - pre 204 meseci
Socket koji se zaglavio u sustini ne mozes "odglaviti" ako koristis blocking IO u Javi, ili nekom drugom jeziku. Pogledaj NIO, non-blocking IO koji pruza teoretsku mogucnost da pomocu jedne niti opsluzis sve zahteve dok je to nemoguce sa blocking IO.

Moreover, posto je u pitanju grid sistem, tj server-to-server komunikacija, naravno mozes uvek koristiti low-level alate (TCP -> RMI -> JMX u povecanom nivou apstrakcije) ali je preporucljivo da se koriste group-membership protokoli, po mogucnosti asinhroni sa mcast mogucnostima. Pogledaj alat JGroups koji handluje sve potrebne stvari oko grid computinga (garantovani delivery, once and only once receival etc).

Ovo naravno preporucujem jer povecava produktivnost.

Edit: naravno ti i dalje mozes da koristis XStream on top of jGroups jer on tretira sadrzaj poruke kao niz of uninterpreted bytes, i da ne spominjem da ima mogucnost message throttling-a, message splitting-a etc etc. vredan da se pogleda
 
Odgovor na temu

Dejan Lozanovic
Dejan Lozanovic
Beograd

Član broj: 691
Poruke: 2325
*.dynamic.sbb.co.yu.

Jabber: null@elitesecurity.org
Sajt: speedy-order.com


+75 Profil

icon Re: Kako odglaviti soket???19.06.2007. u 11:41 - pre 204 meseci
Citat:
Vanja Petreski: Deki imas pivo od mene!!! :)

Presao sam kompletno na xstream i potpuno sam izbacio objektne strimove iz sistema. Stvar je sada cista da cistija ne moze biti. Kroz mrezu mi samo ide XML (cisti stringovi), a krajnje tacke koriste Xstream da dobiju objekat. Nema vise zezanja sa memorijom, nema vise dovijanja sa oos-om, nema vise reseta (koji je UBI BOZE spor). Stvar prosto funkcionise!!

Thanx

V


Nisam ljubitelj piva :), ali dogovoricemo se :), jedina mana koju ja imam sa xstreamom su properties, zeleo bih da prilikom alias-a dodeljujem ime propertija i klasu za koju treba taj alijas da radi a ne sada kako je trenutno da dodeljujes ime promenljive i klasu i da to radi globalno za sve klase. Ostalo je super, nadam se da si video da je sam streamer ima fasadu nad gomilom biblioteka za parsiranje, iz prakse sam video da je ona njihova koju po defaultu koriste najbrza , pa samo xstreamov i defaultni jar guraj uz depoly :) resto ti ne treba. Inace

XStream je tako pokvaren alat do bola :) da jednostavno ako zelis mozes da anuliras Singleton patern :), i jos grdja stvar objekte tudjih klasa za koje mozda i nemas source mozes da promenis u letu :), Happy hacking sto bi rekli.
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.mediaworksit.net.



+13 Profil

icon Re: Kako odglaviti soket???19.06.2007. u 13:06 - pre 204 meseci
A da te pitam jos nesto. Kad imam ogroman objekat (reda velicine 5 mb), klasican poziv toXml(Obj o) mi pukne, prosto ne moze da uradi. E onda ja razbijam objekat na neke manje, pa vise puta radim poziv toXml(). Medjutim, ovo mi degradira performanse. Video sam da ima pisanje i u writer i obrnuto iz readera, ali to je takodje sporo.

Dakle, kako se boris sa serijalizacijom/deserijalizacom u xml (string) kada imas ogromne objekte??

V
 
Odgovor na temu

Dejan Lozanovic
Dejan Lozanovic
Beograd

Član broj: 691
Poruke: 2325
*.dynamic.sbb.co.yu.

Jabber: null@elitesecurity.org
Sajt: speedy-order.com


+75 Profil

icon Re: Kako odglaviti soket???19.06.2007. u 18:21 - pre 204 meseci
hmm mozda ne moze sam xml parser da proguta tako veliki xml, probaj neku drugu fasadu da iskoristis. imas tamo na sajtu medju 2 minute tutorial ako se dobro ne varam.
 
Odgovor na temu

[es] :: Java :: Kako odglaviti soket???

[ Pregleda: 3425 | Odgovora: 16 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.