Toon posts:

[java]meer dan 800 sockets open...out of mem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met het verbouwen van de freeware socketserver AquaServer...een nogal simpel servertje, naar een socket broadcast server. dit voor een flash project.

Ik heb nu een test flash die 2000 connecties naar de server opent. Helaas crashed de dikke machine (ja, echt een dikke machine) al gauw (rond de 800 verbindingen) met de volgende melding :

Java:
1
2
java.lang.OutOfMemoryError
Exception in thread "main" java.lang.OutOfMemoryError


Java:
1
2
3
4
5
6
7
8
9
10
java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 744
        at java.util.Vector.remove(Vector.java:796)
        at AquaServer.deleteClient(aquaserver.java:115)
        at AquaClientThread.run(aquaserver.java:210)
        at java.lang.Thread.run(Thread.java:536)
java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 54
        at java.util.Vector.remove(Vector.java:796)
        at AquaServer.deleteClient(aquaserver.java:115)
        at AquaClientThread.run(aquaserver.java:210)
        at java.lang.Thread.run(Thread.java:536)


Dit doet hij ook als hij niet eerst out of memory had. At random lijkt hij referenties naar clientThreads vallen uit de vector ClientList. Deze referenties blijven vervolgens hard staan......

Hier de volgens mij belanrijkste code:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class AquaServer {
    static Vector clientList= new Vector();
    static Vector adminList= new Vector();
                [......]
    public static void main(String[] args) throws IOException {

        if (args.length >= 2){
             [...]

            serverSocket = new ServerSocket(worldPort.intValue());
            tempCommand = new CommandReader();
            tempCommand.start();
            while (listening){
                try{
                tempClient = new AquaClientThread(serverSocket.accept());
                clientList.add(tempClient);
                tempThread = new Thread(tempClient);                    
                tempThread.start();
            }

    static void deleteClient(AquaClientThread deadClient){
        int num;
        num=clientList.indexOf(deadClient);
        clientList.remove(num);
    }

}


Aangezien beiden fouten alleen bij hogere volumes plaatsvinden lijkt het een pure performance issue. Iemand enig idee?

Code is erg geknipt, en zal ook zo niet compileren. Gaat er eigenlijk om dat ik allen wil laten zien welke techniek ik gebruik. Ik heb zo'n gevoel dat er een hoop fout gaat in de clientlist vector. Aangezien beide errors daaraan gerelateerd lijken te zijn. Ik vraag me af of er een manier is om efficienter de verbindingen bij te houden. Ik vraag me dan ook meer af waarom dit al in elkaar klapt op een miezerige 800 verbindingen op toch een redelijke zware sun bak (op een 155Mbit lijn).

[ Voor 80% gewijzigd door Verwijderd op 18-06-2003 16:27 . Reden: knip knip ]


  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
Als je zou opvangen wanneer een client de connectie verbroken heeft, zou je de socket kunnen sluiten natuurlijk ... :)

Wanneer de socket gesloten is, zal de Garbage Collector de nodige geheugenruimte terug vrijgeven.

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


Verwijderd

Topicstarter
Feyd-Rautha schreef op 18 June 2003 @ 15:46:
Als je zou opvangen wanneer een client de connectie verbroken heeft, zou je de socket kunnen sluiten natuurlijk ... :)

Wanneer de socket gesloten is, zal de Garbage Collector de nodige geheugenruimte terug vrijgeven.
Inderdaad, dat doe ik al, maar die code zit in de client class, die ik hier niet heb neer gezet.
Daarnaast heb ik het nu over het in klappen na 800 verbindingen, terwijl ik toch wel hoop om er 5000 simultaan te openen (en open te houden). Die 800 verbindingen klappen al gelijk.

Curry, thanx for reopening.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

offtopic:
B-Top, thnx for inkorten ;)

Professionele website nodig?


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
Verwijderd schreef op 18 juni 2003 @ 16:23:
[...]
Inderdaad, dat doe ik al, maar die code zit in de client class, die ik hier niet heb neer gezet.
Daarnaast heb ik het nu over het in klappen na 800 verbindingen, terwijl ik toch wel hoop om er 5000 simultaan te openen (en open te houden). Die 800 verbindingen klappen al gelijk.
Das nou gek - heb NET (ie 5 minuten) geleden ook AquaServer gedowned om ook een XMLSocket serverke te schrijven. Ik heb het nog niet kunnen testen maar 5000! connections tegelijkertijd zul je toch maar beter niet met een Thread/Connection oplossen - sommige VM laten zoveel connections niet eens toe. Voor zulke heel high performance gedoe (die Unity van Moock bijvoorbeeld) zou ik NIO gebruiken met non-blocking sockets etc... Als ik iets ontdekt in de code laat ik het je alvast weten... (het complete lack aan synchronised in AquaServer is al erg weird vind ik)

edit:
mail me voor een goed boek erover... ik ga het niet doen want my needs ar not so big...

[ Voor 5% gewijzigd door hobbit_be op 18-06-2003 17:29 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Uhm idd zie nu pas dat je een thread per client opent. Vrijwel geen enkel OS gaat probleemloos een 800 threads in 1 process toelaten, dat is gewoon vragen om resourceproblemen. Je kunt idd beter met minder threads afhandelen.

Professionele website nodig?


Verwijderd

Topicstarter
Tsjaa, als flashcoder ga je wat simpel denken he :) Zeker als je de slag ActionScript -> Java doet :) Ik zag hem dus ook niet. Unity is niet echt high perf, die roepen alleen maar > 500 Users. Wat een te laag aantal is. Commserver is geen optie (flash 5), dus ik moet een simpel socket servertje proberen zover te krijgen +5000 connecties te laten openen :) Synchronised in Aquaserver ontbreekt idd ja, had met al redelijk ingelezen, en begreep the use, maar lack in Aqua niet. AquaServer stelt dan ook niet zo veel voor.

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
Verwijderd schreef op 18 juni 2003 @ 17:32:
dus ik moet een simpel socket servertje proberen zover te krijgen +5000 connecties te laten openen :)
zul je vast NIO moeten gebruiken en dan nog... 5000 is echt wel veel (maar't hangt ervan wat ze doen natuurlijk) moet je die NIO boek hebben?

Verwijderd

Topicstarter
Ik kon je mail adres niet vinden in je nogal lege profiel :)

Het doel van de server is simple; hij moet enkele admin clients kunnen ontvangen op poort x, en dit dan broadcasten naar alle poorten op poort y. De (flash) clients op poort y, hoeven in principe dus alleen maar de broadcasts op te vangen.
Leek mij dus vrij simpel om Aqua te modificeren tot dit doel (is dan ook gelukt, zij het dan op max 881 poorten). Ik heb net zitten lezen over dat NIO, en aangezien dit dus de solution is tot het loskoppelen clients->threads verhaal, errug interresant; nu maar hopen dat ik het een beetje snel kan oppikken, het moet nl. binnen 2 weken af :)

Verwijderd

Topicstarter
Erg goede tip hobbit :

http://developer.java.sun...calArticles/releases/nio/

Erg blij mee. Hoop dat ik er wijs uit kan :)

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
Had ik al gelezen - maar voorlopig en voor mij is NIO beetje overkill

ben er net in geslaagd om met FlashMX een chat serverke te bouwen - en tot mijn verbazing moet je helemaal geen XML doorgeven: gewone tekst kan ook - heel erg goed voor een game waar alles 'telt' (ie hoe minder hoe sneller).

Wel erg rot is dat ik er nog niet achter ben gekomen wanneer de client sluit (ie ik sluit de browser) dat de socket 'closed' - maar dat is aan de Java Klant...

Laat weten hoe het zit met NIO / die Aqua geval is zo 'unsafe' als wat...

Verwijderd

Topicstarter
Tekst kan idd ook, zolang je netjes afsluit... :)

Owen en ik zijn daar een jaar of wat geleden mee bezig geweest, toen hebben we met aqua een nieuw protocollotje zitten verzinnen :) soort xml-rpc, maar dan zonder de xml :)
Pagina: 1