diff --git a/jetty-load-generator-client/pom.xml b/jetty-load-generator-client/pom.xml index c43cfcda..ec09d886 100644 --- a/jetty-load-generator-client/pom.xml +++ b/jetty-load-generator-client/pom.xml @@ -54,11 +54,6 @@ commons-lang commons-lang - - com.google.guava - guava - true - org.eclipse.jetty.toolchain jetty-perf-helper diff --git a/jetty-load-generator-client/src/main/java/org/mortbay/jetty/load/generator/HTTP1ClientTransportRateLimiterBuilder.java b/jetty-load-generator-client/src/main/java/org/mortbay/jetty/load/generator/HTTP1ClientTransportRateLimiterBuilder.java deleted file mode 100644 index 62e56e4b..00000000 --- a/jetty-load-generator-client/src/main/java/org/mortbay/jetty/load/generator/HTTP1ClientTransportRateLimiterBuilder.java +++ /dev/null @@ -1,113 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. -// ------------------------------------------------------------------------ -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// and Apache License v2.0 which accompanies this distribution. -// -// The Eclipse Public License is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// The Apache License v2.0 is available at -// http://www.opensource.org/licenses/apache2.0.php -// -// You may elect to redistribute this code under either of these licenses. -// ======================================================================== -// - -package org.mortbay.jetty.load.generator; - -import com.google.common.util.concurrent.RateLimiter; -import org.eclipse.jetty.client.HttpClientTransport; -import org.eclipse.jetty.client.HttpDestination; -import org.eclipse.jetty.client.HttpExchange; -import org.eclipse.jetty.client.SendFailure; -import org.eclipse.jetty.client.api.Connection; -import org.eclipse.jetty.client.api.Request; -import org.eclipse.jetty.client.api.Response; -import org.eclipse.jetty.client.http.HttpClientTransportOverHTTP; -import org.eclipse.jetty.client.http.HttpConnectionOverHTTP; -import org.eclipse.jetty.io.EndPoint; -import org.eclipse.jetty.util.Promise; - -/** - * Helper builder to provide an http(s) {@link HttpClientTransport} - */ -public class HTTP1ClientTransportRateLimiterBuilder - implements HTTPClientTransportBuilder -{ - private int selectors = 1; - - private int resourceRate; - - public HTTP1ClientTransportRateLimiterBuilder( int resourceRate ) - { - this.resourceRate = resourceRate; - } - - public HTTP1ClientTransportRateLimiterBuilder selectors( int selectors ) - { - this.selectors = selectors; - return this; - } - - public int getSelectors() - { - return selectors; - } - - @Override - public HttpClientTransport build() - { - RateLimiter rateLimiter = RateLimiter.create( resourceRate ); - return new HttpClientTransportOverHTTPRateLimiter( getSelectors(), rateLimiter ); - } - - - private static class HttpClientTransportOverHTTPRateLimiter - extends HttpClientTransportOverHTTP - { - private final RateLimiter rateLimiter; - - public HttpClientTransportOverHTTPRateLimiter( int selectors, RateLimiter rateLimiter ) - { - super( selectors ); - this.rateLimiter = rateLimiter; - } - - @Override - protected HttpConnectionOverHTTP newHttpConnection( EndPoint endPoint, HttpDestination destination, - Promise promise ) - { - return new HttpConnectionOverHTTPRateLimiter( endPoint, destination, promise, rateLimiter ); - } - } - - - private static class HttpConnectionOverHTTPRateLimiter extends HttpConnectionOverHTTP - { - private final RateLimiter rateLimiter; - - public HttpConnectionOverHTTPRateLimiter( EndPoint endPoint, HttpDestination destination, - Promise promise, RateLimiter rateLimiter ) - { - super( endPoint, destination, promise ); - this.rateLimiter = rateLimiter; - } - - @Override - public void send( Request request, Response.CompleteListener listener ) - { - rateLimiter.acquire(); - super.send( request, listener ); - } - - @Override - protected SendFailure send( HttpExchange exchange ) - { - double time = rateLimiter.acquire(); - return super.send( exchange ); - } - } -} diff --git a/jetty-load-generator-client/src/main/java/org/mortbay/jetty/load/generator/HTTP2ClientTransportRateLimiterBuilder.java b/jetty-load-generator-client/src/main/java/org/mortbay/jetty/load/generator/HTTP2ClientTransportRateLimiterBuilder.java deleted file mode 100644 index 0a732359..00000000 --- a/jetty-load-generator-client/src/main/java/org/mortbay/jetty/load/generator/HTTP2ClientTransportRateLimiterBuilder.java +++ /dev/null @@ -1,140 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. -// ------------------------------------------------------------------------ -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// and Apache License v2.0 which accompanies this distribution. -// -// The Eclipse Public License is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// The Apache License v2.0 is available at -// http://www.opensource.org/licenses/apache2.0.php -// -// You may elect to redistribute this code under either of these licenses. -// ======================================================================== -// - -package org.mortbay.jetty.load.generator; - -import com.google.common.util.concurrent.RateLimiter; -import org.eclipse.jetty.client.HttpClientTransport; -import org.eclipse.jetty.client.HttpDestination; -import org.eclipse.jetty.http2.api.Session; -import org.eclipse.jetty.http2.client.HTTP2Client; -import org.eclipse.jetty.http2.client.http.HttpChannelOverHTTP2; -import org.eclipse.jetty.http2.client.http.HttpClientTransportOverHTTP2; -import org.eclipse.jetty.http2.client.http.HttpConnectionOverHTTP2; - -/** - * Helper builder to provide an http2 {@link HttpClientTransport} - */ -public class HTTP2ClientTransportRateLimiterBuilder - implements HTTPClientTransportBuilder { - private int selectors = 1; - private int sessionRecvWindow = 16 * 1024 * 1024; - private int streamRecvWindow = 16 * 1024 * 1024; - - private int resourceRate; - - public HTTP2ClientTransportRateLimiterBuilder( int resourceRate ) - { - this.resourceRate = resourceRate; - } - - public HTTP2ClientTransportRateLimiterBuilder selectors( int selectors) { - this.selectors = selectors; - return this; - } - - public int getSelectors() { - return selectors; - } - - public HTTP2ClientTransportRateLimiterBuilder sessionRecvWindow( int sessionRecvWindow) { - this.sessionRecvWindow = sessionRecvWindow; - return this; - } - - public int getSessionRecvWindow() { - return sessionRecvWindow; - } - - public HTTP2ClientTransportRateLimiterBuilder streamRecvWindow( int streamRecvWindow) { - this.streamRecvWindow = streamRecvWindow; - return this; - } - - public int getStreamRecvWindow() { - return streamRecvWindow; - } - - @Override - public HttpClientTransport build() { - HTTP2Client http2Client = new HTTP2Client(); - // Chrome uses 15 MiB session and 6 MiB stream windows. - // Firefox uses 12 MiB session and stream windows. - http2Client.setInitialSessionRecvWindow(getSessionRecvWindow()); - http2Client.setInitialStreamRecvWindow(getStreamRecvWindow()); - http2Client.setSelectors(getSelectors()); - final RateLimiter rateLimiter = RateLimiter.create( resourceRate ); - return new HttpClientTransportOverHTTP2RateLimiter(http2Client, rateLimiter); - } - - private static class HttpClientTransportOverHTTP2RateLimiter extends HttpClientTransportOverHTTP2 - { - private final RateLimiter rateLimiter; - - public HttpClientTransportOverHTTP2RateLimiter( HTTP2Client client, RateLimiter rateLimiter ) - { - super( client ); - this.rateLimiter = rateLimiter; - } - - @Override - protected HttpConnectionOverHTTP2 newHttpConnection( HttpDestination destination, Session session ) - { - return super.newHttpConnection( destination, session ); - } - } - - - private static class HttpConnectionOverHTTP2RateLimiter extends HttpConnectionOverHTTP2 - { - private final RateLimiter rateLimiter; - - public HttpConnectionOverHTTP2RateLimiter( HttpDestination destination, Session session, - RateLimiter rateLimiter ) - { - super( destination, session ); - this.rateLimiter = rateLimiter; - } - - @Override - protected HttpChannelOverHTTP2RateLimiter newHttpChannel( boolean push ) - { - return new HttpChannelOverHTTP2RateLimiter( getHttpDestination(), this, - getSession(), push, rateLimiter ); - } - } - - private static class HttpChannelOverHTTP2RateLimiter extends HttpChannelOverHTTP2 - { - private final RateLimiter rateLimiter; - - public HttpChannelOverHTTP2RateLimiter( HttpDestination destination, HttpConnectionOverHTTP2 connection, - Session session, boolean push, RateLimiter rateLimiter ) - { - super( destination, connection, session, push ); - this.rateLimiter = rateLimiter; - } - - @Override - public void send() - { - rateLimiter.acquire(); - super.send(); - } - } -} diff --git a/jetty-load-generator-client/src/test/java/org/mortbay/jetty/load/generator/HTTP1WebsiteLoadGeneratorRateLimiterTest.java b/jetty-load-generator-client/src/test/java/org/mortbay/jetty/load/generator/HTTP1WebsiteLoadGeneratorRateLimiterTest.java deleted file mode 100644 index bdf2818c..00000000 --- a/jetty-load-generator-client/src/test/java/org/mortbay/jetty/load/generator/HTTP1WebsiteLoadGeneratorRateLimiterTest.java +++ /dev/null @@ -1,100 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. -// ------------------------------------------------------------------------ -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// and Apache License v2.0 which accompanies this distribution. -// -// The Eclipse Public License is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// The Apache License v2.0 is available at -// http://www.opensource.org/licenses/apache2.0.php -// -// You may elect to redistribute this code under either of these licenses. -// ======================================================================== -// - -package org.mortbay.jetty.load.generator; - -import org.HdrHistogram.AtomicHistogram; -import org.HdrHistogram.Histogram; -import org.eclipse.jetty.client.api.Request; -import org.eclipse.jetty.server.HttpConnectionFactory; -import org.eclipse.jetty.toolchain.perf.HistogramSnapshot; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.mortbay.jetty.load.generator.util.MonitoringThreadPoolExecutor; - -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicLong; - -public class HTTP1WebsiteLoadGeneratorRateLimiterTest - extends WebsiteLoadGeneratorTest { - @Before - public void prepare() throws Exception { - prepareServer(new HttpConnectionFactory(), new TestHandler()); - } - - @Test - public void testHTTP1() throws Exception { - MonitoringThreadPoolExecutor executor = new MonitoringThreadPoolExecutor( 1024, 60, TimeUnit.SECONDS); - - AtomicLong requests = new AtomicLong(); - Histogram treeHistogram = new AtomicHistogram(TimeUnit.MICROSECONDS.toNanos(1), TimeUnit.SECONDS.toNanos(10), 3); - Histogram rootHistogram = new AtomicHistogram(TimeUnit.MICROSECONDS.toNanos(1), TimeUnit.SECONDS.toNanos(10), 3); - LoadGenerator loadGenerator = prepareLoadGenerator(new HTTP1ClientTransportRateLimiterBuilder( 3 )) - .warmupIterationsPerThread(10) - .iterationsPerThread(100) -// .warmupIterationsPerThread(1000) -// .runFor(2, TimeUnit.MINUTES) - .usersPerThread(100) - .channelsPerUser(6) - .resourceRate(20) - .executor(executor) - .resourceListener((Resource.TreeListener)info -> { - rootHistogram.recordValue(info.getResponseTime() - info.getRequestTime()); - treeHistogram.recordValue(info.getTreeTime() - info.getRequestTime()); - }) - .requestListener(new Request.Listener.Adapter() { - @Override - public void onQueued(Request request) { - requests.incrementAndGet(); - } - }) - .requestListener(new Request.Listener.Adapter() { - @Override - public void onBegin(Request request) { - requests.decrementAndGet(); - } - }) - .build(); - - serverStats.statsReset(); - loadGenerator.begin().join(); - long elapsed = serverStats.getStatsOnMs(); - - Assert.assertEquals(0, requests.get()); - - int serverRequests = serverStats.getRequests(); - System.err.printf("%nserver - requests: %d, rate: %.3f, max_request_time: %d%n%n", - serverRequests, - elapsed > 0 ? serverRequests * 1000F / elapsed : 0F, - serverStats.getRequestTimeMax()); - - HistogramSnapshot treeSnapshot = new HistogramSnapshot(treeHistogram, 20, "tree response time", "us", TimeUnit.NANOSECONDS::toMicros); - System.err.println(treeSnapshot); - HistogramSnapshot rootSnapshot = new HistogramSnapshot(rootHistogram, 20, "root response time", "us", TimeUnit.NANOSECONDS::toMicros); - System.err.println(rootSnapshot); - - System.err.printf("client thread pool - max_threads: %d, max_queue_size: %d, max_queue_latency: %dms%n%n", - executor.getMaxActiveThreads(), - executor.getMaxQueueSize(), - TimeUnit.NANOSECONDS.toMillis(executor.getMaxQueueLatency()) - ); - - executor.shutdown(); - } -} diff --git a/jetty-load-generator-client/src/test/java/org/mortbay/jetty/load/generator/HTTP2WebsiteLoadGeneratorRateLimiterTest.java b/jetty-load-generator-client/src/test/java/org/mortbay/jetty/load/generator/HTTP2WebsiteLoadGeneratorRateLimiterTest.java deleted file mode 100644 index ab83857d..00000000 --- a/jetty-load-generator-client/src/test/java/org/mortbay/jetty/load/generator/HTTP2WebsiteLoadGeneratorRateLimiterTest.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.mortbay.jetty.load.generator; - -import org.HdrHistogram.AtomicHistogram; -import org.HdrHistogram.Histogram; -import org.eclipse.jetty.client.api.Request; -import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory; -import org.eclipse.jetty.server.HttpConfiguration; -import org.eclipse.jetty.toolchain.perf.HistogramSnapshot; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.mortbay.jetty.load.generator.util.MonitoringThreadPoolExecutor; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicLong; - -public class HTTP2WebsiteLoadGeneratorRateLimiterTest - extends WebsiteLoadGeneratorTest { - @Before - public void prepare() throws Exception { - } - - @Test - public void testHTTP2WithoutPush() throws Exception { - prepareServer(new HTTP2ServerConnectionFactory(new HttpConfiguration()), new TestHandler()); - testHTTP2(); - } - - @Test - public void testHTTP2WithPush() throws Exception { - prepareServer(new HTTP2ServerConnectionFactory(new HttpConfiguration()), new PushingHandler()); - testHTTP2(); - } - - private void testHTTP2() throws Exception { - MonitoringThreadPoolExecutor executor = new MonitoringThreadPoolExecutor( 1024, 60, TimeUnit.SECONDS); - - AtomicLong requests = new AtomicLong(); - Histogram treeHistogram = new AtomicHistogram(TimeUnit.MICROSECONDS.toNanos(1), TimeUnit.SECONDS.toNanos(10), 3); - Histogram rootHistogram = new AtomicHistogram(TimeUnit.MICROSECONDS.toNanos(1), TimeUnit.SECONDS.toNanos(10), 3); - LoadGenerator loadGenerator = prepareLoadGenerator(new HTTP2ClientTransportRateLimiterBuilder( 3 )) - .warmupIterationsPerThread(10) - .iterationsPerThread(100) -// .warmupIterationsPerThread(1000) -// .runFor(2, TimeUnit.MINUTES) - .usersPerThread(100) - .channelsPerUser(1000) - .resourceRate(20) - .executor(executor) - .resourceListener((Resource.TreeListener)info -> { - rootHistogram.recordValue(info.getResponseTime() - info.getRequestTime()); - treeHistogram.recordValue(info.getTreeTime() - info.getRequestTime()); - }) - .requestListener(new Request.Listener.Adapter() { - @Override - public void onQueued(Request request) { - requests.incrementAndGet(); - } - }) - .requestListener(new Request.Listener.Adapter() { - @Override - public void onBegin(Request request) { - requests.decrementAndGet(); - } - }) - .build(); - - serverStats.statsReset(); - loadGenerator.begin().join(); - long elapsed = serverStats.getStatsOnMs(); - - Assert.assertEquals(0, requests.get()); - - int serverRequests = serverStats.getRequests(); - System.err.printf("%nserver - requests: %d, rate: %.3f, max_request_time: %d%n%n", - serverRequests, - elapsed > 0 ? serverRequests * 1000F / elapsed : 0F, - serverStats.getRequestTimeMax()); - - HistogramSnapshot treeSnapshot = new HistogramSnapshot(treeHistogram, 20, "tree response time", "us", TimeUnit.NANOSECONDS::toMicros); - System.err.println(treeSnapshot); - HistogramSnapshot rootSnapshot = new HistogramSnapshot(rootHistogram, 20, "root response time", "us", TimeUnit.NANOSECONDS::toMicros); - System.err.println(rootSnapshot); - - System.err.printf("client thread pool - max_threads: %d, max_queue_size: %d, max_queue_latency: %dms%n%n", - executor.getMaxActiveThreads(), - executor.getMaxQueueSize(), - TimeUnit.NANOSECONDS.toMillis(executor.getMaxQueueLatency()) - ); - - executor.shutdown(); - } - - private class PushingHandler extends TestHandler { - @Override - public void handle(String target, org.eclipse.jetty.server.Request jettyRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - if (target.equals("/")) { - for (Resource resource : resource.getResources()) { - jettyRequest.getPushBuilder() - .path(resource.getPath()) - .setHeader(Resource.RESPONSE_LENGTH, Integer.toString(resource.getResponseLength())) - .push(); - } - } - super.handle(target, jettyRequest, request, response); - } - } -} diff --git a/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/AbstractLoadGeneratorStarter.java b/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/AbstractLoadGeneratorStarter.java index ebb029ce..ffebb0e1 100644 --- a/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/AbstractLoadGeneratorStarter.java +++ b/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/AbstractLoadGeneratorStarter.java @@ -30,9 +30,7 @@ import org.eclipse.jetty.util.ssl.SslContextFactory; import org.eclipse.jetty.xml.XmlConfiguration; import org.mortbay.jetty.load.generator.HTTP1ClientTransportBuilder; -import org.mortbay.jetty.load.generator.HTTP1ClientTransportRateLimiterBuilder; import org.mortbay.jetty.load.generator.HTTP2ClientTransportBuilder; -import org.mortbay.jetty.load.generator.HTTP2ClientTransportRateLimiterBuilder; import org.mortbay.jetty.load.generator.HTTPClientTransportBuilder; import org.mortbay.jetty.load.generator.LoadGenerator; import org.mortbay.jetty.load.generator.Resource; @@ -77,7 +75,7 @@ public void run() .iterationsPerThread( starterArgs.getRunIteration() ) // .usersPerThread( starterArgs.getUsers() ) // .resourceRate( starterArgs.getTransactionRate() ) // - .httpClientTransportBuilder( httpClientTransportBuilder() ) // + .httpClientTransportBuilder( getHttpClientTransportBuilder() ) // .sslContextFactory( sslContextFactory() ) // .warmupIterationsPerThread( starterArgs.getWarmupNumber() ) // .scheme( starterArgs.getScheme() ); // @@ -276,7 +274,7 @@ public void setResource( Resource resource ) this.resource = resource; } - public HTTPClientTransportBuilder httpClientTransportBuilder() + public HTTPClientTransportBuilder getHttpClientTransportBuilder() { int transactionRate = getStarterArgs().getTransactionRate(); switch ( getStarterArgs().getTransport() ) @@ -284,31 +282,12 @@ public HTTPClientTransportBuilder httpClientTransportBuilder() case HTTP: case HTTPS: { - if ( transactionRate > 1 && getStarterArgs().isUseRateLimiter() ) - { - logger.info( "use RateLimiter" ); - return new HTTP1ClientTransportRateLimiterBuilder( transactionRate ) // - .selectors( getStarterArgs().getSelectors() ); - } - else - { - return new HTTP1ClientTransportBuilder().selectors( getStarterArgs().getSelectors() ); - } + return new HTTP1ClientTransportBuilder().selectors( getStarterArgs().getSelectors() ); } case H2C: case H2: { - if ( transactionRate > 1 && getStarterArgs().isUseRateLimiter() ) - { - logger.info( "use RateLimiter" ); - return new HTTP2ClientTransportRateLimiterBuilder( transactionRate ) // - .selectors( getStarterArgs().getSelectors() ); - } - else - { - return new HTTP2ClientTransportBuilder().selectors( getStarterArgs().getSelectors() ); - } - + return new HTTP2ClientTransportBuilder().selectors( getStarterArgs().getSelectors() ); } default: { @@ -316,7 +295,7 @@ public HTTPClientTransportBuilder httpClientTransportBuilder() } } - throw new IllegalArgumentException( "unknown httpClientTransportBuilder" ); + throw new IllegalArgumentException( "unknown getHttpClientTransportBuilder" ); } public SslContextFactory sslContextFactory() diff --git a/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/LoadGeneratorStarterArgs.java b/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/LoadGeneratorStarterArgs.java index 6f029c3b..889aea8a 100644 --- a/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/LoadGeneratorStarterArgs.java +++ b/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/LoadGeneratorStarterArgs.java @@ -106,9 +106,6 @@ public class LoadGeneratorStarterArgs @Parameter( names = { "--channel-per-user", "-cpu" }, description = "Connections per user" ) private int channelPerUser = -1; - @Parameter( names = { "--use-rate-limiter", "-url" }, description = "Use RateLimiter" ) - private boolean useRateLimiter = false; - public LoadGeneratorStarterArgs() { // no op @@ -395,16 +392,6 @@ public void setChannelPerUser( int channelPerUser ) this.channelPerUser = channelPerUser; } - public boolean isUseRateLimiter() - { - return useRateLimiter; - } - - public void setUseRateLimiter( boolean useRateLimiter ) - { - this.useRateLimiter = useRateLimiter; - } - @Override public String toString() { @@ -417,7 +404,7 @@ public String toString() + notInterrupt + ", statsFile='" + statsFile + '\'' + ", params=" + params + ", help=" + help + ", displayStatsAtEnd=" + displayStatsAtEnd + ", collectServerStats=" + collectServerStats + ", warmupNumber=" + warmupNumber + ", maxRequestsQueued=" + maxRequestsQueued + ", channelPerUser=" - + channelPerUser + ", useRateLimiter=" + useRateLimiter + '}'; + + channelPerUser + '}'; } public enum Transport { diff --git a/pom.xml b/pom.xml index f694fbb0..21fc52ce 100644 --- a/pom.xml +++ b/pom.xml @@ -83,12 +83,6 @@ HdrHistogram 2.1.9 - - com.google.guava - guava - 22.0 - true - com.fasterxml.jackson.core jackson-databind