blob: 52b38e8b6ed836b10c7b498662ec793291610b95 [file] [log] [blame]
#!/bin/bash
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
# This script is used to measure memory consumption by Apache Qpid Broker-J running in Oracle JDK
# Use plot.py to plot graphs of memory usage from results collected by this test
function waitfor()
{
counter=1
until grep -a -l "$2" $1 >/dev/null 2>&1 ; do
sleep 1 ;
let "counter += 1"
if [ "$counter" -gt "$3" ]; then
break
fi
done
}
function awaitBroker()
{
echo "Awaiting broker..."
waitfor ${QPID_WORK}/log/qpid.log "BRK-1004" "30"
echo "Broker is ready"
}
function startBroker()
{
echo "Starting broker"
export QPID_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=${RMI_PORT} -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
${QPID_HOME}/bin/qpid-server 2>${QPID_WORK}/log/qpid.stderr > ${QPID_WORK}/log/qpid.stdout &
brokerpid=$!
echo "Broker started: PID $brokerpid"
}
function stopBroker()
{
messageSize=$1
messageCount=$2
resultFile=$3
echo "Killing broker with pid $brokerpid"
kill -15 $brokerpid 2>&1 1> /dev/null
sleep 1
(kill -9 $brokerpid 2>&1) > /dev/null
grep BRK-1014 ${QPID_WORK}/log/qpid.log | sed 's/,/ /g' | sed 's/^/# /' >> $resultFile
mv ${QPID_WORK}/log/qpid.log ${QPID_WORK}/log/qpid.log.$messageSize_$messageCount
rm -fr ${QPID_WORK}/default/messages
}
function performTest()
{
messageSize=$1
messageCount=$2
resultFile=$3
connections=${4:-1}
sessions=${5:-1}
producers=${6:-1}
startBroker
awaitBroker
echo "Running test: messageSize=$messageSize messageNumber=$messageCount connections=${connections} sessions=${sessions}"
tmp=$(mktemp)
mvn -f ${TOOLS_DIR}/pom.xml \
exec:java \
-Dmemorytest=${PROFILE} \
-Dexec.args="jndiProperties=${JNDI_PROPERTIES} jmxhost=${BROKER_HOSTNAME} jmxport=${RMI_PORT} jmxuser=guest jmxpassword=guest jndiConnectionFactory=qpidConnectionFactoryTls connections=${connections} sessions=${sessions} producers=${producers} messagecount=${messageCount} size=${messageSize} resultsFile=${tmp}"
cat ${tmp} >> $resultFile
stopBroker $messageSize $messageCount $resultFile
}
function performMessageNumberTests()
{
messageSize=$1
messageNumbers=$2
resultFile=$3
for messageNumber in $messageNumbers
do
performTest $messageSize $messageNumber $resultFile 1 1 1
done
}
function performConnectionsTests()
{
sessionNumber=${1}
connectionsNumbers=$2
resultFile=$3
for connectionsNumber in $connectionsNumbers
do
performTest 0 2 $resultFile ${connectionsNumber} ${sessionNumber} 1
done
}
if [ -z ${QPID_HOME+x} ]
then
echo "QPID_HOME environment variable is unset"
exit 1
else
echo "QPID_HOME=$QPID_HOME"
fi
if [ -z ${QPID_WORK+x} ]
then
echo "QPID_WORK environment variable is unset"
exit 1
else
echo "QPID_WORK=$QPID_WORK"
fi
echo "QPID_OPTS=$QPID_OPTS"
if [ command -v readlink >/dev/null 2>&1 ]
then
TOOLS_DIR=$(dirname $(dirname $(readlink -f ${0})))
else
TOOLS_DIR=$(dirname $(cd "$(dirname "${0}")"; pwd))
fi
echo "Tools module folder ${TOOLS_DIR}"
PROTOCOL=${1:-0-9}
BROKER_HOSTNAME=${2:-"localhost"}
RMI_PORT=${3:-8999}
case ${PROTOCOL} in
0-9|0-10)
JNDI_PROPERTIES=stress-test-client-qpid-jms-client-0-x.properties
PROFILE=jms-client-${PROTOCOL}
;;
1-0)
JNDI_PROPERTIES=stress-test-client-qpid-jms-client.properties
PROFILE=qpid-jms-client
;;
*)
echo "Unrecognised protocol ${PROTOCOL}"
exit 1
;;
esac
brokerVersion=`$QPID_HOME/bin/qpid-server -v | grep "qpid -" | awk '{print $3 " rev" $5}'`
javaVersion=`java -version 2>&1 | grep "java version" | awk '{print $3}' | sed -e "s/\"//g"`
startTime=`date "+%Y-%m-%d %H:%M:%S"`
startTimeFile=`date "+%Y-%m-%d-%H-%M-%S"`
resultFile="${TOOLS_DIR}/target/results-${PROTOCOL}-${javaVersion}-${startTimeFile}.txt"
echo "Results will be written into ${resultFile}"
rm -fr ${QPID_WORK}/default/messages
mkdir -p ${QPID_WORK}/log
echo "# $startTime" > ${resultFile}
echo "# amqp=${PROTOCOL} java=${javaVersion} broker=${brokerVersion} QPID_OPTS=${QPID_OPTS}" >> ${resultFile}
echo "# heap usage, direct memory usage, connections, sessions, producers, is transacted, messages, message size, delivery mode, user friendly heap usage, user friendly direct memory usage" >> ${resultFile}
performMessageNumberTests 0 "10 50 100 1000 10000 100000 1000000" ${resultFile}
performMessageNumberTests 1024 "10 50 100 1000 10000 100000 1000000" ${resultFile}
performMessageNumberTests 102400 "10 50 100 1000 10000 100000" ${resultFile}
performMessageNumberTests 1048576 "10 50 100 1000 10000" ${resultFile}
performMessageNumberTests 10485760 "10 50 100 1000" ${resultFile}
performMessageNumberTests 32768000 "10 50 100" ${resultFile}
performConnectionsTests 1 "1 100 1000 10000" ${resultFile}
performConnectionsTests 10 "1 100 1000 10000" ${resultFile}
performConnectionsTests 100 "1 100 1000 10000" ${resultFile}
performConnectionsTests 200 "1 100 1000 10000" ${resultFile}
endTime=`date "+%Y-%m-%d %H:%M:%S"`
echo "# $endTime" >> results.txt