ab.c revision e5d11e25c54c1bd138a5fc1114ea44debdf67844
08cb74ca432a8c24e39f17dedce527e6a47b8001jerenkrantz/* ====================================================================
08cb74ca432a8c24e39f17dedce527e6a47b8001jerenkrantz * The Apache Software License, Version 1.1
04891cf70e0bfc38bfb027541dc821f04c754ff7nd * Copyright (c) 2000-2002 The Apache Software Foundation. All rights
04891cf70e0bfc38bfb027541dc821f04c754ff7nd * reserved.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * Redistribution and use in source and binary forms, with or without
04891cf70e0bfc38bfb027541dc821f04c754ff7nd * modification, are permitted provided that the following conditions
04891cf70e0bfc38bfb027541dc821f04c754ff7nd * 1. Redistributions of source code must retain the above copyright
04891cf70e0bfc38bfb027541dc821f04c754ff7nd * notice, this list of conditions and the following disclaimer.
04891cf70e0bfc38bfb027541dc821f04c754ff7nd * 2. Redistributions in binary form must reproduce the above copyright
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * notice, this list of conditions and the following disclaimer in
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * the documentation and/or other materials provided with the
3568de757bac0b47256647504c186d17ca272f85rbb * distribution.
3568de757bac0b47256647504c186d17ca272f85rbb * 3. The end-user documentation included with the redistribution,
3568de757bac0b47256647504c186d17ca272f85rbb * if any, must include the following acknowledgment:
3568de757bac0b47256647504c186d17ca272f85rbb * "This product includes software developed by the
3568de757bac0b47256647504c186d17ca272f85rbb * Apache Software Foundation (http://www.apache.org/)."
3568de757bac0b47256647504c186d17ca272f85rbb * Alternately, this acknowledgment may appear in the software itself,
3568de757bac0b47256647504c186d17ca272f85rbb * if and wherever such third-party acknowledgments normally appear.
3568de757bac0b47256647504c186d17ca272f85rbb * 4. The names "Apache" and "Apache Software Foundation" must
3568de757bac0b47256647504c186d17ca272f85rbb * not be used to endorse or promote products derived from this
3568de757bac0b47256647504c186d17ca272f85rbb * software without prior written permission. For written
3568de757bac0b47256647504c186d17ca272f85rbb * permission, please contact apache@apache.org.
3568de757bac0b47256647504c186d17ca272f85rbb * 5. Products derived from this software may not be called "Apache",
3568de757bac0b47256647504c186d17ca272f85rbb * nor may "Apache" appear in their name, without prior written
3568de757bac0b47256647504c186d17ca272f85rbb * permission of the Apache Software Foundation.
3568de757bac0b47256647504c186d17ca272f85rbb * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
3568de757bac0b47256647504c186d17ca272f85rbb * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
3568de757bac0b47256647504c186d17ca272f85rbb * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
3568de757bac0b47256647504c186d17ca272f85rbb * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
3568de757bac0b47256647504c186d17ca272f85rbb * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3568de757bac0b47256647504c186d17ca272f85rbb * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3568de757bac0b47256647504c186d17ca272f85rbb * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
3568de757bac0b47256647504c186d17ca272f85rbb * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
3568de757bac0b47256647504c186d17ca272f85rbb * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
3568de757bac0b47256647504c186d17ca272f85rbb * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
3568de757bac0b47256647504c186d17ca272f85rbb * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3568de757bac0b47256647504c186d17ca272f85rbb * SUCH DAMAGE.
3568de757bac0b47256647504c186d17ca272f85rbb * ====================================================================
3568de757bac0b47256647504c186d17ca272f85rbb * This software consists of voluntary contributions made by many
3568de757bac0b47256647504c186d17ca272f85rbb * individuals on behalf of the Apache Software Foundation. For more
3568de757bac0b47256647504c186d17ca272f85rbb * information on the Apache Software Foundation, please see
3568de757bac0b47256647504c186d17ca272f85rbb * Portions of this software are based upon public domain software
3568de757bac0b47256647504c186d17ca272f85rbb * originally written at the National Center for Supercomputing Applications,
3568de757bac0b47256647504c186d17ca272f85rbb * University of Illinois, Urbana-Champaign.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding ** This program is based on ZeusBench V1.0 written by Adam Twiss
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding ** which is Copyright (c) 1996 by Zeus Technology Ltd. http://www.zeustech.net/
cd8f8c995d415473f3bfb0b329b2450f2a722c3atrawick ** This software is provided "as is" and any express or implied waranties,
3568de757bac0b47256647504c186d17ca272f85rbb ** including but not limited to, the implied warranties of merchantability and
3568de757bac0b47256647504c186d17ca272f85rbb ** fitness for a particular purpose are disclaimed. In no event shall
3568de757bac0b47256647504c186d17ca272f85rbb ** Zeus Technology Ltd. be liable for any direct, indirect, incidental, special,
3568de757bac0b47256647504c186d17ca272f85rbb ** exemplary, or consequential damaged (including, but not limited to,
98fb535f829e2a95aabd82420931f476661fa8e3jorton ** procurement of substitute good or services; loss of use, data, or profits;
db12cd62083041bf90945eeb90cc40fbd2340797trawick ** or business interruption) however caused and on theory of liability. Whether
db12cd62083041bf90945eeb90cc40fbd2340797trawick ** in contract, strict liability or tort (including negligence or otherwise)
db12cd62083041bf90945eeb90cc40fbd2340797trawick ** arising in any way out of the use of this software, even if advised of the
333eac96e4fb7d6901cb75e6ca7bb22b2ccb84cetrawick ** possibility of such damage.
3568de757bac0b47256647504c186d17ca272f85rbb ** HISTORY:
3568de757bac0b47256647504c186d17ca272f85rbb ** - Originally written by Adam Twiss <adam@zeus.co.uk>, March 1996
3568de757bac0b47256647504c186d17ca272f85rbb ** with input from Mike Belshe <mbelshe@netscape.com> and
3568de757bac0b47256647504c186d17ca272f85rbb ** Michael Campanella <campanella@stevms.enet.dec.com>
3568de757bac0b47256647504c186d17ca272f85rbb ** - Enhanced by Dean Gaudet <dgaudet@apache.org>, November 1997
3568de757bac0b47256647504c186d17ca272f85rbb ** - Cleaned up by Ralf S. Engelschall <rse@apache.org>, March 1998
3568de757bac0b47256647504c186d17ca272f85rbb ** - POST and verbosity by Kurt Sussman <kls@merlot.com>, August 1998
3568de757bac0b47256647504c186d17ca272f85rbb ** - HTML table output added by David N. Welton <davidw@prosa.it>, January 1999
3568de757bac0b47256647504c186d17ca272f85rbb ** - Added Cookie, Arbitrary header and auth support. <dirkx@webweaving.org>, April 1999
3568de757bac0b47256647504c186d17ca272f85rbb ** Version 1.3d
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz ** - Increased version number - as some of the socket/error handling has
3568de757bac0b47256647504c186d17ca272f85rbb ** fundamentally changed - and will give fundamentally different results
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz ** in situations where a server is dropping requests. Therefore you can
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz ** no longer compare results of AB as easily. Hence the inc of the version.
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz ** They should be closer to the truth though. Sander & <dirkx@covalent.net>, End 2000.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding ** - Fixed proxy functionality, added median/mean statistics, added gnuplot
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz ** output option, added _experimental/rudimentary_ SSL support. Added
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding ** confidence guestimators and warnings. Sander & <dirkx@covalent.net>, End 2000
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding ** - Fixed serious int overflow issues which would cause realistic (longer
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding ** than a few minutes) run's to have wrong (but believable) results. Added
8f3ec4772d2aeb347cf40e87c77627bb784dd018rbb ** trapping of connection errors which influenced measurements.
8f3ec4772d2aeb347cf40e87c77627bb784dd018rbb ** Contributed by Sander Temme - <sctemme@covalent.net>, Early 2001
3d96ee83babeec32482c9082c9426340cee8c44dwrowe ** Version 1.3e
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding ** - Changed timeout behavour during write to work whilst the sockets
b6e310e482c42cc323a28fa6fec653e11e0552e5jorton ** are filling up and apr_write() does writes a few - but not all.
cd8f8c995d415473f3bfb0b329b2450f2a722c3atrawick ** This will potentially change results. <dirkx@webweaving.org>, April 2001
7cd5419264796cfeaf8215383cf0f89130a81fectrawick * - has various other poor buffer attacks related to the lazy parsing of
7cd5419264796cfeaf8215383cf0f89130a81fectrawick * response headers from the server
7cd5419264796cfeaf8215383cf0f89130a81fectrawick * - doesn't implement much of HTTP/1.x, only accepts certain forms of
7cd5419264796cfeaf8215383cf0f89130a81fectrawick * responses
7cd5419264796cfeaf8215383cf0f89130a81fectrawick * - (performance problem) heavy use of strstr shows up top in profile
7cd5419264796cfeaf8215383cf0f89130a81fectrawick * only an issue for loopback usage
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz/* -------------------------------------------------------------------- */
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz/* Hmmm... This source code isn't being compiled in ASCII.
3568de757bac0b47256647504c186d17ca272f85rbb * In order for data that flows over the network to make
3568de757bac0b47256647504c186d17ca272f85rbb * sense, we need to translate to/from ASCII.
3568de757bac0b47256647504c186d17ca272f85rbb/* affects include files on Solaris */
fc1efab92032301e317f07e1b3a00082d9d71f3frbb/* Libraries on most systems.. */
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz/* Libraries for RSAref and SYSSSL */
3568de757bac0b47256647504c186d17ca272f85rbb/* ------------------- DEFINITIONS -------------------------- */
3568de757bac0b47256647504c186d17ca272f85rbb/* maximum number of requests on a time limited test */
3568de757bac0b47256647504c186d17ca272f85rbb/* good old state hostname */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding apr_size_t rwrite, rwrote; /* keep pointers in what we write - across
3568de757bac0b47256647504c186d17ca272f85rbb * EAGAINs */
239f998fbee5ac5b114b965bb76e217cce0003edstoddard apr_size_t length; /* Content-Length value used for keep-alive */
78ae889ffe0fdfab72f56c6993b0f302cb48da55rbb char cbuff[CBUFFSIZE]; /* a buffer to store server response header */
6653a33e820463abd4f81915b7a1eba0f602e200brianp int keepalive; /* non-zero if a keep-alive request */
6653a33e820463abd4f81915b7a1eba0f602e200brianp int gotheader; /* non-zero if we have the entire header in
3568de757bac0b47256647504c186d17ca272f85rbb /* XXXX insert SSL timings */
e8f95a682820a599fe41b22977010636be5c2717jim apr_time_t starttime; /* start time of connection in seconds since
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz * Jan. 1, 1970 */
ca53a74f4012a45cbad48e940eddf27d866981f9dougm apr_interval_time_t waittime; /* Between writing request and reading
ca53a74f4012a45cbad48e940eddf27d866981f9dougm * response */
ca53a74f4012a45cbad48e940eddf27d866981f9dougm apr_interval_time_t ctime; /* time in ms to connect */
6653a33e820463abd4f81915b7a1eba0f602e200brianp apr_interval_time_t time; /* time in ms for connection */
6653a33e820463abd4f81915b7a1eba0f602e200brianp#define ap_min(a,b) ((a)<(b))?(a):(b)
6653a33e820463abd4f81915b7a1eba0f602e200brianp#define ap_max(a,b) ((a)>(b))?(a):(b)
6653a33e820463abd4f81915b7a1eba0f602e200brianp/* --------------------- GLOBALS ---------------------------- */
6653a33e820463abd4f81915b7a1eba0f602e200brianpint heartbeatres = 100; /* How often do we say we're alive */
6653a33e820463abd4f81915b7a1eba0f602e200brianpint concurrency = 1; /* Number of multiple requests to make */
6653a33e820463abd4f81915b7a1eba0f602e200brianpint confidence = 1; /* Show confidence estimator and warnings */
cd8f8c995d415473f3bfb0b329b2450f2a722c3atrawickint keepalive = 0; /* try and do keepalive connections */
cd8f8c995d415473f3bfb0b329b2450f2a722c3atrawickchar servername[1024]; /* name that server reports */
239f998fbee5ac5b114b965bb76e217cce0003edstoddardchar *host_field; /* value of "Host:" header field */
3568de757bac0b47256647504c186d17ca272f85rbbchar postfile[1024]; /* name of file containing post data */
3568de757bac0b47256647504c186d17ca272f85rbbchar *postdata; /* *buffer containing data from postfile */
12901074f5d6b36d08be84d8637b6f2c21e0da26trawickapr_size_t postlen = 0; /* length of data to be POSTed */
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddardchar content_type[1024]; /* content type to put in POST header */
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz * authentification */
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddardapr_short_interval_time_t aprtimeout = 30 * APR_USEC_PER_SEC; /* timeout value */
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz * XXX - this is now a per read/write transact type of value
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddardapr_size_t doclen = 0; /* the length the document should be */
e8f95a682820a599fe41b22977010636be5c2717jimlong started = 0; /* number of requests started, so no excess */
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantzlong totalread = 0; /* total number of bytes read */
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantzlong totalbread = 0; /* totoal amount of entity body read */
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddardlong totalposted = 0; /* total number of bytes posted, inc. headers */
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddardlong done = 0; /* number of requests we have done */
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddardlong doneka = 0; /* number of keep alive connections done */
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddardlong good = 0, bad = 0; /* number of good and bad requests */
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddard/* store error cases */
3568de757bac0b47256647504c186d17ca272f85rbb/* global request (and its length) */
7cd5419264796cfeaf8215383cf0f89130a81fectrawick/* one global throw-away buffer to read stuff into */
cd8f8c995d415473f3bfb0b329b2450f2a722c3atrawick/* interesting percentiles */
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddardstatic void close_connection(struct connection * c);
5a0f707b48da7703cbe6bc087f13a6735b1c742dgregames/* --------------------------------------------------------- */
5a0f707b48da7703cbe6bc087f13a6735b1c742dgregames/* simple little function to write an error string and exit */
5a0f707b48da7703cbe6bc087f13a6735b1c742dgregamesstatic void err(char *s)
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz printf("Total of %ld requests completed\n" , done);
7cd5419264796cfeaf8215383cf0f89130a81fectrawick/* simple little function to write an APR error string and exit */
7cd5419264796cfeaf8215383cf0f89130a81fectrawick "%s: %s (%d)\n",
7cd5419264796cfeaf8215383cf0f89130a81fectrawick/* --------------------------------------------------------- */
7cd5419264796cfeaf8215383cf0f89130a81fectrawick/* write out request to a connection - assumes we can write
7cd5419264796cfeaf8215383cf0f89130a81fectrawick * (small) request out in one go into our new socket buffer
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddard * First time round ?
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddard if (c->rwrite == 0) {
3568de757bac0b47256647504c186d17ca272f85rbb * Bail early on the most common case
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddard if (l == c->rwrite)
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddard * Let's hope this traps EWOULDBLOCK too !
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz } while (1);
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddard/* --------------------------------------------------------- */
f714f1a7002928d785e53e70349700a7f595fee3trawick/* calculate and output results */
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddardstatic int comprando(struct data * a, struct data * b)
3568de757bac0b47256647504c186d17ca272f85rbb return -1;
3568de757bac0b47256647504c186d17ca272f85rbb return +1;
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddardstatic int compwait(struct data * a, struct data * b)
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddardstatic void output_results(void)
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz printf("Document Length: %" APR_SIZE_T_FMT " bytes\n", doclen);
cd8f8c995d415473f3bfb0b329b2450f2a722c3atrawick printf("Total transferred: %ld bytes\n", totalread);
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz printf("HTML transferred: %ld bytes\n", totalbread);
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddard /* avoid divide by zero */
fe6baec9bbcd36f932b71a355120cd7b5a685d6cfielding printf("Requests per second: %.2f [#/sec] (mean)\n",
3568de757bac0b47256647504c186d17ca272f85rbb printf("Time per request: %.3f [ms] (mean, across all concurrent requests)\n",
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddard printf("Transfer rate: %.2f [Kbytes/sec] received\n",
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddard (float) ((totalread + totalposted) / timetaken / 1024));
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddard /* work out connection times */
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddard apr_time_t totalcon = 0, total = 0, totald = 0, totalwait = 0;
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddard apr_interval_time_t mincon = AB_MAX, mintot = AB_MAX, mind = AB_MAX,
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddard apr_interval_time_t maxcon = 0, maxtot = 0, maxd = 0, maxwait = 0;
c0659e61002e9d6ff77b2dca72540e0af1b2ca64stoddard apr_interval_time_t meancon = 0, meantot = 0, meand = 0, meanwait = 0;
cd8f8c995d415473f3bfb0b329b2450f2a722c3atrawick for (i = 0; i < requests; i++) {
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick for (i = 0; i < requests; i++) {
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz sdtot = (requests > 1) ? sqrt(sdtot / (requests - 1)) : 0;
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz sdcon = (requests > 1) ? sqrt(sdcon / (requests - 1)) : 0;
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz sdd = (requests > 1) ? sqrt(sdd / (requests - 1)) : 0;
64c351fd973428b5bb4c28e983fa86875ea4e60fdougm sdwait = (requests > 1) ? sqrt(sdwait / (requests - 1)) : 0;
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz fprintf(out, "starttime\tseconds\tctime\tdtime\tttime\twait\n");
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz for (i = 0; i < requests; i++) {
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz apr_time_t diff = stats[i].time - stats[i].ctime;
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz tmstring[strlen(tmstring) - 1] = '\0'; /* ctime returns a
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz * string with a
64c351fd973428b5bb4c28e983fa86875ea4e60fdougm * trailing newline */
64c351fd973428b5bb4c28e983fa86875ea4e60fdougm fprintf(out, "%s\t%" APR_TIME_T_FMT "\t%" APR_TIME_T_FMT "\t%" APR_TIME_T_FMT "\t%" APR_TIME_T_FMT "\t%" APR_TIME_T_FMT "\n",
36c8049de63c446926139936c3d195330a0539cetrawick * XXX: what is better; this hideous cast of the compradre function; or
36c8049de63c446926139936c3d195330a0539cetrawick * the four warnings during compile ? dirkx just does not know and
e8f95a682820a599fe41b22977010636be5c2717jim * hates both/
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick (int (*) (const void *, const void *)) compradre);
36c8049de63c446926139936c3d195330a0539cetrawick meancon = (stats[requests / 2].ctime + stats[requests / 2 + 1].ctime) / 2;
cb97ae2ff6969c2789b8e03f1bc4187fa73b6bafwrowe (int (*) (const void *, const void *)) compri);
36c8049de63c446926139936c3d195330a0539cetrawick meand = (stats[requests / 2].time + stats[requests / 2 + 1].time \
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick -stats[requests / 2].ctime - stats[requests / 2 + 1].ctime) / 2;
64c351fd973428b5bb4c28e983fa86875ea4e60fdougm meand = stats[requests / 2].time - stats[requests / 2].ctime;
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick (int (*) (const void *, const void *)) compwait);
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick meanwait = (stats[requests / 2].waittime + stats[requests / 2 + 1].waittime) / 2;
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick (int (*) (const void *, const void *)) comprando);
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick meantot = (stats[requests / 2].time + stats[requests / 2 + 1].time) / 2;
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick#define CONF_FMT_STRING "%" APR_TIME_T_FMT " %5d %6.1f %" APR_TIME_T_FMT " %" APR_TIME_T_FMT "\n"
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick mincon, (int) (totalcon + 0.5), sdcon, meancon, maxcon);
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick minwait, (int) (totalwait + 0.5), sdwait, meanwait, maxwait);
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick mintot, (int) (total + 0.5), sdtot, meantot, maxtot);
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick if (d < 0) d = -d; \
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick printf("ERROR: The median and mean for " what " are more than twice the standard\n" \
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick " deviation apart. These results are NOT reliable.\n"); \
e8f95a682820a599fe41b22977010636be5c2717jim else if (d > sd ) \
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick printf("WARING: The median and mean for " what " are not within a normal deviation\n" \
f886987cd0bd4220c14043c4d9be77ec22902e73trawick " These results are propably not that reliable.\n"); \
f886987cd0bd4220c14043c4d9be77ec22902e73trawick SANE("the initial connection time", totalcon, meancon, sdcon);
f886987cd0bd4220c14043c4d9be77ec22902e73trawick SANE("the waiting time", totalwait, meanwait, sdwait);
3568de757bac0b47256647504c186d17ca272f85rbb#define CONF_FMT_STRING "%5" APR_TIME_T_FMT " %5" APR_TIME_T_FMT "%5" APR_TIME_T_FMT "\n"
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick printf("Processing: " CONF_FMT_STRING, mintot - mincon,
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick /* Sorted on total connect times */
64c351fd973428b5bb4c28e983fa86875ea4e60fdougm printf("\nPercentage of the requests served within a certain time (ms)\n");
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick for (i = 0; i < sizeof(percs) / sizeof(int); i++)
64c351fd973428b5bb4c28e983fa86875ea4e60fdougm if (percs[i] <= 0)
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick printf(" 100%% %5" APR_TIME_T_FMT " (longest request)\n",
36c8049de63c446926139936c3d195330a0539cetrawick fprintf(out, "" "Percentage served" "," "Time in ms" "\n");
36c8049de63c446926139936c3d195330a0539cetrawick for (i = 0; i < 100; i++) {
e8f95a682820a599fe41b22977010636be5c2717jim if (i == 0)
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick else if (i == 100)
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick/* --------------------------------------------------------- */
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick/* calculate and output results in HTML */
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawickstatic void output_html_results(void)
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick printf("<tr %s><th colspan=2 %s>Server Software:</th>"
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick "<td colspan=2 %s>%s</td></tr>\n",
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick printf("<tr %s><th colspan=2 %s>Server Hostname:</th>"
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick "<td colspan=2 %s>%s</td></tr>\n",
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick "<td colspan=2 %s>%hd</td></tr>\n",
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick printf("<tr %s><th colspan=2 %s>Document Path:</th>"
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick "<td colspan=2 %s>%s</td></tr>\n",
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick printf("<tr %s><th colspan=2 %s>Document Length:</th>"
e8f95a682820a599fe41b22977010636be5c2717jim "<td colspan=2 %s>%" APR_SIZE_T_FMT " bytes</td></tr>\n",
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick printf("<tr %s><th colspan=2 %s>Concurrency Level:</th>"
f886987cd0bd4220c14043c4d9be77ec22902e73trawick "<td colspan=2 %s>%d</td></tr>\n",
f886987cd0bd4220c14043c4d9be77ec22902e73trawick printf("<tr %s><th colspan=2 %s>Time taken for tests:</th>"
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick "<td colspan=2 %s>%qd.%03qd seconds</td></tr>\n",
f886987cd0bd4220c14043c4d9be77ec22902e73trawick trstring, tdstring, tdstring, timetaken / APR_USEC_PER_SEC, timetaken % APR_USEC_PER_SEC);
64c351fd973428b5bb4c28e983fa86875ea4e60fdougm printf("<tr %s><th colspan=2 %s>Complete requests:</th>"
64c351fd973428b5bb4c28e983fa86875ea4e60fdougm "<td colspan=2 %s>%ld</td></tr>\n",
64c351fd973428b5bb4c28e983fa86875ea4e60fdougm printf("<tr %s><th colspan=2 %s>Failed requests:</th>"
3568de757bac0b47256647504c186d17ca272f85rbb "<td colspan=2 %s>%ld</td></tr>\n",
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick printf("<tr %s><td colspan=4 %s > (Connect: %d, Length: %d, Exceptions: %d)</td></tr>\n",
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick printf("<tr %s><th colspan=2 %s>Non-2xx responses:</th>"
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick "<td colspan=2 %s>%d</td></tr>\n",
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick printf("<tr %s><th colspan=2 %s>Keep-Alive requests:</th>"
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick "<td colspan=2 %s>%ld</td></tr>\n",
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick printf("<tr %s><th colspan=2 %s>Total transferred:</th>"
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick "<td colspan=2 %s>%ld bytes</td></tr>\n",
64c351fd973428b5bb4c28e983fa86875ea4e60fdougm "<td colspan=2 %s>%ld</td></tr>\n",
64c351fd973428b5bb4c28e983fa86875ea4e60fdougm printf("<tr %s><th colspan=2 %s>HTML transferred:</th>"
8bfe865d8d61be4ba4a89e45427a3c4211ebabdctrawick "<td colspan=2 %s>%ld bytes</td></tr>\n",
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz /* avoid divide by zero */
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz printf("<tr %s><th colspan=2 %s>Requests per second:</th>"
1ec8bd0373f11c07688ec9afbbf778cf78a0bc52wrowe "<td colspan=2 %s>%.2f</td></tr>\n",
3568de757bac0b47256647504c186d17ca272f85rbb trstring, tdstring, tdstring, 1000 * (float) (done) / timetaken);
1ec8bd0373f11c07688ec9afbbf778cf78a0bc52wrowe "<td colspan=2 %s>%.2f kb/s received</td></tr>\n",
1ec8bd0373f11c07688ec9afbbf778cf78a0bc52wrowe trstring, tdstring, tdstring, (float) (totalread) / timetaken);
f886987cd0bd4220c14043c4d9be77ec22902e73trawick "<td colspan=2 %s>%.2f kb/s sent</td></tr>\n",
f886987cd0bd4220c14043c4d9be77ec22902e73trawick "<td colspan=2 %s>%.2f kb/s total</td></tr>\n",
3568de757bac0b47256647504c186d17ca272f85rbb /* work out connection times */
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz apr_interval_time_t mincon = AB_MAX, mintot = AB_MAX;
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz for (i = 0; i < requests; i++) {
98fb535f829e2a95aabd82420931f476661fa8e3jorton if (requests > 0) { /* avoid division by zero (if 0 requests) */
98fb535f829e2a95aabd82420931f476661fa8e3jorton printf("<tr %s><th %s colspan=4>Connnection Times (ms)</th></tr>\n",
98fb535f829e2a95aabd82420931f476661fa8e3jorton printf("<tr %s><th %s> </th> <th %s>min</th> <th %s>avg</th> <th %s>max</th></tr>\n",
3568de757bac0b47256647504c186d17ca272f85rbb trstring, tdstring, tdstring, mincon, tdstring, totalcon / requests, tdstring, maxcon);
3568de757bac0b47256647504c186d17ca272f85rbb trstring, tdstring, tdstring, mintot - mincon, tdstring,
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz (total / requests) - (totalcon / requests), tdstring, maxtot - maxcon);
3568de757bac0b47256647504c186d17ca272f85rbb trstring, tdstring, tdstring, mintot, tdstring, total / requests, tdstring, maxtot);
ec020ca384efb30d501a5af796ddc3bb237d7b8fgregames/* --------------------------------------------------------- */
ce03576b2434cec77f2921db9d5b6a0510581c23rederpj/* start asnchronous non-blocking connection */
7cd5419264796cfeaf8215383cf0f89130a81fectrawick if ((rv = apr_socket_create(&c->aprsock, destsa->family,
302dc1f7b3feee23a91ad8f3cf3cb2edd95a557bmanoj if ((rv = apr_connect(c->aprsock, destsa)) != APR_SUCCESS) {
28c170ac8e99644de58cad454c6e0f9b4b359be6jerenkrantz apr_poll_socket_add(readbits, c->aprsock, APR_POLLOUT);
err_conn++;
start_connect(c);
started++;
write_request(c);
if (good)
bad++;
err_length++;
struct data s;
start_connect(c);
apr_size_t r;
char *part;
r = sizeof(buffer);
good++;
close_connection(c);
totalread += r;
if (c->read == 0) {
c->read += r;
if (!c->gotheader) {
#ifdef NOT_ASCII
if (space) {
err_response++;
start_connect(c);
if (!good) {
q = servername;
err_response++;
if (keepalive &&
char *cl;
if (!cl)
if (cl) {
c->bread += r;
totalbread += r;
good++;
doneka++;
bad++;
err_length++;
struct data s;
c->keepalive = 0;
c->length = 0;
c->gotheader = 0;
c->cbx = 0;
write_request(c);
static void test(void)
#ifdef NOT_ASCII
if (isproxy) {
if (!use_html) {
if (isproxy)
if (posting <= 0) {
#ifdef NOT_ASCII
!= APR_SUCCESS) {
for (i = 0; i < concurrency; i++) {
apr_int32_t n;
n = concurrency;
for (i = 0; i < concurrency; i++) {
bad++;
err_except++;
if (heartbeatres)
if (use_html)
static void copyright(void)
if (!use_html) {
printf("This is ApacheBench, Version %s\n", AP_SERVER_BASEREVISION " <$Revision: 1.90 $> apache-2.0");
printf(" This is ApacheBench, Version %s <i><%s></i> apache-2.0<br>\n", AP_SERVER_BASEREVISION, "$Revision: 1.90 $");
#if USE_SSL
#if USE_SSL
char *cp;
char *scope_id;
#if USE_SSL
return rv;
if (!postdata) {
return APR_ENOMEM;
return rv;
length);
return APR_EINVAL;
const char *optarg;
#ifdef NOT_ASCII
if (status) {
if (status) {
if (status) {
#if USE_SSL
#if USE_SSL
if (!requests) {
heartbeatres = 0;
percentile = 0;
confidence = 0;
if (posting != 0)
else if (postdata) {
exit(r);
optarg++;
optarg++;
copyright();
heartbeatres = 0;
#ifdef USE_SSL
#if SIGPIPE
copyright();
test();