mboost-dp1

Latency simulering


Gå til bund
Gravatar #1 - nielsbuus
25. okt. 2011 23:28
Jeg sidder og arbejder på en java klient der tilgår en ekstern MySQL database - for at afprøve min ydelsen af mit design, så kunne jeg godt tænke mig, hvis jeg kunne simulere lang svartid og lav båndbredde.

Jeg har googlet lidt på det, men finder kun nogle kryptiske forslag til FreeBSD. Er der nogen der der har nogle ideer til hvad en stakkels Windows-koder kan gøre for at køre netværksydelsen i sænk? Og nej, jeg har ikke tænkt mig at købe en SkyLine boks.

Jeg forestiller mig et virtuelt netkort af en art...
Gravatar #2 - kasperd
26. okt. 2011 00:07
MadiZone (1) skrev:
Jeg forestiller mig et virtuelt netkort af en art...
På Linux kunne man nemt implementere det vha. tun/tap driveren. For at opnå en lang roundtrip er det nok at forsinke pakkerne i den ene retning, hvilket gør opgaven lidt nemmere.

Lav båndbredde kunne man nemt opnå med iptables, og det er let at sætte op til forskelligt antal pakker per sekund i hver retning.

Jeg er klar over at det ikke var en Linux løsning du spurgte efter, men en mulighed er at sætte en Linux boks imellem og køre den nødvendige software derpå.

Opgaven kan sikkert også klares på Windows, hvis man kan finde en person med tilstrækkeligt kendskab til Windows. Jeg har læst at der findes en tun/tap driver til Windows, så at implementere et program der bufferer pakkerne burde være muligt. At så få routet pakkerne igennem programmet (uden at lave en løkke) kræver at man har styr på konfiguration af routing. Det aner jeg intet om hvordan man gør på Windows.

En alternativ fremgangsmåde er at gøre det på socket niveau i stedet for på pakke niveau. At gøre det på socket niveau er dog ikke så realistisk.

Koden jeg ville bruge til at buffere pakker med tun/tap ville i grove træk så således ud:


while (1) {
fd_set read_fds;
/* Init read_fds med tun/tap fd */
if (/* pakke i kø */) {
struct timeval tv= {/* hvor lang tid til den skal sendes */}
r=select(&read_fds,NULL,NULL,&tv);
} else {
r=select(&read_fds,NULL,NULL,NULL);
}
if (fd_set(&read_fds,tun_fd)) {
read(tun_fd,packet);
/* Sæt pakke i kø */
} else {
/* Fjern pakke fra kø og send den på raw socket */
}
}


Hvis jeg får lidt tid til overs kunne jeg sikkert finde på at skrive koden.
Gravatar #3 - arne_v
26. okt. 2011 00:47
#1

Antagelse: problemet er at du helst ikke vil forurene din kode med snavs a la:

if(cfg.slowNetSimu) {
Thread.sleep(100);
}

To mulige løsninger:

A) skriv din egen lille passthrough JDBC driver som venter lidt her og der og så når du vil simulere ændrer du konfigurationen til at bruge den wrappet omkring MySQL

B) byg dit program med AspectJ og væv et intercept at de kald som skal vente lidt ind hvor du ønsker det

Gravatar #4 - m910q
26. okt. 2011 07:06
Man kan forholdsvis hurtigt lave en proxy hvor man smider en sleep ind, og laver en max på mængden af data over tid.

Nu jeg tænker over det, vil det være et rart værktøj at have fremover... Tror jeg vil kigge på det når jeg kommer hjem :)
Gravatar #5 - Arnfast
26. okt. 2011 14:34
Du kan nok også godt finde en proxy i et unga bunga land
Gravatar #6 - BetaLyte
26. okt. 2011 15:54
#5
Syntes faktisk lige at have læst at den Unga Bunganske Republik lige har slukket deres proxy, fordi der var en der fik løst til te, så de skulle bruge elkedlen.

OT: Så lyder #5's forslag umiddelbart som det nemmeste, og det skal da nok kunne lade sig gøre at finde sådan en proxy.
Gravatar #7 - arne_v
26. okt. 2011 16:05
#proxy

Vi snakker vel delay mellem app og db.

D.v.s. at man kan ikke bruge en HTTP proxy men skal have fat i en rå TCP proxy.

Findes sådanne på public internet?
Gravatar #8 - m910q
26. okt. 2011 17:16
#7
Jeg laver en SOCKS proxy, ikke HTTP(Hvem har snakket om det?)

Med et andet program kan man få visse programmer/porte til at gå over denne proxy uden at de kan se forskel, og ikke mindst, uden at ændre en eneste linje kode.

Disse findes også på nettet, men det er dog ikke ligefrem mange.
Gravatar #9 - arne_v
26. okt. 2011 17:40
#8

Og en MySQL JDBC driver snakker Socks?
Gravatar #10 - m910q
26. okt. 2011 17:49
Tag et kig på f.eks. Proxifier
Gravatar #11 - kasperd
26. okt. 2011 18:51
m910q (10) skrev:
Tag et kig på f.eks. Proxifier
Lyder meget lig tsocks. Den slags software kan dog påvirke afvikling af software anderledes end en lille smule ekstra latens ville, så resultatet er ikke helt definitivt.
Gravatar #12 - Qw_freak
27. okt. 2011 13:34
Kunne du ikke bare begrænse dit programs hastiged på nettet via fx et program som netlimiter?
Gravatar #13 - terracide
27. okt. 2011 13:45
Qw_freak (12) skrev:
Kunne du ikke bare begrænse dit programs hastiged på nettet via fx et program som netlimiter?


Båndbredde != lantency.

Skal jeg øge min lantency, så beder jeg bare mit KillerNic om at øge pingtiden...
Gravatar #14 - Qw_freak
27. okt. 2011 13:47
terracide (13) skrev:
Båndbredde != lantency.


Nårh nej, det er også rigtigt... mybad.jpg
Gravatar #15 - nielsbuus
28. okt. 2011 15:11
FYI: Jeg har kigget på forslagene, men kunne ikke få proxifier til at gøre som jeg ville. :-/

Men jeg endte med at hente en trial fra: http://www.charlesproxy.com og kan bekræfte at løsningen virker. Man skal dog huske at angive proxyserveren i sit program for at fange og sløve trafikken. :-)
Gravatar #16 - arne_v
28. okt. 2011 23:55
#3 & 15

AspectJ eksempel:


C:\Work>type SimpleDB.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class SimpleDB {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/Test", "root", "");
Statement stmt = con.createStatement();
long t1 = System.currentTimeMillis();
ResultSet rs = stmt.executeQuery("SELECT * FROM T1");
while(rs.next()) {
int f1 = rs.getInt(1);
String f2 = rs.getString(2);
System.out.println(f1 + " " + f2);
}
rs.close();
long t2 = System.currentTimeMillis();
stmt.close();
con.close();
System.out.println((t2 - t1) + " ms");
}
}

C:\Work>javac -classpath . SimpleDB.java

C:\Work>java -cp .;C:\DivJava\mysql-connector-java-5.1.16\mysql-connector-java-5.1.16-bin.jar SimpleDB
1 A
2 BB
3 CCC
0 ms

C:\Work>java -cp .;C:\DivJava\mysql-connector-java-5.1.16\mysql-connector-java-5.1.16-bin.jar SimpleDB
1 A
2 BB
3 CCC
0 ms

C:\Work>java -cp .;C:\DivJava\mysql-connector-java-5.1.16\mysql-connector-java-5.1.16-bin.jar SimpleDB
1 A
2 BB
3 CCC
15 ms

C:\Work>type IncreaseLatency.aj
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class IncreaseLatency {
@Pointcut("call(boolean java.sql.ResultSet.next())")
public void toBeDelayed() {}
@Around(value = "toBeDelayed()")
public Object delay(ProceedingJoinPoint pjp) {
try {
Thread.sleep(200);
} catch(InterruptedException ex) {
ex.printStackTrace();
}
return pjp.proceed();
}
}

C:\Work>ajc -source 1.6 -classpath .;C:\Eclipse\aspectj1.6\lib\aspectjrt.jar SimpleDB.java IncreaseLatency.aj

C:\Work>java -cp .;C:\DivJava\mysql-connector-java-5.1.16\mysql-connector-java-5.1.16-bin.jar;C:\Eclipse\aspectj1.6\lib\aspectjrt.jar SimpleDB
1 A
2 BB
3 CCC
827 ms

C:\Work>java -cp .;C:\DivJava\mysql-connector-java-5.1.16\mysql-connector-java-5.1.16-bin.jar;C:\Eclipse\aspectj1.6\lib\aspectjrt.jar SimpleDB
1 A
2 BB
3 CCC
811 ms

C:\Work>java -cp .;C:\DivJava\mysql-connector-java-5.1.16\mysql-connector-java-5.1.16-bin.jar;C:\Eclipse\aspectj1.6\lib\aspectjrt.jar SimpleDB
1 A
2 BB
3 CCC
811 ms
Gravatar #17 - Bundy
1. nov. 2011 11:02
terracide (13) skrev:
Båndbredde != lantency.

Skal jeg øge min lantency, så beder jeg bare mit KillerNic om at øge pingtiden...


Du er SÅ FUCKING VILD med dit killernic, terra. Må jeg ikke nok sutte din pik nu? Altså, så får du også noget ud af et 1k du har smidt efter dit NIC.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login