/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
RMI performance
Fra : Hansen


Dato : 28-12-03 22:29

Jeg har prøvet at teste flere klienter mod en server på samme tid under java
rmi. Klienterne kaldte en funktion der returnerede 100 bytes 50000 gange. En
ting der så kom bag på mig var at den klient der forbinder sidst til
serveren konsekvent har bedre performance end de andre klienter. Den ligger
på 1 sekund hvorimod de andre alle sammen lå på omkring 9 sek (9 stk).
Er der nogen der har en forklaring på dette fænomen?

pft
Søren



 
 
Mikkel Bundgaard (29-12-2003)
Kommentar
Fra : Mikkel Bundgaard


Dato : 29-12-03 00:33

On Sun, 28 Dec 2003 22:28:51 +0100, Hansen wrote:

> Jeg har prøvet at teste flere klienter mod en server på samme tid under java
> rmi. Klienterne kaldte en funktion der returnerede 100 bytes 50000 gange. En
> ting der så kom bag på mig var at den klient der forbinder sidst til
> serveren konsekvent har bedre performance end de andre klienter. Den ligger
> på 1 sekund hvorimod de andre alle sammen lå på omkring 9 sek (9 stk).
> Er der nogen der har en forklaring på dette fænomen?
Ikke lige umiddelbart, men kan du ikke vise koden, så kan det være, at
vi kan forklare det
--
Mikkel Bundgaard
Ph.D. student at IT University of Copenhagen
http://www.itu.dk/people/mikkelbu/
Codito, Ergo Sum

Hansen (29-12-2003)
Kommentar
Fra : Hansen


Dato : 29-12-03 11:42


> Ikke lige umiddelbart, men kan du ikke vise koden, så kan det være, at
> vi kan forklare det

Her er den så .....

package client;

import java.io.*;
import java.util.Calendar;
import org.omg.CORBA.*;
import CorbaPerformanceTest.*;

public class tester {

public tester() {
}

public static void main(String args[]) {
try {
// create and initialize the ORB
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);

// Get the stringified object reference and destringify it.
java.io.BufferedReader in = new java.io.BufferedReader(new java.io.
FileReader("g:\\d-ipump-1\\javaorbtest.ref"));
String ref = in.readLine();

org.omg.CORBA.Object obj = orb.string_to_object(ref);
PerformanceTest test = PerformanceTestHelper.narrow(obj);

int NUM = Integer.parseInt(args[0]);

FileWriter fos = null;
try {
fos = new FileWriter(new File("c:\\test.txt"));
}
catch (IOException ex3) {
}

long start = 0;
long stop = 0;

System.out.println("Performance Test of RMI");
System.out.println("Starting test. Running 50000 times.");

start = Calendar.getInstance().getTimeInMillis();
for (long i = 0; i < 50000; i++) {
try {
bytearray a = test.test(NUM);
}
catch (Exception e) {
System.out.println("Exception occured on server!");
}

if (i % 1000 == 0) {
stop = Calendar.getInstance().getTimeInMillis();
long delta = stop - start;
try {
fos.write(String.valueOf(delta));
}
catch (IOException ex2) {
}
System.out.println("" + i + " requests done. 1000 requests/" + NUM
+
" bytes : " + delta + " ms");
start = Calendar.getInstance().getTimeInMillis();
}
}
try {
fos.close();
}
catch (IOException ex1) {
}

System.out.println("Test terminated!");
}
catch (Exception e) {
System.out.println("ERROR : " + e);
e.printStackTrace(System.out);
}
}
}



gooz (29-12-2003)
Kommentar
Fra : gooz


Dato : 29-12-03 17:23

