Avatar billede tuidoi Nybegynder
21. januar 2011 - 17:41 Der er 15 kommentarer og
1 løsning

Java Server, der kan håndterer mange klienter?

Hej Eksperter

Jeg er igang med at opsætte en Java server.

Lige nu har jeg lavet en simpel implementering som via socket opretter en tråd pr. klient, men når jeg forbinder mange klienter er det noget skidt. Der bruges alt for meget hukommelse, som begrænser antallet af klienter ret meget.

Hvordan anbefaler i, at man strukturerer sin server, så den bliver så effektiv så muligt og kan have så mange klienter som muligt forbundet på samme tid?

På forhånd mange tak for hjælpen.
Avatar billede arne_v Ekspert
21. januar 2011 - 18:02 #1
En tråd per klient bruger en del memory. Men løsningen burde være god nok til nogle få hundrede klienter.

Har du fundet -Xss parameteren?
Avatar billede arne_v Ekspert
21. januar 2011 - 18:03 #2
Skal du højere op end et par hundrede skal du droppe en tråd per client.

Det kan enten gøres med TCP og brug af NIO.

Eller ved at skifte fra TCP til UDP.
Avatar billede tuidoi Nybegynder
21. januar 2011 - 22:37 #3
Nej jeg har ikke fundet -Xss parameteren. - Ved ikke hvad det er?

Det er vigtigt, at jeg anvender TCP, da pakken skal nå frem. Og gider ikke selv at implementerer dette ovenpå UDP.

Hvordan fungerer TCP og brug af NIO?

Og hvor mange klienter estimerer du det er muligt at få denne VPS 512 server: http://surftown.dk/vps  til at håndterer?

Jeg ville gerne højt op, men har ikke rigtig noget begreb om hvor meget hardware der skal til for at servicerer lad os sige 1000 klienter?
Avatar billede arne_v Ekspert
21. januar 2011 - 22:45 #5
512 MB og 1 core burde godt kunne køre nogle hundreder tråde, hvis ikke du sviner med resourcerne.
Avatar billede tuidoi Nybegynder
21. januar 2011 - 23:05 #7
Har læst lidt om MINA. Det virker som om at det er et framework som kan håndterer det.
http://mina.apache.org/features.html
Tror du man skal satse på disse? eller er det bedre at starte fra scratch selv?
Avatar billede tuidoi Nybegynder
21. januar 2011 - 23:09 #8
Et andet spørgsmål, hvis jeg anvender NIO på serveren, så skal Clienten også kunne håndterer NIO ikk? der kan jeg ikke bare bruge standard TCP ?
Avatar billede arne_v Ekspert
22. januar 2011 - 02:09 #9
Client kan bare bruge helt normal IO. NIO og IO sender/læser det samme - forskellen er rent internt i app.

Med IO laver man reads som blocker indtil der er noget.

Med NIO kan man spørge hvilke af en liste af forbindelser der har noget data klar til læsning.
Avatar billede arne_v Ekspert
22. januar 2011 - 02:16 #10
Mina encapsulater NIO og thread pool.

Jeg vil tro at det kan spare dig for at skrive noget kode.

Et alternativ til Mina er Netty:
  http://www.jboss.org/netty

Mit forslag vil være at du laver en lille prototype i 3 versioner:
  - med standard NIO
  - med Mina
  - med Netty

Hvis din app er tilpas simpel, så kan det godt være at det slet ikke giver mening at tilføje et bibliotek oven på standard Java NIO.
Avatar billede tuidoi Nybegynder
22. januar 2011 - 16:41 #11
lig et svar arne :)

Jeg valgte netty, da det var rimelig simpelt at finde rundt i og det virker som om deres community er lidt mere aktivt end Minas, så er det nemmere at hente hjælp på diverse forummer.

Også fandt jeg også et andet smart API som hedder ADBCJ til at håndterer en eventuel database senere, men ærgeligt det ikke er helt færdig endnu.
Avatar billede arne_v Ekspert
22. januar 2011 - 16:50 #12
svar
Avatar billede tuidoi Nybegynder
22. januar 2011 - 17:07 #13
Det er underligt, når jeg kører min test, så failer den ved klient nr 493 hvergang. og kommer med denne fejl:



WARNING: Unexpected exception from downstream.
org.jboss.netty.channel.ChannelException: Failed to create a selector.
    at org.jboss.netty.channel.socket.nio.NioClientSocketPipelineSink$Boss.register(NioClientSocketPipelineSink.java:190)
    at org.jboss.netty.channel.socket.nio.NioClientSocketPipelineSink.connect(NioClientSocketPipelineSink.java:153)
    at org.jboss.netty.channel.socket.nio.NioClientSocketPipelineSink.eventSunk(NioClientSocketPipelineSink.java:103)
    at org.jboss.netty.channel.Channels.connect(Channels.java:541)
    at org.jboss.netty.channel.AbstractChannel.connect(AbstractChannel.java:218)
    at org.jboss.netty.bootstrap.ClientBootstrap.connect(ClientBootstrap.java:227)
    at org.jboss.netty.bootstrap.ClientBootstrap.connect(ClientBootstrap.java:188)
    at nettyMultiEcho.EchoClient.<init>(EchoClient.java:74)
    at nettyMultiEcho.EchoClient.main(EchoClient.java:94)
Caused by: java.lang.OutOfMemoryError: Direct buffer memory
    at java.nio.Bits.reserveMemory(Unknown Source)
    at java.nio.DirectByteBuffer.<init>(Unknown Source)
    at java.nio.ByteBuffer.allocateDirect(Unknown Source)
    at sun.nio.ch.Util.getTemporaryDirectBuffer(Unknown Source)
    at sun.nio.ch.IOUtil.write(Unknown Source)
    at sun.nio.ch.SocketChannelImpl.write(Unknown Source)
    at sun.nio.ch.PipeImpl$Initializer.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.nio.ch.PipeImpl.<init>(Unknown Source)
    at sun.nio.ch.SelectorProviderImpl.openPipe(Unknown Source)
    at java.nio.channels.Pipe.open(Unknown Source)
    at sun.nio.ch.WindowsSelectorImpl.<init>(Unknown Source)
    at sun.nio.ch.WindowsSelectorProvider.openSelector(Unknown Source)
    at java.nio.channels.Selector.open(Unknown Source)
    at org.jboss.netty.channel.socket.nio.NioClientSocketPipelineSink$Boss.register(NioClientSocketPipelineSink.java:188)
    ... 8 more


Serveren går ikke ned, men tror testen går ned fordi en af klienterne ikke kan skrive fordi bufferen er fuld.
Men det må jeg lige arbejde med.

Tak for hjælpen.
Avatar billede arne_v Ekspert
22. januar 2011 - 21:08 #14
direct memory kontrolleres ikke med:

-Xmx

men med:

-XX:MaxDirectMemorySize=
Avatar billede tuidoi Nybegynder
22. januar 2011 - 22:10 #15
Som jeg har forstået det er -XX:MaxDirectMemorySize= en parameter som skal gives til JVM?

Hvordan gør jeg dette?

skal jeg oprette en ny tråd hvor jeg spørg om dette nu hvor det nærmest bliver 2 spørgsmål i et?
Avatar billede arne_v Ekspert
22. januar 2011 - 22:21 #16
Korrekt.

Du starter så dit program med:

java -Xmx1024m -XX:MaxDirectMemorySize=256m mypackage.MyMainClass
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester