mboost-dp1
Latency simulering
- Forside
- ⟨
- Forum
- ⟨
- Programmering
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...
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...
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.MadiZone (1) skrev:Jeg forestiller mig et virtuelt netkort af en art...
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.
#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
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
#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.
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.
Kunne du ikke bare begrænse dit programs hastiged på nettet via fx et program som netlimiter?
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...
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. :-)
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. :-)
#3 & 15
AspectJ eksempel:
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
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.