Add additional functionality to the integration benchmark perf test

Include agent analysis as well as memory and CPU burn.
This commit is contained in:
Tyler Benson 2018-03-22 13:43:04 +08:00
parent 0d8df99f80
commit d9f4e134f6
4 changed files with 86 additions and 13 deletions

View File

@ -1,5 +1,8 @@
dependencies {
compile project(':dd-trace-api')
compile project(':dd-java-agent:benchmark-integration')
compile deps.opentracing
compile group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.4.1.v20170120'
compile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.4.1.v20170120'
}

View File

@ -1,11 +1,24 @@
package datadog.perftest;
import datadog.trace.api.Trace;
import io.opentracing.Span;
import io.opentracing.util.GlobalTracer;
import java.util.concurrent.TimeUnit;
public class Worker {
@Trace
/** Simulate work for the give number of milliseconds. */
public static void doWork(final long workTimeMS) {
final long doneTimestamp = System.currentTimeMillis() + workTimeMS;
while (System.currentTimeMillis() < doneTimestamp) {
final Span span = GlobalTracer.get().activeSpan();
if (span != null) {
span.setTag("work-time", workTimeMS);
span.setTag("info", "interesting stuff");
span.setTag("additionalInfo", "interesting stuff");
}
final long doneTimestamp = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(workTimeMS);
while (System.nanoTime() < doneTimestamp) {
// busy-wait to simulate work
}
}

View File

@ -1,6 +1,9 @@
package datadog.perftest.jetty;
import datadog.perftest.Worker;
import datadog.trace.api.Trace;
import io.opentracing.Span;
import io.opentracing.util.GlobalTracer;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -49,10 +52,21 @@ public class JettyPerftest {
if (null != workVal) {
workTimeMS = Long.parseLong(workVal);
}
scheduleWork(workTimeMS);
response.getWriter().print("Did " + workTimeMS + "ms of work.");
}
@Trace
private void scheduleWork(final long workTimeMS) {
final Span span = GlobalTracer.get().activeSpan();
if (span != null) {
span.setTag("work-time", workTimeMS);
span.setTag("info", "interesting stuff");
span.setTag("additionalInfo", "interesting stuff");
}
if (workTimeMS > 0) {
Worker.doWork(workTimeMS);
}
response.getWriter().print("Did " + workTimeMS + "ms of work.");
}
}
}

View File

