This article explains how you can test the scalability of your application in the Amazon Web Services (AWS) cloud. The AWS services used in this article include Amazon Elastic Compute Cloud (EC2) and Amazon Relational Database Service (RDS). The use of Amazon Elastic Load Balancing (ELB) is also briefly discussed. The application under testing is called QuickTickets, a fictional Vaadin web application that sells movie tickets to theaters all over the world. See also the blog post about the experiment and the results.
To fully understand this article and follow through the steps, you should have some basic knowledge of Amazon Web Services (AWS), Apache JMeter, MySQL and Linux shell usage. You will also need to know how to checkout the QuickTickets project from SVN and run Ant targets to generate test database and to package the application as a WAR file.
Please notice, that using the AWS services discussed here will incur some expenses.
Login to AWS Management Console and select the Amazon RDS tab.
Click the Launch DB Instance button.
Select the following properties for the DB instance:
DB Instance Class: db1.m1.large
Multi-AZ Deployment: No
Allocated Storage: 5 GB
DB Instance Idenfitier:
Master User Name:
Master User Password:
Backup Retention Period: 0 (disable backups)
After the DB instance is started up, connect to the database with the MySQL client.
If this is the first time you are using Amazon RDS, you need to setup the DB Security Groups.
More information about network access to you DB instances.
Once you have connected to the DB, run the following command:
alter database quicktickets charset=utf8;
Note that the following steps might be a bit faster to do in an EC2 instance in the same zone as the RDS database. But you can of course do these in your local machine as well.
Take a checkout of the QuickTickets application project from the SVN repository.
Create the database schema by running the QuickTickets/db/createSchema.sql file to the quicktickets database.
mysql -uquicktickets -p<your-password> -h<db-instance-endpoint>.rds.amazonaws.com < QuickTickets/db/createSchema.sql
Create a huge test data by running Ant target
create-huge-database-scriptof the QuickTickets/build.xml script.
cd QuickTicketsant create-huge-database-script
This target will generate a huge SQL file (500MB) into a temporary directory containing loads of test data. The location of the file is printed to the console by the Ant target.
Run the resulting
quickticketsdata.sqlfile to the quicktickets database (this will take quite a while, well over an hour).
mysql -uquicktickets -p<your-password> -h<db-instance-endpoint>.rds.amazonaws.com < /tmp/quickticketsdata.sql
Login to AWS Management Console and select the Amazon EC2 tab.
Click the Launch Instance button.
Select Community AMIs tab and search an AMI with following id:
Launch a large instance of the AMI. Consult the Amazon EC2 documentation for more details on how to launch a new instance.
Login to the started instance as root via SSH.
Repeat the above procedure for all the instances you want to setup.
Take a checkout of the QuickTickets application project (if you haven’t already) from:
Add the Private DNS of all the instances you have setup to the list of Memcached servers in the
WebContent/WEB-INF/servers.xmlfile with the default Memcached port 11211. For example:
<!-- Memcached servers --><value>ip-11-111-11-111.ec2.internal:11211</value><value>ip-22-222-22-222.ec2.internal:11211</value>…
Create a file called
build.propertiesto the root directory of the project (right next to the
QuickTickets/build.xml). Set the
trueand add your Amazon RDS database configuration details to the file. For example:
# Debug or production mode? productionMode=true # Database configuration database.url=jdbc:mysql:<db-instance-endpoint>.rds.amazonaws.com:3306/quicktickets?characterEncoding=utf8&useCompression=true database.username=quicktickets database.password=<your-password-here> database.driverClassName=com.mysql.jdbc.Driver
package-wartarget of the
build.xmlto compile and package the WAR file (resulting in the
Deploy the WAR file into all EC2 instances you just created by copying the
Now you should be able to access the application through your web browser by opening the following URL:
If you did setup more than one instance, you could create an Amazon ELB load balancer and attach all instances to that load balancer. However, this makes the JMeter testing close to impossible as the ELB doesn’t scale to sudden increases in traffic fast enough and starts dropping connections.
More information: https://forums.aws.amazon.com/thread.jspa?messageID=130622&tstart=0
More information: https://wiki.apache.org/jmeter/JMeterAndAmazon
If you still want to try using ELB, you should add
-Dsun.net.inetaddr.ttl=0to the JMeter JVM args and use the following settings with the ELB:
Port Configuration: 80 forwarding to 8080
Enable Application Generated Cookie Stickiness for cookie name:
Set the Health Check port to
Launch and login to a new EC2 large instance (using the AMI
ami-fb16f992). See the first 5 steps of the second chapter.
Copy and execute the jmeter-instance.sh installation script as the root user.
Download the JMeter script.
The script contains prerecorded ticket purchase sequence that lasts about 2.5 minutes.
Open the script in JMeter and make sure you configure the following settings to suit your test:
HTTP Request Defaults (set the server name)
Thread Group (thread count, ramp-up, loop count)
Summary report (result file name)
Upload the test script to the JMeter instance(s).
When logged in as root to the JMeter server you can start the test from command line with the following command:
~/jakarta-jmeter-2.4/bin/jmeter.sh -n -t ~/jmeter-test-script.jmx
After the run is complete you’ll have
jmeter-results.jtlfile (or the filename you used for the report) which you can open in JMeter for analyzing the results.
Jump directly to the results: blog post about the experiment and the results.