From 0802f184c5a7b21cfd87e8f818e31ec7df50a0a7 Mon Sep 17 00:00:00 2001
From: Jan Waller <jwa@informatik.uni-kiel.de>
Date: Fri, 23 May 2014 16:17:15 +0200
Subject: [PATCH] Experiment for causes of overhead (SPASS-meter) + bugfixing

---
 frameworks/SPASSmeter/benchmark-causes.sh     | 164 ++++++++++++++++++
 frameworks/SPASSmeter/lib/config.xml          |   1 -
 ...ss-meter-rt-mod.jar => spass-meter-rt.jar} | Bin 1365280 -> 1365396 bytes
 ...ss-meter-rt-mod.jar => spass-meter-rt.jar} | Bin 539274 -> 539390 bytes
 4 files changed, 164 insertions(+), 1 deletion(-)
 create mode 100644 frameworks/SPASSmeter/benchmark-causes.sh
 rename frameworks/SPASSmeter/lib/linux/{spass-meter-rt-mod.jar => spass-meter-rt.jar} (99%)
 rename frameworks/SPASSmeter/lib/win/{spass-meter-rt-mod.jar => spass-meter-rt.jar} (98%)

diff --git a/frameworks/SPASSmeter/benchmark-causes.sh b/frameworks/SPASSmeter/benchmark-causes.sh
new file mode 100644
index 0000000..8301d7d
--- /dev/null
+++ b/frameworks/SPASSmeter/benchmark-causes.sh
@@ -0,0 +1,164 @@
+#!/bin/bash
+# This file is configured for linux instead of solaris!!!
+
+JAVABIN=""
+
+RSCRIPTDIR=r/
+BASEDIR=./
+RESULTSDIR="${BASEDIR}tmp/results-spassmeter/"
+
+SLEEPTIME=30           ## 30
+NUM_LOOPS=10           ## 10
+THREADS=1              ## 1
+RECURSIONDEPTH=10      ## 10
+TOTALCALLS=2000000     ## 2000000
+METHODTIME=0      ## 500000
+
+#MOREPARAMS="--quickstart"
+MOREPARAMS="--application mooBench.monitoredApplication.MonitoredClassSimple ${MOREPARAMS}"
+
+TIME=`expr ${METHODTIME} \* ${TOTALCALLS} / 1000000000 \* 4 \* ${RECURSIONDEPTH} \* ${NUM_LOOPS} + ${SLEEPTIME} \* 4 \* ${NUM_LOOPS}  \* ${RECURSIONDEPTH} + 50 \* ${TOTALCALLS} / 1000000000 \* 4 \* ${RECURSIONDEPTH} \* ${NUM_LOOPS} `
+echo "Experiment will take circa ${TIME} seconds."
+
+echo "Removing and recreating '$RESULTSDIR'"
+(rm -rf ${RESULTSDIR}) && mkdir ${RESULTSDIR}
+#mkdir ${RESULTSDIR}stat/
+
+# Clear spassmeter.log and initialize logging
+rm -f ${BASEDIR}spassmeter.log
+touch ${BASEDIR}spassmeter.log
+
+RAWFN="${RESULTSDIR}raw"
+
+JAVAARGS="-server"
+JAVAARGS="${JAVAARGS} -d64"
+JAVAARGS="${JAVAARGS} -Xms1G -Xmx4G"
+JAVAARGS="${JAVAARGS} -verbose:gc -XX:+PrintCompilation"
+#JAVAARGS="${JAVAARGS} -XX:+PrintInlining"
+#JAVAARGS="${JAVAARGS} -XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation"
+#JAVAARGS="${JAVAARGS} -Djava.compiler=NONE"
+JAR="-jar MooBench.jar"
+
+JAVAARGS_NOINSTR="${JAVAARGS}"
+JAVAARGS_LTW="${JAVAARGS} -javaagent:${BASEDIR}lib/linux/spass-meter-ia.jar=xmlconfig=${BASEDIR}lib/config.xml,out=${RESULTSDIR}spassmeter.txt,tcp=localhost:6002"
+
+SERVER="-server -d64 -Xms1G -Xmx4G -classpath ${BASEDIR}lib/linux/spass-meter-ant.jar de.uni_hildesheim.sse.monitoring.runtime.recordingServer.TCPRecordingServer baseDir=. port=6002"
+
+## Write configuration
+uname -a >${RESULTSDIR}configuration.txt
+${JAVABIN}java ${JAVAARGS} -version 2>>${RESULTSDIR}configuration.txt
+echo "JAVAARGS: ${JAVAARGS}" >>${RESULTSDIR}configuration.txt
+echo "" >>${RESULTSDIR}configuration.txt
+echo "Runtime: circa ${TIME} seconds" >>${RESULTSDIR}configuration.txt
+echo "" >>${RESULTSDIR}configuration.txt
+echo "SLEEPTIME=${SLEEPTIME}" >>${RESULTSDIR}configuration.txt
+echo "NUM_LOOPS=${NUM_LOOPS}" >>${RESULTSDIR}configuration.txt
+echo "TOTALCALLS=${TOTALCALLS}" >>${RESULTSDIR}configuration.txt
+echo "METHODTIME=${METHODTIME}" >>${RESULTSDIR}configuration.txt
+echo "THREADS=${THREADS}" >>${RESULTSDIR}configuration.txt
+echo "RECURSIONDEPTH=${RECURSIONDEPTH}" >>${RESULTSDIR}configuration.txt
+sync
+
+## Execute Benchmark
+for ((i=1;i<=${NUM_LOOPS};i+=1)); do
+    j=${RECURSIONDEPTH}
+    k=0
+    echo "## Starting iteration ${i}/${NUM_LOOPS}"
+    echo "## Starting iteration ${i}/${NUM_LOOPS}" >>${BASEDIR}spassmeter.log
+
+    # No instrumentation
+    k=`expr ${k} + 1`
+    echo " # ${i}.${j}.${k} No instrumentation"
+    echo " # ${i}.${j}.${k} No instrumentation" >>${BASEDIR}spassmeter.log
+    #sar -o ${RESULTSDIR}stat/sar-${i}-${j}-${k}.data 5 2000 1>/dev/null 2>&1 &
+    ${JAVABIN}java ${JAVAARGS_NOINSTR} ${JAR} \
+        --output-filename ${RAWFN}-${i}-${j}-${k}.csv \
+        --totalcalls ${TOTALCALLS} \
+        --methodtime ${METHODTIME} \
+        --totalthreads ${THREADS} \
+        --recursiondepth ${j} \
+        ${MOREPARAMS}
+    #kill %sar
+    [ -f ${BASEDIR}hotspot.log ] && mv ${BASEDIR}hotspot.log ${RESULTSDIR}hotspot-${i}-${j}-${k}.log
+    echo >>${BASEDIR}spassmeter.log
+    echo >>${BASEDIR}spassmeter.log
+    sync
+    sleep ${SLEEPTIME}
+
+    # SPASSmeter Javassist Instrumentation
+    k=`expr ${k} + 1`
+    echo " # ${i}.${j}.${k} SPASSmeter Javassist Instrumentation"
+    echo " # ${i}.${j}.${k} SPASSmeter Javassist Instrumentation" >>${BASEDIR}spassmeter.log
+    #sar -o ${RESULTSDIR}stat/sar-${i}-${j}-${k}.data 5 2000 1>/dev/null 2>&1 &
+    ${JAVABIN}java ${SERVER} 1>>server.out 2>&1 &
+    ${JAVABIN}java ${JAVAARGS_LTW},mainDefault=NONE -DSpassmeterNoWriter=true ${JAR} -f \
+        --output-filename ${RAWFN}-${i}-${j}-${k}.csv \
+        --totalcalls ${TOTALCALLS} \
+        --methodtime ${METHODTIME} \
+        --totalthreads ${THREADS} \
+        --recursiondepth ${j} \
+        ${MOREPARAMS}
+    kill -9 $!
+    #kill %sar
+    [ -f ${BASEDIR}hotspot.log ] && mv ${BASEDIR}hotspot.log ${RESULTSDIR}hotspot-${i}-${j}-${k}.log
+    echo >>${BASEDIR}spassmeter.log
+    echo >>${BASEDIR}spassmeter.log
+    sync
+    sleep ${SLEEPTIME}
+
+    # SPASSmeter Javassist Collecting
+    k=`expr ${k} + 1`
+    echo " # ${i}.${j}.${k} SPASSmeter Javassist Collecting"
+    echo " # ${i}.${j}.${k} SPASSmeter Javassist Collecting" >>${BASEDIR}spassmeter.log
+    #sar -o ${RESULTSDIR}stat/sar-${i}-${j}-${k}.data 5 2000 1>/dev/null 2>&1 &
+    ${JAVABIN}java ${SERVER} 1>>server.out 2>&1 &
+    ${JAVABIN}java ${JAVAARGS_LTW} -DSpassmeterNoWriter=true ${JAR} -f \
+        --output-filename ${RAWFN}-${i}-${j}-${k}.csv \
+        --totalcalls ${TOTALCALLS} \
+        --methodtime ${METHODTIME} \
+        --totalthreads ${THREADS} \
+        --recursiondepth ${j} \
+        ${MOREPARAMS}
+    kill -9 $!
+    #kill %sar
+    [ -f ${BASEDIR}hotspot.log ] && mv ${BASEDIR}hotspot.log ${RESULTSDIR}hotspot-${i}-${j}-${k}.log
+    echo >>${BASEDIR}spassmeter.log
+    echo >>${BASEDIR}spassmeter.log
+    sync
+    sleep ${SLEEPTIME}
+
+    # SPASSmeter Javassist Writing
+    k=`expr ${k} + 1`
+    echo " # ${i}.${j}.${k} SPASSmeter Javassist Writing"
+    echo " # ${i}.${j}.${k} SPASSmeter Javassist Writing" >>${BASEDIR}spassmeter.log
+    #sar -o ${RESULTSDIR}stat/sar-${i}-${j}-${k}.data 5 2000 1>/dev/null 2>&1 &
+    ${JAVABIN}java ${SERVER} 1>>server.out 2>&1 &
+    ${JAVABIN}java ${JAVAARGS_LTW} -DSpassmeterNoWriter=fals ${JAR} -f \
+        --output-filename ${RAWFN}-${i}-${j}-${k}.csv \
+        --totalcalls ${TOTALCALLS} \
+        --methodtime ${METHODTIME} \
+        --totalthreads ${THREADS} \
+        --recursiondepth ${j} \
+        ${MOREPARAMS}
+    kill -9 $!
+    #kill %sar
+    [ -f ${BASEDIR}hotspot.log ] && mv ${BASEDIR}hotspot.log ${RESULTSDIR}hotspot-${i}-${j}-${k}.log
+    echo >>${BASEDIR}spassmeter.log
+    echo >>${BASEDIR}spassmeter.log
+    sync
+    sleep ${SLEEPTIME}
+
+
+done
+#zip -jqr ${RESULTSDIR}stat.zip ${RESULTSDIR}stat
+#rm -rf ${RESULTSDIR}stat/
+mv ${BASEDIR}spassmeter.log ${RESULTSDIR}spassmeter.log
+[ -f ${RESULTSDIR}hotspot-1-${RECURSIONDEPTH}-1.log ] && grep "<task " ${RESULTSDIR}hotspot-*.log >${RESULTSDIR}log.log
+[ -f ${BASEDIR}errorlog.txt ] && mv ${BASEDIR}errorlog.txt ${RESULTSDIR}
+
+## Clean up raw results
+#gzip -qr ${RESULTSDIR}results.zip ${RAWFN}*
+#rm -f ${RAWFN}*
+[ -f ${BASEDIR}nohup.out ] && cp ${BASEDIR}nohup.out ${RESULTSDIR}
+[ -f ${BASEDIR}server.out ] && mv ${BASEDIR}server.out ${RESULTSDIR}
+[ -f ${BASEDIR}nohup.out ] && > ${BASEDIR}nohup.out
diff --git a/frameworks/SPASSmeter/lib/config.xml b/frameworks/SPASSmeter/lib/config.xml
index e1aeb1f..ce8dd68 100644
--- a/frameworks/SPASSmeter/lib/config.xml
+++ b/frameworks/SPASSmeter/lib/config.xml
@@ -4,7 +4,6 @@
 		<module name="MonitoredClassThreaded">
 			<behavior signature="monitoredMethod(long,int)">
 				<monitor id="monitoredMethod" />
