rload 0.2.4

A Rust HTTP/1.1 load generator with Nginx access-log and JSONL replay
Documentation
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <meta name="description" content="rload: Rust-native high-performance HTTP load generator and high-fidelity traffic replay engine.">
  <title>rload 0.2.2 · Replay reality. Find the limit.</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <!-- Header Navigation -->
  <header class="nav wrap" id="header">
    <a class="logo" href="#top">
      <img src="logo.png" alt="rload logo" class="logo-img">
      <span>rload</span>
    </a>
    <nav>
      <a href="#features">Features</a>
      <a href="#compare">Comparison</a>
      <a href="#install">Install</a>
      <a href="./index.zh-cn.html" class="lang-switch">CN</a>
      <a class="nav-cta" href="https://github.com/wenhaozhao/rload/releases">Releases ↗</a>
    </nav>
  </header>

  <main id="top">
    <!-- Hero Section -->
    <section class="hero wrap" id="hero-section">
      <div class="hero-content">
        <p class="eyebrow"><i></i> RUST-NATIVE HTTP TRAFFIC REPLAY</p>
        <h1>Replay reality.<br><em>Find the limit.</em></h1>
        <p class="lead">rload is a Rust HTTP load generator with wrk-compatible CLI semantics. It replays millions of Nginx logs and structured JSONL with only 3.5MB memory, exposing high-concurrency bottlenecks with high fidelity.</p>
        <div class="actions">
          <a class="button primary" href="#install">Install Now ↓</a>
          <a class="button" href="https://github.com/wenhaozhao/rload" target="_blank" rel="noopener noreferrer">GitHub Source ↗</a>
        </div>
        <p class="meta">Latest Stable v0.2.2 · MIT / Apache-2.0 Dual License · Rust 1.96+ / Zero Dependencies</p>
      </div>

      <!-- Terminal Preview -->
      <div class="terminal" id="terminal-preview">
        <div class="term-head">
          <span>●</span><span>●</span><span>●</span>
          <b>rload v0.2.2</b>
        </div>
        <pre><code><em>$</em> rload -t 4 -c 200 -d 30s \<br>  --log-replay access.log \<br>  --log-order shuffle --seed 42 \<br>  http://staging-api.internal<br><br>Running 30s test @ http://staging-api.internal<br>  4 threads and 200 connections<br><br><strong>Thread Stats</strong>   Avg      Max     +/- Stdev<br>  Latency     2.18ms   18.74ms    84.32%<br>  Req/Sec    12.45k   15.92k     76.10%<br><br>  <strong>1482701</strong> requests in 30.00s, <strong>3.24GB</strong> read<br><strong>Requests/sec:</strong> 49,423.36<br><strong>Average latency:</strong> 2.18ms<br><strong>99% Latency:</strong>   8.12ms<br><strong>Socket errors:</strong> connect 0, read 0, write 0, timeout 0<br><br><mark>● log replay complete (shuffled, seed: 42)</mark></code></pre>
      </div>
    </section>

    <!-- Scrolling Ribbon -->
    <div class="ribbon" id="feature-ribbon">
      <div class="wrap">
        <span>WRK SEMANTICS PARITY</span>
        <span>·</span>
        <span>NGINX ACCESS LOG REPLAY</span>
        <span>·</span>
        <span>STRUCTURED JSONL REPLAY</span>
        <span>·</span>
        <span>COORDINATED OMISSION PREVENTION</span>
        <span>·</span>
        <span>STABLE STATIC BINARY</span>
      </div>
    </div>

    <!-- 01 Core Features -->
    <section id="features" class="section wrap">
      <p class="eyebrow">01 / Capabilities</p>
      <h2>From static benchmarking<br><em>to production-grade traffic replay.</em></h2>
      <p class="section-lead">Static single-endpoint benchmarks fail to trigger real-world caching or queueing bottlenecks. rload ensures every request and sequence is derived from real environments, 100% reproducible.</p>
      
      <div class="cards" id="feature-cards">
        <article class="card dark">
          <small>01 / HIGH FIDELITY</small>
          <h3>Native Nginx Log Replay</h3>
          <p>Stream-parse Common or Combined Nginx logs natively without writing complex Lua scripts. Supports sequential, shuffled, and random replay modes.</p>
          <code>--log-replay access.log --log-order shuffle --seed 42</code>
        </article>
        
        <article class="card">
          <small>02 / CUSTOM PAYLOADS</small>
          <h3>Structured JSONL Replay</h3>
          <p>Replay structured HTTP payloads (headers, methods, bodies) out-of-the-box. Gracefully mimic relative inter-arrival delays using high-precision timers.</p>
          <code>--request-file queries.jsonl --replay-timestamps</code>
        </article>
        
        <article class="card">
          <small>03 / PERFORMANCE PARITY</small>
          <h3>wrk-Parity Footprint & Speed</h3>
          <p>Built on bare-metal <code>mio</code> with thread-affinity. Maintains a constant ~3.5MB RSS footprint. Delivers near-identical throughput and latency distribution (MAE &lt; 1% vs. wrk) with zero scheduler noise.</p>
          <div class="bars">
            <span class="bar-label">rload (3.55MB)</span><i></i>
            <span class="bar-label">wrk (3.47MB)</span><i></i>
            <span class="bar-label">k6 (&gt;100MB)</span><i></i>
          </div>
        </article>
        
        <article class="card orange">
          <small>04 / REAL SRE WORKFLOWS</small>
          <h3>Pacing & Anti-Coordinated Omission</h3>
          <p>Prevents Coordinated Omission by tracking latency against scheduled send times. Program custom load profiles (step, burst, ramp-up) via flexible stage triggers.</p>
          <code>--replay-stages 10s:100,5s:1000</code>
        </article>
      </div>
    </section>

    <!-- 02 Comparison Section -->
    <section id="compare" class="contrast">
      <div class="section wrap">
        <p class="eyebrow lime">02 / Why rload?</p>
        <h2>wrk Semantics Parity.<br><em>Replay modern reality.</em></h2>
        <p class="section-lead" style="color: var(--text-muted); margin-bottom: 40px;">rload strikes the perfect balance between raw bare-metal execution speed and feature-rich traffic reproduction:</p>
        
        <div class="table" id="comparison-table">
          <div class="thead">
            <span>Feature / Dimension</span>
            <span>wrk 4.2.0 (C)</span>
            <span>k6 (Go / JS)</span>
            <span>rload v0.2.2 (Rust)</span>
          </div>
          <div>
            <span>Static HTTP Load</span>
            <b class="yes">✓ Extreme</b>
            <b class="no">✓ Heavy Footprint</b>
            <b class="yes">✓ Extreme (Parity)</b>
          </div>
          <div>
            <span>Memory Footprint (RSS)</span>
            <b class="yes">~3.5 MiB</b>
            <b class="no">&gt; 100 MiB</b>
            <b class="yes">~3.55 MiB (Parity)</b>
          </div>
          <div>
            <span>Nginx Access Log Replay</span>
            <b class="no">✗ No (Requires Lua)</b>
            <b class="no">✗ Memory Prohibitive</b>
            <b class="yes">✓ Native & Streamed</b>
          </div>
          <div>
            <span>JSONL Custom Replay</span>
            <b class="no">✗ No (Requires Lua)</b>
            <b class="yes">✓ Yes</b>
            <b class="yes">✓ Native & Streamed</b>
          </div>
          <div>
            <span>Rate Pacing</span>
            <b class="no">✗ No</b>
            <b class="yes">✓ Yes</b>
            <b class="yes">✓ High-Precision Native</b>
          </div>
          <div>
            <span>Anti-Coordinated Omission (CO)</span>
            <b class="no">✗ No (Requires wrk2)</b>
            <b class="no">✗ No</b>
            <b class="yes">✓ Native & Precise</b>
          </div>
          <div>
            <span>CI/CD Runner Friendliness</span>
            <b class="no">✗ Requires compile/deps</b>
            <b class="yes">✓ Yes</b>
            <b class="yes">🏆 Excellent (Static Binary)</b>
          </div>
        </div>
      </div>
    </section>

    <!-- 03 Install Guidelines -->
    <section id="install" class="section wrap install">
      <div class="install-text">
        <p class="eyebrow">03 / Installation</p>
        <h2>One-second install.<br><em>Ready out of the box.</em></h2>
        <p class="section-lead">We provide first-class cross-platform support with single, dependency-free pre-compiled static binaries. Pick the method that fits your environment:</p>
        
        <div class="install-tabs">
          <button class="tab-btn active" onclick="switchInstallTab('brew')">Homebrew</button>
          <button class="tab-btn" onclick="switchInstallTab('cargo')">Cargo</button>
          <button class="tab-btn" onclick="switchInstallTab('binary')">Static Binary</button>
        </div>

        <div class="links">
          <a href="https://github.com/wenhaozhao/rload/releases" target="_blank" rel="noopener noreferrer">GitHub Releases ↗</a>
          <a href="https://crates.io/crates/rload" target="_blank" rel="noopener noreferrer">Crates.io ↗</a>
          <a href="https://docs.rs/rload" target="_blank" rel="noopener noreferrer">API Docs ↗</a>
        </div>
      </div>

      <div class="install-code-container">
        <!-- Homebrew Tab Code -->
        <pre class="install-code active" id="code-brew"><code><span># Install via Homebrew (macOS & Linux)</span><br>brew install wenhaozhao/rload/rload<br><br><span># Verify installation</span><br>rload --help</code></pre>
        
        <!-- Cargo Tab Code -->
        <pre class="install-code" id="code-cargo"><code><span># Install via cargo (for Rust toolchains)</span><br>cargo install rload<br><br><span># Ensure ~/.cargo/bin is in your PATH</span><br>rload --help</code></pre>
        
        <!-- Static Binary Tab Code -->
        <pre class="install-code" id="code-binary"><code><span># For container & minimal server environments</span><br><span># 1. Download the archive for your architecture from GitHub Releases</span><br><span># 2. Extract and move the binary into your PATH, e.g.:</span><br>tar -xvf rload-v0.2.2-x86_64-unknown-linux-musl.tar.gz<br>sudo mv rload /usr/local/bin/<br><br><span># 3. Verify execution</span><br>rload --help</code></pre>
      </div>
    </section>

    <!-- 04 Practical Commands -->
    <section class="section wrap quickstart" id="quickstart-section">
      <p class="eyebrow">04 / Practical Commands</p>
      <h2>Common engineering scenarios,<br><em>copy and run instantly.</em></h2>
      <div class="quickstart-grid">
        <div class="qs-item">
          <h4>🔥 Scenario A: Static HTTP benchmarking (wrk parity)</h4>
          <p>Bench a target with 4 threads and 200 connections for 30 seconds, tracking latency distribution:</p>
          <pre><code>rload -t 4 -c 200 -d 30s https://api.yourdomain.com</code></pre>
        </div>
        <div class="qs-item">
          <h4>📂 Scenario B: High-fidelity Nginx log shuffle replay</h4>
          <p>Replay an Nginx access log in a shuffled order using a deterministic seed for reproducible results:</p>
          <pre><code>rload -c 100 -d 60s --log-replay ./access.log --log-order shuffle --seed 12345 http://staging.internal</code></pre>
        </div>
        <div class="qs-item">
          <h4>⏳ Scenario C: Log replay with relative timestamp pacing</h4>
          <p>Reproduce real temporal gaps based on access-log timestamps at double speed (2.0x pacing):</p>
          <pre><code>rload -c 50 --log-replay ./access.log --replay-timestamps --replay-speed 2.0 http://staging.internal</code></pre>
        </div>
        <div class="qs-item">
          <h4>📝 Scenario D: Structured JSONL request sequence replay</h4>
          <p>Sequentially replay structured query templates with custom headers, methods, and payloads:</p>
          <pre><code>rload -c 100 -d 5m --request-file ./requests.jsonl http://staging.internal</code></pre>
        </div>
      </div>
    </section>
  </main>

  <!-- Footer -->
  <footer class="footer wrap">
    <div class="footer-brand">
      <a class="logo" href="#top">
        <img src="logo.png" alt="rload logo" class="logo-img">
        <span>rload</span>
      </a>
      <p>Replay reality. Find the limit.</p>
    </div>
    <div class="footer-links">
      <a href="https://github.com/wenhaozhao/rload" target="_blank" rel="noopener noreferrer">GitHub Source</a>
      <a href="https://github.com/wenhaozhao/rload/blob/main/ROADMAP.md" target="_blank" rel="noopener noreferrer">Roadmap</a>
      <a href="https://github.com/wenhaozhao/rload/blob/main/CODING_STANDARDS.md" target="_blank" rel="noopener noreferrer">Standards</a>
    </div>
  </footer>

  <!-- Easy Tab-Switching Logic -->
  <script>
    function switchInstallTab(tabId) {
      // Toggle button states
      document.querySelectorAll('.tab-btn').forEach(btn => {
        btn.classList.remove('active');
      });
      event.target.classList.add('active');

      // Toggle code block display
      document.querySelectorAll('.install-code').forEach(codeBlock => {
        codeBlock.classList.remove('active');
      });
      document.getElementById('code-' + tabId).classList.add('active');
    }
  </script>
</body>
</html>