<?xml version="1.0"?> <!DOCTYPE flood SYSTEM "flood.dtd"> <!-- Hi, I'm a flood config file. They call me "round-robin.xml" I am an example of a "round-robin" configuration. All of the URLs in the urllist "Test Hosts" will be hit in sequential order. Flood's syntax is XML based. After compiling flood (./configure && make), you can execute me as: ./flood examples/round-robin.xml (The path to me.) Flood will then output data to stdout in the format as specified below (relative_times) for each URL that it hits: 998951597871780 1389 57420 7960273 7960282 OK 4 http://www.apache.org/ The columns are as follows: - Absolute Time in usec that the request was started by flood - Relative Time in usec (to first column) that it took to open the socket to the specified server - Relative Time in usec (to first column) that it took to write the generated request to the server. - Relative Time in usec (to first column) that it took to read the generated response from the server. - Relative Time in usec (to first column) that it took to close the socket. On a keepalive socket, it may not close the socket. - OK/FAIL indicates what the verification module (in this case, verify_200) thought of the request. - The thread/process id of the farmer that made the request. - The URL that was hit (without query strings) To get a "nice" summary of the output (as well as an idea of how to further process this info), try out: ./flood examples/round-robin.xml > my-output ./examples/analyze-relative my-output --> <flood configversion="1"> <!-- A urllist describes which hosts and which methods we want to hit. --> <urllist> <name>Test Hosts</name> <description>A bunch of hosts we want to hit</description> <!-- We first send a POST request to search.apache.org looking for "foo" Notice the payload attribute - this allows us to specify the POST content. --> <url method="POST" payload="version=2&keyword=foo&results=20&what=apr.apache.org">http://search.apache.org/index.cgi</url> <!-- Then, we perform a HEAD request on www.apache.org --> <url method="HEAD">http://www.apache.org/</url> <!-- Then, we retrieve the index page of dev.apache.org --> <url method="GET">http://dev.apache.org/</url> <!-- The default method is "GET", so let's get APR's index page. --> <url>http://apr.apache.org/</url> </urllist> <!-- The profile describes how we will hit the urllists. For this example, we execute with the round_robin profile. Round robin runs all of the URLs in the urllist in order once. --> <profile> <name>Example Profile</name> <description>A Test Round Robin Configuration</description> <!-- See above. This indicates which URLs we will hit. --> <useurllist>Test Hosts</useurllist> <!-- Specifies that we will use round_robin profile logic --> <profiletype>round_robin</profiletype> <!-- Specifies that we will use generic socket logic We also have "keepalive" as an option - this option indicates that we should attempt to use HTTP Keepalive when available. --> <socket>generic</socket> <!-- Specifies that we will use verify_200 for response verification This verification step ensures that we received a 2xx or 3xx status code from the server. --> <verify_resp>verify_200</verify_resp> <!-- Specifies that we will use the "relative_times" report generation We also have "easy" - this option is similar to "relative_times", but the times posted are absolute instead of relative to the start of the request. --> <report>relative_times</report> </profile> <!-- A farmer runs one profile a certain number of times. This farmer is called Joe. --> <farmer> <name>Joe</name> <!-- We run the Joe farmer 5 times Note that we have the "time" option which indicates for how many seconds a farmer should run. The "time" and "count" elements are exclusive. --> <count>5</count> <!-- Farmer Joe uses this profile --> <useprofile>Example Profile</useprofile> </farmer> <!-- A farm contains a bunch of farmers - each farmer is an independent worker (i.e. a thread or child process). --> <farm> <!-- We call our farm "Bingo" - note that the farm must be called Bingo in the current implementation. --> <name>Bingo</name> <!-- We will start 5 farmers named Joe. We will start 2 farmers every 5 seconds. --> <usefarmer count="5" startcount="2" startdelay="5">Joe</usefarmer> </farm> <!-- Set the seed to a known value so we can reproduce the same tests. Flood uses a seeded PRNG - this allows the tests which use random numbers to be reproduced. --> <seed>1</seed> </flood> <!-- That's all folks! -->