@ -2,9 +2,12 @@
# A script for measuring a server's throughput with or without a java agent.
test_csv_file=/tmp/perf_results.csv
server_output=/tmp/server_output.txt
server_jar=$1
agent_jars="${@:2}"
server_pid=""
agent_pid=$(lsof -i tcp:8126 | awk '$8 == "TCP" { print $2 }')
if [ "$server_jar" = "" ]; then
echo "usage: ./run-perf-test.sh path-to-server-jar path-to-agent1 path-to-agent2..."
@ -19,6 +22,14 @@ if [ "$server_jar" = "" ]; then
exit 1
fi
if [ "$agent_pid" = "" ]; then
echo "discarding traces"
writer_type="LoggingWriter"
else
echo "sending traces to local trace agent: $agent_pid"
writer_type="DDAgentWriter"
fi
if [ -f perf-test-settings.rc ]; then
echo "loading custom settings"
cat ./perf-test-settings.rc
@ -37,20 +48,22 @@ function start_server {
agent_jar="$1"
javaagent_arg=""
if [ "$agent_jar" != "" -a -f "$agent_jar" ]; then
javaagent_arg="-javaagent:$agent_jar -Ddatadog.slf4j.simpleLogger.defaultLogLevel=off -Ddd.writer.type=LoggingWriter -Ddd.service.name=perf-test-app"
javaagent_arg="-javaagent:$agent_jar -Ddatadog.slf4j.simpleLogger.defaultLogLevel=off -Ddd.writer.type=$writer_type -Ddd.service.name=perf-test-app"
fi
echo "starting server: java $javaagent_arg -jar $server_jar"
java $javaagent_arg -jar $server_jar &
server_pid=$!
{ /usr/bin/time -l java $javaagent_arg -jar $server_jar ; } 2> $server_output &
# Block until server is up
until nc -z localhost 8080; do
sleep 0.5
done
server_pid=$(lsof -i tcp:8080 | awk '$8 == "TCP" { print $2 }')
}
# Send a kill signal to the running server
# and block until the server is stopped
function stop_server {
echo "Stopping $server_pid"
kill $server_pid
wait
server_pid=""
@ -63,11 +76,10 @@ function test_endpoint {
url=$1
# warmup
wrk -c $test_num_connections -t$test_num_threads -d ${test_warmup_seconds}s $url >/dev/null
wrk_results=/tmp/wrk_results.`date +%s`
# run test
wrk_results=/tmp/wrk_results.`date +%s`
wrk -c $test_num_connections -t$test_num_threads -d ${test_time_seconds}s $url > $wrk_results
avg_throughput=$(grep "Requests/sec" $wrk_results | grep -o "[0-9.]*$")
echo "$avg_throughput" >> $wrk_results
echo $wrk_results
}
@ -76,8 +88,9 @@ trap 'stop_server; exit' SIGINT
trap 'kill $server_pid; exit' SIGTERM
header='Client Version'
for label in "${test_order[@]}"; do
header="$header,$label"
header="$header,$label Latency,$label Throughput"
done
header="$header,Agent CPU Burn,Server CPU Burn,Agent RSS Delta,Server Max RSS"
echo $header > $test_csv_file
for agent_jar in $agent_jars; do
@ -92,19 +105,49 @@ for agent_jar in $agent_jars; do
start_server $agent_jar
fi
if [ "$agent_pid" = "" ]; then
agent_start_cpu=0
agent_start_rss=0
else
agent_start_cpu=$(ps -o 'pid,time' | awk "\$1 == $agent_pid { print \$2 }" | awk -F'[:\.]' '{ print ($1 * 3600) + ($2 * 60) + $3 }')
agent_start_rss=$(ps -o 'pid,rss' | awk "\$1 == $agent_pid { print \$2 }")
fi
server_start_cpu=$(ps -o 'pid,time' | awk "\$1 == $server_pid { print \$2 }" | awk -F'[:\.]' '{ print ($1 * 3600) + ($2 * 60) + $3 }')
for t in "${test_order[@]}"; do
label="$t"
url="${endpoints[$label]}"
echo "--Testing $label -- $url--"
test_output_file=$(test_endpoint $url)
cat $test_output_file
throughput=$(tail -n 1 $test_output_file)
result_row="$result_row,$throughput"
avg_latency=$(awk '$1 == "Latency" { print $2 }' $test_output_file)
avg_throughput=$(awk '$1 == "Requests/sec:" { print $2 }' $test_output_file)
result_row="$result_row,$avg_latency,$avg_throughput"
rm $test_output_file
done
echo "$result_row" >> $test_csv_file
if [ "$agent_pid" = "" ]; then
agent_stop_cpu=0
agent_stop_rss=0
else
agent_stop_cpu=$(ps -o 'pid,time' | awk "\$1 == $agent_pid { print \$2 }" | awk -F'[:\.]' '{ print ($1 * 3600) + ($2 * 60) + $3 }')
agent_stop_rss=$(ps -o 'pid,rss' | awk "\$1 == $agent_pid { print \$2 }")
fi
server_stop_cpu=$(ps -o 'pid,time' | awk "\$1 == $server_pid { print \$2 }" | awk -F'[:\.]' '{ print ($1 * 3600) + ($2 * 60) + $3 }')
let agent_cpu=$agent_stop_cpu-$agent_start_cpu
let agent_rss=$agent_stop_rss-$agent_start_rss
let server_cpu=$server_stop_cpu-$server_start_cpu
stop_server
server_rss=$(awk '/.* maximum resident set size/ { print $1 }' $server_output)
rm $server_output
echo "$result_row,$agent_cpu,$server_cpu,$agent_rss,$server_rss" >> $test_csv_file
echo "----/Testing agent $agent_jar----"
echo ""
done
echo ""