Fading Coder

One Final Commit for the Last Sprint

Home > Tech > Content

Load Testing with JMeter: A Practical Guide for Backend Developers

Tech May 10 4

Understanding Performance Testing for Backend Services

As backend developers, understanding load testing is essential for building reliable production systems. Without proper testing, your application may experience slow response times or complete outages when traffic spikes occur—situations that typically result in quick fixes like vertical scaling (CPU, memory upgrades) or network changes, which are costly and unsustainable.

This guide covers everything you need to conduct effective load tests using Apache JMeter.

Software Versions Used

  • JMeter: 5.5
  • ServerAgent: 2.2.3

Performance Tuning Across Development Roles

Different development roles focus on distinct performance metrics:

Frontend Engineers:

  • First Contentful Paint (FCP): Initial page load time
  • Time to Interactive (TTI): When users can interact with the page
  • Complete Load Time: Full page render

Backend Engineers:

  • Response Time (RT): Average time to process requests
  • Transactions Per Second (TPS): System throughput
  • Concurrency: Number of simultaneous users

Mobile Engineers:

  • End-to-end response time
  • Crash rates
  • Memory consumption
  • Frame rate (FPS)

For backend developers, performance bottlenecks typically originate from:

  • Database operations (queries, indexing)
  • Remote procedure calls (RPC)
  • Network I/O
  • Business logic complexity
  • Caching strategies
  • JVM throughput

Key Factors Affecting Performance

Product Design:

  • Business logic complexity
  • Feature interactions
  • Dynamic content
  • Page element count

Network Infrastructure:

  • Bandwidth and latency
  • Load balancer configuration

Code Quality & Architecture:

  • Architectural design flaws
  • Developer experience and skills
  • Performance awareness during development
  • Database optimization (slow queries, missing indexes, connection limits)

Client Environment:

  • Device capabilities
  • OS versions
  • Network conditions (WiFi, cellular)
  • Server hardware specifications

1. Introduction to Load Testing

1.1 What is Load Testing?

Load testing is a type of performance testing that evaluates system behavior under expected or peak load conditions. It involves:

  1. Subjecting the system to loads exceeding normal operational parameters to identify breaking points
  2. Gradually increasing pressure to determine the system's maximum capacity
  3. Running tests after baseline functionality is verified and the system is stable

1.2 Objectives of Load Testing

  • Monitor performance metrics as concurrent user load increases
  • Identify performance bottlenecks for targeted optimization
  • Verify system stability under high concurrency conditions
  • Estimate system capacity limits

1.3 Key Performance Indicators

Metric Description
Response Time (RT) Average time for the system to respond to requests
Throughput Number of transactions processed per time unit
Resource Utilization CPU, memory, disk I/O, and network usage
Concurrent Users Number of simultaneous active users
Error Rate Percentage of failed requests

The relationship between response time, throughput, and concurrency follows a predictable pattern:

  • Light Load Zone: As users increase, throughput rises while response time remains acceptable
  • Optimal Point: Maximum throughput with minimal response time
  • Heavy Load Zone: Response time increases sharply, throughput plateaus, then declines
  • Breaking Point: System failure occurs beyond maximum capacity

The goal of load testing is to identify this critical threshold.


2. JMeter Installation and Configuration

2.1 Prerequisites

JMeter requires Java 8 or higher. Ensure you have the JDK installed before proceeding.

2.2 Installation Steps

  1. Download JMeter from: jmeter.apache.org/
  2. Extract the downloaded archive
  3. Navigate to the bin directory
  4. Run jmeter.bat (Windows) or jmeter.sh (Linux/Mac)

2.3 Setting Language to Chinese

To change the interface language:

  1. Open jmeter.properties in the bin directory
  2. Search for the language property
  3. Uncomment and set the value to zh_CN
  4. Save the file and restart JMeter

3. Creating Your First Load Test

3.1 Thread Group Configuration

Right-click on Test Plan → Add → Thread Group

Key Parameters:

  • Number of Threads: Virtual users (one thread per user)
  • Ramp-up Period: Time in seconds to start all threads
  • Loop Count: Number of times each thread executes the test plan
  • Scheduler: Configure duration and startup delay

Example configuration:

  • Threads: 20
  • Ramp-up: 1 second
  • Loop Count: 100

3.2 HTTP Request Setup

Right-click Thread Group → Add → HTTP Request

Configure the following:

  • Protocol (http/https)
  • Server address
  • Port number
  • HTTP method (GET, POST, etc.)
  • Path and parameters

3.3 View Results Tree

Right-click Thread Group → Add → Listener → View Results Tree

This displays detailed information for each request:

Sample Results:

  • Thread Name: Identifier for the virtual user
  • Sample Start: Timestamp when request was made
  • Load time: Total request duration
  • Latency: Time waiting for first response byte
  • Size in bytes: Response size
  • Response code: HTTP status code
  • Response message: Status description

Request Data:

  • Request body and parameters
  • Headers

3.4 Aggregate Report

Right-click Thread Group → Add → Listener → Aggregate Report

Metrics Explained:

  • Samples: Number of requests
  • Average: Mean response time in milliseconds
  • Median: 50th percentile response time
  • 90%/95%/99% Percentile: Response time below which X% of requests complete
  • Min/Max: Fastest and slowest response times
  • Error %: Failure rate
  • Throughput: Requests processed per second

3.5 Graph Results

Right-click Thread Group → Add → Listener → Graph Results

Displays visual representation including:

  • Sample count: Total requests sent
  • Latest sample: Response time for the most recent request
  • Throughput: Requests per minute
  • Average: Mean response time
  • Median: Middle value
  • Deviation: Response time variance

3.6 Response Assertions

Assertions validate that responses meet expected criteria.

Right-click Thread Group → Add → Assertions → Response Assertion

For example, if your API returns a code field where 200 indicates success, configure the assertion to check for this value.


4. JMeter Plugins

4.1 Installing Plugins

JMeter requires separate plugin installation:

  1. Download the Plugins Manager from: jmeter-plugins.org
  2. Place the JAR file in lib/ext directory
  3. Restart JMeter
  4. Access Plugins Manager from Options → Plugins Manager

4.2 Essential Plugins

Search and install these commonly used plugins:

Basic Graphs: Displays average response time, active thread count, and transaction success/failure rates

Additional Graphs: Shows throughput, connection time, and requests per second

After installation, new listeners prefixed with jp@gc become available.


5. Server Monitoring with PerfMon

5.1 Why Monitor Server Resources?

During load testing, monitoring CPU, memory, network, and system load is critical to understand resource consumption patterns.

5.2 Installing ServerAgent

  1. Download from: github.com/undera/perfmon-enabled-metrics
  2. Extract to your server
  3. Start the agent (choose appropriate script for your OS)

5.3 Agent Configuration for Linux

# Custom startup script with modified port
nohup java -jar ./CMDRunner.jar --tool PerfMonAgent --udp-port 7879 --tcp-port 7879 > log.log 2>&1 &

# Set executable permissions
chmod 755 startAgent.sh

5.4 Configuring JMeter for Monitoring

Right-click Thread Group → Add → Listener → jp@gc - PerfMon Metrics Collector

Add metrics to monitor:

  • CPU utilization
  • Memory usage
  • Disk I/O
  • Network traffic

5.5 Troubleshooting ServerAgent on Windows

If the ServerAgent window closes immediately after launch, the JRE version may be incompatible. Download a compatible JRE version and update the startAgent.bat script to reference the corect Java runtime path.

Related Articles

Understanding Strong and Weak References in Java

Strong References Strong reference are the most prevalent type of object referencing in Java. When an object has a strong reference pointing to it, the garbage collector will not reclaim its memory. F...

Comprehensive Guide to SSTI Explained with Payload Bypass Techniques

Introduction Server-Side Template Injection (SSTI) is a vulnerability in web applications where user input is improper handled within the template engine and executed on the server. This exploit can r...

Implement Image Upload Functionality for Django Integrated TinyMCE Editor

Django’s Admin panel is highly user-friendly, and pairing it with TinyMCE, an effective rich text editor, simplifies content management significantly. Combining the two is particular useful for bloggi...

Leave a Comment

Anonymous

◎Feel free to join the discussion and share your thoughts.