/*
* Copyright 2008-2009 LinkedIn, Inc
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package voldemort.performance;
import java.util.concurrent.TimeUnit;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.params.CookiePolicy;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.conn.SchemeRegistryFactory;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import voldemort.utils.VoldemortIOUtils;
public class HttpClientBench {
private static final int DEFAULT_CONNECTION_MANAGER_TIMEOUT = 100000;
private static final int DEFAULT_MAX_CONNECTIONS = 10;
private static final int DEFAULT_MAX_HOST_CONNECTIONS = 10;
private static final String VOLDEMORT_USER_AGENT = "vldmrt/0.01";
public static void main(String[] args) throws Exception {
if(args.length < 3) {
System.err.println("USAGE: java HttpClientBench url numThreads numRequests");
System.exit(1);
}
final String url = args[0];
final int numThreads = Integer.parseInt(args[1]);
final int numRequests = Integer.parseInt(args[2]);
System.out.println("Benchmarking against " + url);
final HttpClient client = createClient();
PerformanceTest perfTest = new PerformanceTest() {
@Override
public void doOperation(int index) {
HttpResponse response = null;
try {
HttpGet get = new HttpGet(url);
response = client.execute(get);
response.getEntity().consumeContent();
} catch(Exception e) {
e.printStackTrace();
} finally {
VoldemortIOUtils.closeQuietly(response);
}
}
};
perfTest.run(numRequests, numThreads);
perfTest.printStats();
VoldemortIOUtils.closeQuietly(client);
System.exit(1);
}
private static HttpClient createClient() {
ThreadSafeClientConnManager connectionManager = new ThreadSafeClientConnManager(SchemeRegistryFactory.createDefault(),
DEFAULT_CONNECTION_MANAGER_TIMEOUT,
TimeUnit.MILLISECONDS);
DefaultHttpClient httpClient = new DefaultHttpClient(connectionManager);
HttpParams clientParams = httpClient.getParams();
HttpConnectionParams.setSocketBufferSize(clientParams, 60000);
HttpConnectionParams.setTcpNoDelay(clientParams, false);
HttpProtocolParams.setUserAgent(clientParams, VOLDEMORT_USER_AGENT);
HttpProtocolParams.setVersion(clientParams, HttpVersion.HTTP_1_1);
// HostConfiguration hostConfig = new HostConfiguration();
// hostConfig.setHost("localhost");
HttpConnectionParams.setConnectionTimeout(clientParams, DEFAULT_CONNECTION_MANAGER_TIMEOUT);
HttpConnectionParams.setSoTimeout(clientParams, 500);
httpClient.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(0, false));
HttpClientParams.setCookiePolicy(clientParams, CookiePolicy.IGNORE_COOKIES);
connectionManager.setMaxTotal(DEFAULT_MAX_CONNECTIONS);
connectionManager.setDefaultMaxPerRoute(DEFAULT_MAX_HOST_CONNECTIONS);
HttpConnectionParams.setStaleCheckingEnabled(clientParams, false);
return httpClient;
}
}