-				<Timer id="monitoredMethodTimer" state="START_FINISH" affectAt="DEFAULT" considerThreads="false" />
 			</behavior>
 		</module>
 		<module name="MonitoredClassSimple">
diff --git a/frameworks/SPASSmeter/lib/linux/spass-meter-rt-mod.jar b/frameworks/SPASSmeter/lib/linux/spass-meter-rt.jar
similarity index 99%
rename from frameworks/SPASSmeter/lib/linux/spass-meter-rt-mod.jar
rename to frameworks/SPASSmeter/lib/linux/spass-meter-rt.jar
index 9c90361f0798d84376215f2193444ac051141bc4..57c4e1d11f799a416cf7288d83231a67f667d68e 100644
GIT binary patch
delta 4030
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
QA9nPBz5K==0KNbI2Pb6(=>Px#

delta 3960
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

diff --git a/frameworks/SPASSmeter/lib/win/spass-meter-rt-mod.jar b/frameworks/SPASSmeter/lib/win/spass-meter-rt.jar
similarity index 98%
rename from frameworks/SPASSmeter/lib/win/spass-meter-rt-mod.jar
rename to frameworks/SPASSmeter/lib/win/spass-meter-rt.jar
index a4aee236d16078d8d7853fc250546198d3b009b4..f45b55cdcb301eaa00ac899edd671199a5fec188 100644
GIT binary patch
delta 4151
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

delta 3651
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

-- 
GitLab