> Her er den så .....
>
> package client;
>
> import java.io.*;
> import java.util.Calendar;
> import org.omg.CORBA.*;
> import CorbaPerformanceTest.*;
>
> public class tester {
>
> public tester() {
> }
>
> public static void main(String args[]) {
> try {
> // create and initialize the ORB
> org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);
>
> // Get the stringified object reference and destringify it.
> java.io.BufferedReader in = new java.io.BufferedReader(new java.io.
> FileReader("g:\\d-ipump-1\\javaorbtest.ref"));
> String ref = in.readLine();
>
> org.omg.CORBA.Object obj = orb.string_to_object(ref);
> PerformanceTest test = PerformanceTestHelper.narrow(obj);
>

[snip - en masse kode]

Hejsa,

Skal vi ikke lige blive enige om at det ikke er Java RMI du bruger,
men derimod CORBA som er en anden implementation af Middelware.

Mvh. Henrik

Hansen (29-12-2003)
Kommentar
Fra : Hansen


Dato : 29-12-03 17:53


> Skal vi ikke lige blive enige om at det ikke er Java RMI du bruger,
> men derimod CORBA som er en anden implementation af Middelware.

Damn - i min febrilitet havde jeg pastet det forkerte kode. Her kommer det
rigtige - RMI koden


/////****TEST INTERFACE****/////
package RMIPerformanceTest;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Test extends Remote {
byte[] test(int bytenum) throws RemoteException;
}

//// ****TESTER CLASS ****//////
package RMIPerformanceTest;

import java.applet.Applet;
import java.awt.Graphics;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.io.*;
import java.util.Calendar;

public class Tester {
public static void main(String args[]) {

int NUM = Integer.parseInt(args[0]);

FileWriter fos = null;
try {
fos = new FileWriter(new File("c:\\test.txt"));
}
catch (IOException ex3) {
}

long start = 0;
long stop = 0;

System.out.println("Performance Test of RMI");

Test obj = null;
try {
obj = (Test) Naming.lookup("rmi://130.225.184.185/RMITestServer");
byte[] b = obj.test(NUM);
}
catch (Exception e) {
e.printStackTrace();
}

System.out.println("Starting test. Running 50000 times.");

start = Calendar.getInstance().getTimeInMillis();
for (long i = 0; i < 50000; i++) {
try {
byte[] a = obj.test(NUM);
}
catch (Exception e) {
System.out.println("Exception occured on server!");
}

if (i % 1000 == 0) {
stop = Calendar.getInstance().getTimeInMillis();
long delta = stop - start;
try {
fos.write(String.valueOf(delta));
}
catch (IOException ex2) {
}
System.out.println("" + i + " requests done. 1000 requests/" + NUM +
" bytes : " + delta + " ms");
start = Calendar.getInstance().getTimeInMillis();
}
}
try {
fos.close();
}
catch (IOException ex1) {
}

System.out.println("Test terminated!");
}
}


//// ****TESTIMPL CLASS****/////
package RMIPerformanceTest;

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.rmi.server.UnicastRemoteObject;

public class TestImpl extends UnicastRemoteObject implements Test {

public TestImpl() throws RemoteException {
super();
}

public byte[] test(int bytenum) {
return new byte[bytenum];
}

public static void main(String args[]) {
try {
TestImpl obj = new TestImpl();
// Bind this object instance to the name "HelloServer"
Naming.rebind("rmi://130.225.184.185/RMITestServer", obj);
} catch (Exception e) {
e.printStackTrace();
}
}
}



Mikkel Bundgaard (30-12-2003)
Kommentar
Fra : Mikkel Bundgaard


Dato : 30-12-03 13:59

On Mon, 29 Dec 2003 17:52:46 +0100, Hansen wrote:

<SNIP Kode og indsat første spørgsmål igen>
> Jeg har prøvet at teste flere klienter mod en server på samme tid under
> java rmi. Klienterne kaldte en funktion der returnerede 100 bytes 50000
> gange. En ting der så kom bag på mig var at den klient der forbinder
> sidst til serveren konsekvent har bedre performance end de andre
> klienter. Den ligger på 1 sekund hvorimod de andre alle sammen lå på
> omkring 9 sek (9 stk). Er der nogen der har en forklaring på dette
> fænomen?
Hej Hansen

Jeg har lige hurtigt prøvet koden på min computer (Linux og jdk 1.4.1) og
her er alle klienterne lige hurtige. Dog er både de første og de sidste
tilgange meget hurtigere, men her er serveren/forbindelsen heller ikke så
belastet, da ikke alle klienterne tilgår serveren. Dit spørgsmål tolker
jeg som om den sidste klient gennem hele testen var hurtigere end de andre
eller var det kun til sidst, når nogle af de andre klieter var færdige ??

Blev alle klienterne startet fra den samme computer eller fra hver sin
computer ?

Jeg prøvede for sjov at starte både server og klient med Server VM
(-server) og her blev køretiden mere eller mindre fordoblet i forhold til
det almelige.

Hvis man startede dem med -Xint (dvs. kun fortolk og ingen JIT) så var
køretiden ca. midt mellem almindelig og -server.
--
Mikkel Bundgaard
Ph.D. student at IT University of Copenhagen
http://www.itu.dk/people/mikkelbu/
Codito, Ergo Sum

Hansen (30-12-2003)
Kommentar
Fra : Hansen


Dato : 30-12-03 16:42

Hej Mikkel

> Dit spørgsmål tolker
> jeg som om den sidste klient gennem hele testen var hurtigere end de andre
> eller var det kun til sidst, når nogle af de andre klieter var færdige ??
> Blev alle klienterne startet fra den samme computer eller fra hver sin
> computer ?

Det er korrekt - den der sidst blev startet op var hurtigere end de andre.
De blev alle 10 startet lige efter efter hinanden på den samme computer og
kørte side om side. Når den der blev startet sidst var færdig, blev de andre
lidt hurtigere, men havde alle sammen ca. samme tider.

Testen blev kørt med en server på en Windows 2k maskine og klienterne på en
anden Windows 2k maskine. Maskinerne sad på samme net.

Umiddelbart lyder det ikke til at det er RMI der skaber dette fænomen, men
nærmere som noget netværk eller platform afhængigt.

Mvh
Søren



Anders K. Olsen (30-12-2003)
Kommentar
Fra : Anders K. Olsen


Dato : 30-12-03 17:47

"Hansen" <bluesboys@-remove.me-hotmail.com> wrote in message
news:3ff19cca$0$17591$ba624c82@nntp05.dk.telia.net...
> Det er korrekt - den der sidst blev startet op var hurtigere end de andre.
> De blev alle 10 startet lige efter efter hinanden på den samme computer og
> kørte side om side. Når den der blev startet sidst var færdig, blev de
andre
> lidt hurtigere, men havde alle sammen ca. samme tider.
>
> Testen blev kørt med en server på en Windows 2k maskine og klienterne på
en
> anden Windows 2k maskine. Maskinerne sad på samme net.

Windows i klient versionerne prioriterer det aktive vindue, så hvis du har
kørt dem fra hver sin dos-prompt, har den prompt der har været aktiv fået
højere prioritet end de andre.

/Anders



Hansen (30-12-2003)
Kommentar
Fra : Hansen


Dato : 30-12-03 18:33


> Windows i klient versionerne prioriterer det aktive vindue, så hvis du har
> kørt dem fra hver sin dos-prompt, har den prompt der har været aktiv fået
> højere prioritet end de andre.

Ahaa!

Se det virker jo som en rigtig sandsynlig mulighed. Det passer jo med at den
man sidst har startet samtidigt er det aktive vindue.

1000 tak for hjælpen alle sammen og rigtig godt nytår!!

Søren



Anders K. Olsen (30-12-2003)
Kommentar
Fra : Anders K. Olsen


Dato : 30-12-03 20:08

"Hansen" <bluesboys@-remove.me-hotmail.com> wrote in message
news:3ff1b6ea$0$17626$ba624c82@nntp05.dk.telia.net...
>
> > Windows i klient versionerne prioriterer det aktive vindue, så hvis du
har
> > kørt dem fra hver sin dos-prompt, har den prompt der har været aktiv
fået
> > højere prioritet end de andre.
>
> Ahaa!
>
> Se det virker jo som en rigtig sandsynlig mulighed. Det passer jo med at
den
> man sidst har startet samtidigt er det aktive vindue.

Nu ved jeg ikke hvor lang tid det tager for de enkelte klienter at blive
færdig, men du kan jo prøve at flytte fokus til et andet vindue efter du har
startet dem alle. Så bør den nye aktive klient blive først færdig.

Du kan konfigurere windows et eller andet sted til at give prioritet til
baggrundsprocesser i stedet for aktive vinduer, hvis du ønsker det. Sådan
opfører server versionerne sig vist nok pr. default. Der findes sikkert en
passende windows nyhedsgruppe, hvor de ved mere om den slags, hvis du er
interesseret.

/Anders



Mikkel Bundgaard (29-12-2003)
Kommentar
Fra : Mikkel Bundgaard


Dato : 29-12-03 17:50

On Mon, 29 Dec 2003 11:42:24 +0100, Hansen wrote:

>
>> Ikke lige umiddelbart, men kan du ikke vise koden, så kan det være, at
>> vi kan forklare det
>
> Her er den så .....
>
> package client;
>
> import java.io.*;
> import java.util.Calendar;
> import org.omg.CORBA.*;
> import CorbaPerformanceTest.*;
>
> public class tester {
....
> public static void main(String args[]) {
> try {
> // create and initialize the ORB
> org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);
>
....
> org.omg.CORBA.Object obj = orb.string_to_object(ref);
> PerformanceTest test = PerformanceTestHelper.narrow(obj);
Efter at have kigget _meget_ kort på ovenstående kunne det være rart at se
implementationen af klassen PerformanceTest, da det ser ud til, at det
hele afhænger af denne klasse. (kan du evt. ikke oploade alt koden et
eller andet sted, så man kan prøve det selv). Jeg har dog ingen praktisk
erfaring med CORBA, så det kan godt være at andre må træde til

Lige et par spørgsmål/råd
Hvorfor har du alle disse import sætninger, når du alligevel oftest har
fuldt kvalificerede erklæringer ?
Kan du ikke bruge System.currentTimeMillis() i stedet for at bruge
Calendar ?
--
Mikkel Bundgaard
Ph.D. student at IT University of Copenhagen
http://www.itu.dk/people/mikkelbu/
Codito, Ergo Sum

Anders K. Olsen (29-12-2003)
Kommentar
Fra : Anders K. Olsen


Dato : 29-12-03 01:10

"Hansen" <bluesboys@-remove.me-hotmail.com> wrote in message
news:3fef4b33$0$17624$ba624c82@nntp05.dk.telia.net...
> Jeg har prøvet at teste flere klienter mod en server på samme tid under
java
> rmi. Klienterne kaldte en funktion der returnerede 100 bytes 50000 gange.
En
> ting der så kom bag på mig var at den klient der forbinder sidst til
> serveren konsekvent har bedre performance end de andre klienter. Den
ligger
> på 1 sekund hvorimod de andre alle sammen lå på omkring 9 sek (9 stk).
> Er der nogen der har en forklaring på dette fænomen?

Hotspot?

Sun's JVM indeholder en JIT compiler, det betyder at den kode du afvikler
løbende kompileres mens den afvikles. Det tager lidt tid i starten, men
efter kort tid, så er din kode blevet compileret ned til native kode til din
platform. Det giver en kraftig forbedring af performance.

Hvis du skal lave performance tests mod en Java VM, så skal du altid starte
med et par testkørsler for at få sat Hotspot i sving.

Se evt. denne artikkel fra JavaWorld:
http://www.javaworld.com/javaworld/javaqa/2003-04/01-qa-0411-hotspot.html

/Anders



Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409083
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste