KVM VPS from Rs 149/mo. Mumbai, Noida and Jaipur nodes.

24×7 infrastructure operations Sales +91 98297 14343
vpswala.in
VPSWala 3 min read

VPS Load Testing with ApacheBench & wrk: Web Server Concurrency Guide

Step-by-step tutorial on benchmarking Linux VPS web servers with ApacheBench and wrk, interpreting request latency, and tuning server concurrency.

Launching a production web application without stress testing is an operational gamble. Synthetic load testing allows systems engineers to discover resource saturation points, web server worker limits, and database connection pool exhaustion in a controlled environment before real customer traffic causes outages.

Why Synthetic Load Testing is Essential Before Launch

Modern web servers (such as Nginx, Apache, and Caddy) running on Linux VPS instances operate efficiently under normal traffic conditions. However, when traffic spikes occur during marketing campaigns or product launches, unoptimized configurations fail rapidly.

Failures typically manifest as worker starvation, socket exhaustion (TIME_WAIT saturation), file descriptor exhaustion, or excessive database query queuing. Synthetic benchmarking identifies the exact throughput ceiling (measured in requests per second) and reveals whether performance bottlenecks stem from CPU compute limits, RAM shortages, or disk I/O wait states.

ApacheBench (ab) Fundamentals and Execution Syntax

ApacheBench (ab) is the industry-standard command-line benchmarking utility provided by the Apache HTTP Server project. Despite its name, it can benchmark any web server or HTTP endpoint.

To install ApacheBench on Debian/Ubuntu systems, install the apache2-utils package (or httpd-tools on RHEL/AlmaLinux):

sudo apt update && sudo apt install -y apache2-utils

The standard syntax for an ApacheBench test requires specifying the total request count (-n) and concurrency level (-c). When testing modern web servers, always include the HTTP Keep-Alive flag (-k) to simulate realistic browser session reuse and prevent local port exhaustion:

# Perform 5,000 requests with 50 concurrent connections
ab -n 5000 -c 50 -k https://target-domain.com/

Important note: The ApacheBench URL argument must always include a trailing slash or specific document path (e.g., /index.html), otherwise the tool will reject the command with a syntax error.

Interpreting Benchmarking Metrics: RPS, TTFB & Tail Latency

When the benchmarking run concludes, ApacheBench outputs a comprehensive performance breakdown. Focus on three critical metrics:

  • Requests Per Second (Throughput): Calculated as total completed requests divided by total test duration. Higher is better. This figure defines the theoretical throughput limit of your web server stack.
  • Time Per Request (Mean Latency): The average elapsed time between sending a request and receiving the response across concurrent threads.
  • Connection Times Breakdown: Breaks down execution into Connect, Processing, Waiting (Time to First Byte / TTFB), and Total durations. If the Connect phase is elevated, review TCP handshake overhead and SSL negotiation. If Waiting time is high, the backend application (PHP-FPM, Python ASGI, or database) is slow to generate output.
  • Percentage Distribution Table: Displays the percentile response distribution (50%, 90%, 95%, 99%). Even if your mean latency is 40 ms, a 99th percentile of 800 ms indicates intermittent thread contention or garbage collection pauses that impact real users.

Advanced Testing with wrk for Multi-Threaded HTTP Load

While ApacheBench is lightweight and universally available, its single-threaded execution model can become a bottleneck when benchmarking high-performance servers capable of handling tens of thousands of requests per second. For modern multi-core benchmarks, wrk provides a multi-threaded architecture utilizing epoll.

To execute a sustained 30-second load test utilizing 4 operating system threads and 100 concurrent HTTP connections:

wrk -t4 -c100 -d30s --latency https://target-domain.com/

The --latency flag outputs a detailed latency distribution, allowing engineers to verify performance consistency under sustained saturation.

Linux Kernel and Web Server Tuning for Concurrency

If your benchmark encounters connection resets, failed requests, or socket errors, tune the underlying Linux kernel and web server configurations:

1. Increase system-wide open file descriptors and TCP socket backlogs in /etc/sysctl.conf:

fs.file-max = 2097152
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 1024 65535

Apply changes with sudo sysctl -p.

2. Configure Nginx worker connections and limits in /etc/nginx/nginx.conf:

events {
    worker_connections 8192;
    multi_accept on;
    use epoll;
}

3. Ensure user-level file descriptor limits are raised in /etc/security/limits.conf:

* soft nofile 65535
* hard nofile 65535

Benchmarking Best Practice Checklist

Stage Action Item Verification Command / Tool
Pre-Test Execute test from external VPS to eliminate local CPU/bandwidth limits Separate testing client instance
Monitoring Observe CPU, RAM, and disk I/O wait during test execution htop, vmstat 1, iostat -xz 1
Execution Run incremental concurrency tests: 10, 50, 100, 250 connections ab -n 5000 -c 50 -k
Post-Test Review web server error logs for worker exhaustion or socket resets tail -n 100 /var/log/nginx/error.log

VPSWala provides scalable KVM Cloud VPS solutions engineered for high-concurrency web applications, featuring enterprise RAID NVMe arrays, full root access, and unthrottled processor performance. Explore our Cloud VPS Plans or supercharge your throughput with high-frequency AMD Ryzen 9 9950X VPS servers.


Sources

Not sure which size?

Send the stack, get a size.

Tell us the operating system, application stack, current traffic, database size and where it hurts today. You get a sizing recommendation, the matching plan and a price.

Related

More on this.

Get sizing help See VPS plans