added siege like load tester
This commit is contained in:
parent
97b48a5b93
commit
97c711613f
|
@ -31,6 +31,7 @@ import org.eclipse.jetty.server.handler.RequestLogHandler;
|
||||||
import org.eclipse.jetty.server.handler.StatisticsHandler;
|
import org.eclipse.jetty.server.handler.StatisticsHandler;
|
||||||
import org.eclipse.jetty.server.nio.SelectChannelConnector;
|
import org.eclipse.jetty.server.nio.SelectChannelConnector;
|
||||||
import org.eclipse.jetty.server.ssl.SslSelectChannelConnector;
|
import org.eclipse.jetty.server.ssl.SslSelectChannelConnector;
|
||||||
|
import org.eclipse.jetty.server.ssl.SslSocketConnector;
|
||||||
import org.eclipse.jetty.util.log.Log;
|
import org.eclipse.jetty.util.log.Log;
|
||||||
import org.eclipse.jetty.util.ssl.SslContextFactory;
|
import org.eclipse.jetty.util.ssl.SslContextFactory;
|
||||||
import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
||||||
|
@ -63,7 +64,7 @@ public class LikeJettyXml
|
||||||
connector.setPort(8080);
|
connector.setPort(8080);
|
||||||
connector.setMaxIdleTime(30000);
|
connector.setMaxIdleTime(30000);
|
||||||
connector.setConfidentialPort(8443);
|
connector.setConfidentialPort(8443);
|
||||||
connector.setStatsOn(true);
|
connector.setStatsOn(false);
|
||||||
|
|
||||||
server.setConnectors(new Connector[]
|
server.setConnectors(new Connector[]
|
||||||
{ connector });
|
{ connector });
|
||||||
|
@ -86,10 +87,16 @@ public class LikeJettyXml
|
||||||
"SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
|
"SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
|
||||||
"SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"
|
"SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"
|
||||||
});
|
});
|
||||||
ssl_connector.setStatsOn(true);
|
ssl_connector.setStatsOn(false);
|
||||||
server.addConnector(ssl_connector);
|
server.addConnector(ssl_connector);
|
||||||
ssl_connector.open();
|
ssl_connector.open();
|
||||||
|
|
||||||
|
SslSocketConnector ssl2_connector = new SslSocketConnector(cf);
|
||||||
|
ssl2_connector.setPort(8444);
|
||||||
|
ssl2_connector.setStatsOn(false);
|
||||||
|
server.addConnector(ssl2_connector);
|
||||||
|
ssl2_connector.open();
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package org.eclipse.jetty.client;
|
package org.eclipse.jetty.client;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
|
@ -33,11 +35,26 @@ public class Curl
|
||||||
client.start();
|
client.start();
|
||||||
boolean async=true;
|
boolean async=true;
|
||||||
boolean dump= false;
|
boolean dump= false;
|
||||||
|
boolean verbose= false;
|
||||||
|
|
||||||
final CountDownLatch latch = new CountDownLatch(args.length);
|
|
||||||
|
int urls=0;
|
||||||
|
for (String arg : args)
|
||||||
|
{
|
||||||
|
if (!arg.startsWith("-"))
|
||||||
|
urls++;
|
||||||
|
}
|
||||||
|
|
||||||
|
final CountDownLatch latch = new CountDownLatch(urls);
|
||||||
|
|
||||||
for (String arg : args)
|
for (String arg : args)
|
||||||
{
|
{
|
||||||
|
if ("--verbose".equals(arg))
|
||||||
|
{
|
||||||
|
verbose=true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if ("--sync".equals(arg))
|
if ("--sync".equals(arg))
|
||||||
{
|
{
|
||||||
async=false;
|
async=false;
|
||||||
|
@ -63,6 +80,7 @@ public class Curl
|
||||||
}
|
}
|
||||||
|
|
||||||
final boolean d = dump;
|
final boolean d = dump;
|
||||||
|
final boolean v = verbose;
|
||||||
HttpExchange ex = new HttpExchange()
|
HttpExchange ex = new HttpExchange()
|
||||||
{
|
{
|
||||||
AtomicBoolean counted=new AtomicBoolean(false);
|
AtomicBoolean counted=new AtomicBoolean(false);
|
||||||
|
@ -105,6 +123,7 @@ public class Curl
|
||||||
super.onResponseContent(content);
|
super.onResponseContent(content);
|
||||||
if (d)
|
if (d)
|
||||||
System.out.print(content.toString());
|
System.out.print(content.toString());
|
||||||
|
if (v)
|
||||||
System.err.println("got "+content.length());
|
System.err.println("got "+content.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,6 +135,7 @@ public class Curl
|
||||||
protected void onResponseHeader(Buffer name, Buffer value) throws IOException
|
protected void onResponseHeader(Buffer name, Buffer value) throws IOException
|
||||||
{
|
{
|
||||||
super.onResponseHeader(name,value);
|
super.onResponseHeader(name,value);
|
||||||
|
if (v)
|
||||||
System.err.println(name+": "+value);
|
System.err.println(name+": "+value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,6 +147,7 @@ public class Curl
|
||||||
protected void onResponseHeaderComplete() throws IOException
|
protected void onResponseHeaderComplete() throws IOException
|
||||||
{
|
{
|
||||||
super.onResponseHeaderComplete();
|
super.onResponseHeaderComplete();
|
||||||
|
if (v)
|
||||||
System.err.println();
|
System.err.println();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,6 +159,7 @@ public class Curl
|
||||||
protected void onResponseStatus(Buffer version, int status, Buffer reason) throws IOException
|
protected void onResponseStatus(Buffer version, int status, Buffer reason) throws IOException
|
||||||
{
|
{
|
||||||
super.onResponseStatus(version,status,reason);
|
super.onResponseStatus(version,status,reason);
|
||||||
|
if (v)
|
||||||
System.err.println(version+" "+status+" "+reason);
|
System.err.println(version+" "+status+" "+reason);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,194 @@
|
||||||
|
package org.eclipse.jetty.client;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.CountDownLatch;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.http.HttpMethods;
|
||||||
|
import org.eclipse.jetty.io.Buffer;
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public class Siege
|
||||||
|
{
|
||||||
|
private static final class ConcurrentExchange extends HttpExchange
|
||||||
|
{
|
||||||
|
private final long _start=System.currentTimeMillis();
|
||||||
|
private final HttpClient _client;
|
||||||
|
private final CountDownLatch _latch;
|
||||||
|
volatile int _status;
|
||||||
|
volatile int _count;
|
||||||
|
final List<String> _uris;
|
||||||
|
final int _repeats;
|
||||||
|
int _u;
|
||||||
|
int _r;
|
||||||
|
|
||||||
|
AtomicBoolean counted=new AtomicBoolean(false);
|
||||||
|
|
||||||
|
public ConcurrentExchange(HttpClient client,CountDownLatch latch, List<String> uris, int repeats)
|
||||||
|
{
|
||||||
|
_client = client;
|
||||||
|
_latch = latch;
|
||||||
|
_uris = uris;
|
||||||
|
_repeats = repeats;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onConnectionFailed(Throwable ex)
|
||||||
|
{
|
||||||
|
if (!counted.getAndSet(true))
|
||||||
|
_latch.countDown();
|
||||||
|
super.onConnectionFailed(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onException(Throwable ex)
|
||||||
|
{
|
||||||
|
if (!counted.getAndSet(true))
|
||||||
|
_latch.countDown();
|
||||||
|
super.onException(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onExpire()
|
||||||
|
{
|
||||||
|
if (!counted.getAndSet(true))
|
||||||
|
_latch.countDown();
|
||||||
|
super.onExpire();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResponseComplete() throws IOException
|
||||||
|
{
|
||||||
|
if (_status==200)
|
||||||
|
_count++;
|
||||||
|
if (!next() && !counted.getAndSet(true))
|
||||||
|
{
|
||||||
|
_latch.countDown();
|
||||||
|
long duration=System.currentTimeMillis()-_start;
|
||||||
|
System.err.printf("Got %d/%d in %dms %d%n",_count,_uris.size()*_repeats,duration,_latch.getCount());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/**
|
||||||
|
* @see org.eclipse.jetty.client.HttpExchange#onResponseHeader(org.eclipse.jetty.io.Buffer, org.eclipse.jetty.io.Buffer)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void onResponseHeader(Buffer name, Buffer value) throws IOException
|
||||||
|
{
|
||||||
|
super.onResponseHeader(name,value);
|
||||||
|
if ("Set-Cookie".equalsIgnoreCase(name.toString()))
|
||||||
|
{
|
||||||
|
String v=value.toString();
|
||||||
|
int c = v.indexOf(';');
|
||||||
|
if (c>=0)
|
||||||
|
v=v.substring(0,c);
|
||||||
|
addRequestHeader("Cookie",v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/**
|
||||||
|
* @see org.eclipse.jetty.client.HttpExchange#onResponseHeaderComplete()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void onResponseHeaderComplete() throws IOException
|
||||||
|
{
|
||||||
|
super.onResponseHeaderComplete();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/**
|
||||||
|
* @see org.eclipse.jetty.client.HttpExchange#onResponseStatus(org.eclipse.jetty.io.Buffer, int, org.eclipse.jetty.io.Buffer)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void onResponseStatus(Buffer version, int status, Buffer reason) throws IOException
|
||||||
|
{
|
||||||
|
_status=status;
|
||||||
|
super.onResponseStatus(version,status,reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean next()
|
||||||
|
{
|
||||||
|
if (_u>=_uris.size())
|
||||||
|
{
|
||||||
|
_u=0;
|
||||||
|
_r++;
|
||||||
|
if (_r>=_repeats)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
String uri=_uris.get(_u++);
|
||||||
|
|
||||||
|
reset();
|
||||||
|
setMethod(HttpMethods.GET);
|
||||||
|
setURL(uri);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_client.send(this);
|
||||||
|
}
|
||||||
|
catch(IOException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args)
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
if (args.length==0)
|
||||||
|
args=new String[]
|
||||||
|
{ "-c", "2", "-r", "2", "http://localhost:8080/dump", "http://localhost:8080/d.txt"};
|
||||||
|
|
||||||
|
int concurrent=1;
|
||||||
|
int repeats=1;
|
||||||
|
final List<String> uris = new ArrayList<String>();
|
||||||
|
|
||||||
|
for (int i=0; i<args.length; i++)
|
||||||
|
{
|
||||||
|
String arg=args[i];
|
||||||
|
if ("-c".equals(arg))
|
||||||
|
{
|
||||||
|
concurrent=Integer.parseInt(args[++i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("-r".equals(arg))
|
||||||
|
{
|
||||||
|
repeats=Integer.parseInt(args[++i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
uris.add(arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
HttpClient client = new HttpClient();
|
||||||
|
client.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);
|
||||||
|
client.setIdleTimeout(30000);
|
||||||
|
client.setConnectTimeout(30000);
|
||||||
|
client.setMaxConnectionsPerAddress(concurrent*2);
|
||||||
|
client.start();
|
||||||
|
|
||||||
|
final CountDownLatch latch = new CountDownLatch(concurrent);
|
||||||
|
|
||||||
|
|
||||||
|
for (int i=0;i<concurrent;i++)
|
||||||
|
{
|
||||||
|
ConcurrentExchange ex = new ConcurrentExchange(client,latch,uris,repeats);
|
||||||
|
if (!ex.next())
|
||||||
|
latch.countDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
latch.await();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue