HTTPClient performance seems devastating wrt. ab (apache benchmark): 4300 requests/sec vs. 20 requests/sec, i.e. two orders of magnitute difference, no matter what options I try with HTTPClient.
Source code to reproduce and full data is attached.
If anyone is interested, please let me know what I'm doing wrong, reproduce the effect and/or post working code that performs well in your experience.
ab -k -n 10000 http://localhost:8080/discofish/HelloWorldServlet > /tmp/out
Requests per second: 4313.48 [#/sec] (mean)
(For more data see full output in attachment)
[doggy /home/oliver/g5/users/hoschek] time disco-java.sh gov.lbl.dsd.discofish.client.HTTPBug 100 http://localhost:8080/discofish/HelloWorldServlet > /tmp/out2
real 0m4.876s user 0m0.550s sys 0m0.060s
--> Requests per second: 20.0
(For more data see full output in attachment)
Similar performance gap on static HTML pages (no need to use a servlet).
Environment: httpclient-2.0rc1, jdk-1.4.2, tomcat-4.1.27 (server.xml out of the box), 2GHz Pentium IV, Redhat 8.0.
Thanks, Wolfgang.
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.116 $> apache-2.0 Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient) Server Software: Apache Server Hostname: localhost Server Port: 8080 Document Path: /discofish/HelloWorldServlet Document Length: 8 bytes Concurrency Level: 1 Time taken for tests: 2.210253 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Keep-Alive requests: 9900 Total transferred: 1579500 bytes HTML transferred: 80000 bytes Requests per second: 4524.37 [#/sec] (mean) Time per request: 0.221 [ms] (mean) Time per request: 0.221 [ms] (mean, across all concurrent requests) Transfer rate: 697.66 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.0 0 0 Processing: 0 11 7.6 11 37 Waiting: 0 0 0.5 0 17 Total: 0 11 7.6 11 37 Percentage of the requests served within a certain time (ms) 50% 11 66% 14 75% 16 80% 17 90% 19 95% 26 98% 32 99% 35 100% 37 (longest request)
...................................................................... ..............................goodbye
package gov.lbl.dsd.discofish.client; import java.io.IOException; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpRecoverableException; import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; import org.apache.commons.httpclient.methods.PostMethod; public class HTTPBug { protected HttpClient client; protected String url; public static void main(String[] args) throws Exception { int k=0; int size = 1000; if (args.length > k) size = Integer.parseInt(args[k++]); //String url = "http://localhost:8080/discofish/HelloWorldServlet"; String url = "http://localhost:8080/discofish/index.html"; //String url = "http://itg.lbl.gov/~hoschek/discofish/disco-grep-usage.txt"; if (args.length > k) url = args[k++]; MultiThreadedHttpConnectionManager connMgr = new MultiThreadedHttpConnectionManager(); //connMgr.setMaxConnectionsPerHost(200); //connMgr.setMaxTotalConnections(200); HttpClient client = new HttpClient(connMgr); //HttpClient client = new HttpClient(); for (int i=0; i<size; i++) { PostMethod method = new PostMethod(url); method.setRequestHeader("Content-type", "text/xml; charset=ISO-8859-1"); method.setRequestHeader("Accept", "application/soap+xml, application/dime, multipart/related, text/*"); method.setRequestHeader("SOAPAction", ""); //method.setRequestContentLength(PostMethod.CONTENT_LENGTH_CHUNKED); //method.setRequestBody(XMLUtil.msg2SoapString(new Receive(new TransactionID(), 1, 1, System.currentTimeMillis() + 10000, "single"))); method.setRequestBody("hello"); //method.setRequestContentLength(5); int statusCode = -1; /*Header[] headers; headers = method.getRequestHeaders(); for (int j=0; j < headers.length; j++) { System.out.print(headers[j].toString()); } String requestBody = method.getRequestBodyAsString(); System.out.println(requestBody); System.out.println();*/ try { // execute the method. statusCode = client.executeMethod(method); } catch (HttpRecoverableException e) { System.out.println("A recoverable exception occurred, retrying. " + e.getMessage()); } catch (IOException e) { System.out.println("Failed to download file."); e.printStackTrace(); System.exit(-1); } // Check that we didn't run out of retries. if (statusCode == -1) { System.out.println("Failed to recover from exception."); System.exit(-2); } //String responseBody = method.getResponseBodyAsString(); /*headers = method.getResponseHeaders(); for (int j=0; j < headers.length; j++) { System.out.print(headers[j].toString()); } System.out.println(responseBody);*/ if (i % 70 == 0) System.out.println(); System.out.print('.'); method.releaseConnection(); //method.recycle(); } System.out.println("goodbye"); } }
package gov.lbl.dsd.discofish.server; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloWorldServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { doGet(request, response); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/xml"); ByteArrayOutputStream bytes = new ByteArrayOutputStream(1000); PrintWriter out = new PrintWriter(bytes, true); // true forces flushing out.println("</HTML>"); // Set the content length to the size of the buffer response.setContentLength(bytes.size()); // Send the buffer bytes.writeTo(response.getOutputStream()); /*out.flush(); out.close();*/ //response.flushBuffer(); } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]