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.nio.SelectChannelConnector;
|
||||
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.ssl.SslContextFactory;
|
||||
import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
||||
|
@ -63,7 +64,7 @@ public class LikeJettyXml
|
|||
connector.setPort(8080);
|
||||
connector.setMaxIdleTime(30000);
|
||||
connector.setConfidentialPort(8443);
|
||||
connector.setStatsOn(true);
|
||||
connector.setStatsOn(false);
|
||||
|
||||
server.setConnectors(new Connector[]
|
||||
{ connector });
|
||||
|
@ -86,11 +87,17 @@ public class LikeJettyXml
|
|||
"SSL_DHE_RSA_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);
|
||||
ssl_connector.open();
|
||||
|
||||
|
||||
SslSocketConnector ssl2_connector = new SslSocketConnector(cf);
|
||||
ssl2_connector.setPort(8444);
|
||||
ssl2_connector.setStatsOn(false);
|
||||
server.addConnector(ssl2_connector);
|
||||
ssl2_connector.open();
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Ajp13SocketConnector ajp = new Ajp13SocketConnector();
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
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;
|
||||
|
||||
|
@ -33,11 +35,26 @@ public class Curl
|
|||
client.start();
|
||||
boolean async=true;
|
||||
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)
|
||||
{
|
||||
if ("--verbose".equals(arg))
|
||||
{
|
||||
verbose=true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ("--sync".equals(arg))
|
||||
{
|
||||
async=false;
|
||||
|
@ -63,6 +80,7 @@ public class Curl
|
|||
}
|
||||
|
||||
final boolean d = dump;
|
||||
final boolean v = verbose;
|
||||
HttpExchange ex = new HttpExchange()
|
||||
{
|
||||
AtomicBoolean counted=new AtomicBoolean(false);
|
||||
|
@ -105,7 +123,8 @@ public class Curl
|
|||
super.onResponseContent(content);
|
||||
if (d)
|
||||
System.out.print(content.toString());
|
||||
System.err.println("got "+content.length());
|
||||
if (v)
|
||||
System.err.println("got "+content.length());
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
|
@ -116,7 +135,8 @@ public class Curl
|
|||
protected void onResponseHeader(Buffer name, Buffer value) throws IOException
|
||||
{
|
||||
super.onResponseHeader(name,value);
|
||||
System.err.println(name+": "+value);
|
||||
if (v)
|
||||
System.err.println(name+": "+value);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
|
@ -127,7 +147,8 @@ public class Curl
|
|||
protected void onResponseHeaderComplete() throws IOException
|
||||
{
|
||||
super.onResponseHeaderComplete();
|
||||
System.err.println();
|
||||
if (v)
|
||||
System.err.println();
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
|
@ -138,7 +159,8 @@ public class Curl
|
|||
protected void onResponseStatus(Buffer version, int status, Buffer reason) throws IOException
|
||||
{
|
||||
super.onResponseStatus(version,status,reason);
|
||||
System.err.println(version+" "+status+" "+reason);
|
||||
if (v)
|
||||
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