Performance Load Testing of AWS Infrastructure Using JMeter

Project Overview

This project focused on evaluating the performance and scalability of a deployed AWS infrastructure supporting both a front-end Angular application and a back-end Node.js service. The infrastructure includes components like AWS EC2 instances, an Application Load Balancer (ALB), an Aurora Serverless RDS database, and NGINX web servers. Apache JMeter was used to conduct performance load testing, simulating up to 1,000 concurrent users to assess the system's ability to handle high traffic and maintain optimal performance.

Technologies and Services Used

  • Apache JMeter: For performance and load testing.

  • AWS EC2: Hosting the Node.js back-end and serving the Angular front-end.

  • AWS Application Load Balancer (ALB): Distributing incoming traffic across EC2 instances.

  • Amazon Aurora Serverless RDS: For database scalability and performance.

  • NGINX: Used as a web server on Ubuntu instances within EC2.

Key Responsibilities:

  • Test Plan Design: Designing a comprehensive test plan using Apache JMeter to simulate up to 1,000 concurrent users.

  • Load Testing Execution: Setting up and executing performance load tests against the deployed AWS infrastructure, focusing on both the front-end and back-end services.

  • Performance Monitoring: Monitoring system performance during load tests, including CPU utilization, memory usage, response times, and database performance.

  • Analysis and Optimization: Analyzing the results of the load tests to identify potential bottlenecks or performance issues and making recommendations or adjustments to optimize the infrastructure.

  • Reporting: Compiling detailed reports of the load test results, highlighting key metrics, findings, and any optimizations performed to enhance system performance.

JMeter Test Plan (XML)

<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.4.1">
  <hashTree>
    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
      <stringProp name="TestPlan.comments"></stringProp>
      <boolProp name="TestPlan.functional_mode">false</boolProp>
      <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
      <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
      <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
        <collectionProp name="Arguments.arguments"/>
      </elementProp>
      <stringProp name="TestPlan.user_define_classpath"></stringProp>
    </TestPlan>
    <hashTree>
      <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
        <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
        <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
          <boolProp name="LoopController.continue_forever">false</boolProp>
          <intProp name="LoopController.loops">1</intProp>
        </elementProp>
        <stringProp name="ThreadGroup.num_threads">1000</stringProp>
        <stringProp name="ThreadGroup.ramp_time">60</stringProp>
        <longProp name="ThreadGroup.start_time">1640995200000</longProp>
        <longProp name="ThreadGroup.end_time">1640995200000</longProp>
        <boolProp name="ThreadGroup.scheduler">false</boolProp>
        <stringProp name="ThreadGroup.duration"></stringProp>
        <stringProp name="ThreadGroup.delay"></stringProp>
      </ThreadGroup>
      <hashTree>
        <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request" enabled="true">
          <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
            <collectionProp name="Arguments.arguments">
              <elementProp name="" elementType="HTTPArgument">
                <boolProp name="HTTPArgument.always_encode">false</boolProp>
                <stringProp name="Argument.value"></stringProp>
                <stringProp name="Argument.metadata">=</stringProp>
                <boolProp name="HTTPArgument.use_equals">true</boolProp>
                <stringProp name="Argument.name"></stringProp>
              </elementProp>
            </collectionProp>
          </elementProp>
          <stringProp name="HTTPSampler.domain">your-domain.com</stringProp>
          <stringProp name="HTTPSampler.port">80</stringProp>
          <stringProp name="HTTPSampler.protocol">http</stringProp>
          <stringProp name="HTTPSampler.contentEncoding"></stringProp>
          <stringProp name="HTTPSampler.path">/your-endpoint</stringProp>
          <stringProp name="HTTPSampler.method">GET</stringProp>
          <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
          <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
          <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
          <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
          <stringProp name="HTTPSampler.monitor">false</stringProp>
          <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
        </HTTPSamplerProxy>
        <hashTree/>
        <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
          <boolProp name="ResultCollector.error_logging">false</boolProp>
          <objProp>
            <name>saveConfig</name>
            <value class="SampleSaveConfiguration">
              <boolProp name="time">true</boolProp>
              <boolProp name="latency">true</boolProp>
              <boolProp name="timestamp">true</boolProp>
              <boolProp name="success">true</boolProp>
              <boolProp name="label">true</boolProp>
              <boolProp name="code">true</boolProp>
              <boolProp name="message">true</boolProp>
              <boolProp name="threadName">true</boolProp>
              <boolProp name="dataType">true</boolProp>
              <boolProp name="encoding">false</boolProp>
              <boolProp name="assertions">true</boolProp>
              <boolProp name="subresults">true</boolProp>
              <boolProp name="responseData">false</boolProp>
              <boolProp name="samplerData">false</boolProp>
              <boolProp name="xml">false</boolProp>
              <boolProp name="fieldNames">true</boolProp>
              <boolProp name="responseHeaders">false</boolProp>
              <boolProp name="requestHeaders">false</boolProp>
              <boolProp name="responseDataOnError">false</boolProp>
              <boolProp name="saveAssertionResultsFailureMessage">true</boolProp>
              <boolProp name="assertionsResultsToSave">0</boolProp>
              <boolProp name="bytes">true</boolProp>
              <boolProp name="sentBytes">true</boolProp>
              <boolProp name="url">true</boolProp>
              <boolProp name="threadCounts">true</boolProp>
              <boolProp name="idleTime">true</boolProp>
              <boolProp name="connectTime">true</boolProp>
            </value>
          </objProp>
          <stringProp name="filename"></stringProp>
        </ResultCollector>
        <hashTree/>
      </hashTree>
    </hashTree>
  </hashTree>
</jmeterTestPlan>

Project Outcomes

  • Scalability Validation: Successfully validated the AWS infrastructure's ability to handle up to 1,000 concurrent users, ensuring that both the front-end and back-end services performed optimally under high load.

  • Performance Optimization: Identified and resolved performance bottlenecks, resulting in improved response times and more efficient resource utilization.

  • Infrastructure Resilience: Demonstrated the resilience and robustness of the AWS-based infrastructure, confirming its capability to maintain high availability and performance during peak traffic periods.

  • Comprehensive Reporting: Provided detailed reports on the load testing results, offering insights into system behavior under stress and guiding future optimization efforts.

Latest Projects

Things I do

CLOUD

Amazon Web Services

AZURE Cloud

Google Cloud Platform

IBM Cloud

DevOps Tools

Jenkins

Ansible for software provisioning

Packer for automated machine images

AWS CodePipeline

AWS CodeDeploy

Azure Pipelines

Chef

Github Actions

GitLab CI/CD

CircleCI

Microservices

Kubernetes

Docker

AWS ECS

AWS EKS

AKS

Azure Container Apps

Monitoring and Alerting

Telegraf

Prometheus

Grafana

Pagerduty

Infrastructure as Code

CloudFormation

Terraform

AWS CDK (Python & Typescript)

Operating System

Most of Linux Server Distributions

Window Server 2019/2022

Databases

MySQL

MariaDB

MongoDB

PostgreSQL

MSSQL

Scripting

Shell Scripting

Python

YAML

PowerShell

My Certifications

EMAIL: RAJ412214@GMAIL.COM

Let's Talk

Book a call to talk regarding the current vacancy at your organization.