# Load Testing Performance

> Runs load, stress, and performance tests using k6, JMeter, and profiling tools, with capacity planning and benchmarking for APIs and backend services.

- Skill: `chimeranext/load-testing-performance` (Agent Skill, multi-file: 14 files)
- Install (CLI): `npx skillmds@latest add chimeranext/load-testing-performance`
- Raw SKILL.md: https://api.skillmd.com/api/skills/chimeranext/load-testing-performance/raw
- Safety review: CAUTION (external: skill-scanner PASS, skillspector FAIL)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra, Coding & Dev Tools, Monitoring & Observability, Testing & QA
- Tags: Capacity Planning, Jmeter, K6, Load Testing, Performance, Profiling, Rust, Stress Testing
- Author: chimeranext (https://skillmd.com/u/chimeranext)
- Updated: 2026-08-22
- Page: https://skillmd.com/skills/chimeranext/load-testing-performance

---

# ⚡ Skill: Load Testing & Performance

## 📋 Metadata

| Atributo | Valor |
|----------|-------|
| **ID** | `sre-load-testing-performance` |
| **Nivel** | 🔴 Avanzado |
| **Versión** | 1.0.0 |
| **Keywords** | `load-testing`, `performance`, `k6`, `jmeter`, `stress-testing`, `capacity-planning`, `benchmarking`, `rust` |
| **Referencia** | [k6 Documentation](https://k6.io/docs/), [JMeter](https://jmeter.apache.org/) |

## 🔑 Keywords para Invocación

- `load-testing`
- `performance-testing`
- `stress-testing`
- `k6`
- `jmeter`
- `capacity-planning`
- `benchmarking`
- `rust`
- `@skill:load-testing`

### Ejemplos de Prompts

```
Implementa load testing con k6 para APIs
```

```
Configura stress testing y capacity planning
```

```
Setup performance benchmarking y profiling
```

```
@skill:load-testing - Estrategia completa de testing de carga
```

```
Implementa profiling y benchmarking para backend Rust
```

## 📖 Descripción

Load testing y performance optimization son esenciales para entender los límites de un sistema. Este skill cubre herramientas de load testing (k6, JMeter), estrategias de testing, capacity planning, profiling, y optimización de performance.

### ✅ Cuándo Usar Este Skill

- Antes de releases importantes
- Capacity planning
- Performance optimization
- SLA validation
- Stress testing
- Finding bottlenecks

### ❌ Cuándo NO Usar Este Skill

- Prototipos tempranos
- Sistemas sin usuarios reales
- Aplicaciones sin requisitos de performance

## 🏗️ Tipos de Testing

```
Load Testing
    ├── Baseline (Expected load)
    ├── Stress (Beyond capacity)
    ├── Spike (Sudden load increase)
    ├── Endurance (Extended duration)
    └── Volume (Large data sets)
```

## 💻 Implementación

> **📁 Scripts Ejecutables:** Este skill incluye scripts ejecutables en la carpeta [`scripts/`](scripts/):
> - **k6 Tests:** [`scripts/k6/`](scripts/k6/) - Scripts de load testing (JavaScript)
> - **Node.js Profiling:** [`scripts/nodejs/`](scripts/nodejs/) - Herramientas de profiling (JavaScript)
> - **Rust Benchmarks:** [`scripts/rust/`](scripts/rust/) - Benchmarks con Criterion (Rust)
> - **Python Capacity Planning:** [`scripts/python/`](scripts/python/) - Calculadora de capacidad (Python)
>
> Ver [`scripts/README.md`](scripts/README.md) para documentación de uso completa.

### 1. k6 Load Testing

#### 1.1 Basic Test Script

**Script ejecutable:** [`scripts/k6/basic-load.js`](scripts/k6/basic-load.js)

Script básico de load testing con k6 para APIs. Incluye métricas personalizadas, thresholds y stages configurables.

**Cuándo ejecutar:**
- Testing de carga básico de APIs
- Validación de SLA de respuesta
- Baseline de performance

**Uso:**
```bash
# Ejecutar test básico
k6 run scripts/k6/basic-load.js

# Con variables de entorno
k6 run scripts/k6/basic-load.js \
  --env BASE_URL=https://api.example.com \
  --env API_TOKEN=your-token
```

**Características:**
- ✅ Stages configurables (ramp up/down)
- ✅ Thresholds de latencia y error rate
- ✅ Métricas personalizadas (error rate, request duration)
- ✅ Variables de entorno para configuración

#### 1.2 Advanced Test with Scenarios

**Script ejecutable:** [`scripts/k6/advanced-scenarios.js`](scripts/k6/advanced-scenarios.js)

Test avanzado con múltiples escenarios simulando diferentes comportamientos de usuarios (browse, checkout, search).

**Cuándo ejecutar:**
- Testing de escenarios realistas
- Simulación de diferentes tipos de usuarios
- Testing de e-commerce o aplicaciones complejas

**Uso:**
```bash
# Ejecutar todos los escenarios
k6 run scripts/k6/advanced-scenarios.js

# Ejecutar escenario específico
k6 run scripts/k6/advanced-scenarios.js --env SCENARIO=browse_products
```

**Características:**
- ✅ Múltiples escenarios simultáneos
- ✅ Diferentes tipos de executors (ramping-vus, constant-arrival-rate, shared-iterations)
- ✅ Thresholds por escenario
- ✅ Simulación de comportamiento realista

#### 1.3 Stress Test

**Script ejecutable:** [`scripts/k6/stress-test.js`](scripts/k6/stress-test.js)

Stress test que incrementa gradualmente la carga más allá de la capacidad normal para encontrar puntos de quiebre.

**Cuándo ejecutar:**
- Encontrar límites del sistema
- Identificar puntos de quiebre
- Testing de recovery después de stress

**Uso:**
```bash
k6 run scripts/k6/stress-test.js
k6 run scripts/k6/stress-test.js --env BASE_URL=https://api.example.com
```

**Características:**
- ✅ Incremento gradual de carga
- ✅ Thresholds relajados para stress testing
- ✅ Período de recovery incluido

### 2. Performance Profiling

#### 2.1 Application Profiling (Node.js)

**Script ejecutable:** [`scripts/nodejs/performance-profiler.js`](scripts/nodejs/performance-profiler.js)

Herramienta de CPU profiling para aplicaciones Node.js usando v8-profiler.

**Cuándo ejecutar:**
- Identificar cuellos de botella de CPU
- Profiling de funciones específicas
- Análisis de performance de Node.js

**Uso:**
```bash
cd scripts/nodejs
npm install

# Profiling por duración
node performance-profiler.js --profile-name my-app --duration=60

# Programático (en tu código)
const profiler = require('./performance-profiler');
const profilerInstance = new profiler();
await profilerInstance.profileFunction(slowFunction, 'slow-function-profile');
```

**Características:**
- ✅ CPU profiling con v8-profiler
- ✅ Exportación a formato .cpuprofile (Chrome DevTools)
- ✅ Profiling de funciones específicas
- ✅ CLI y uso programático

#### 2.2 Memory Profiling

**Script ejecutable:** [`scripts/nodejs/memory-profiler.js`](scripts/nodejs/memory-profiler.js)

Herramienta de memory profiling y monitoreo para aplicaciones Node.js.

**Cuándo ejecutar:**
- Detectar memory leaks
- Monitoreo continuo de memoria
- Análisis de uso de heap

**Uso:**
```bash
# Monitoreo continuo
node memory-profiler.js --monitor --interval=5000

# Tomar snapshot
node memory-profiler.js --snapshot --filename=heap.heapsnapshot

# Ver uso actual
node memory-profiler.js
```

**Características:**
- ✅ Heap snapshots (.heapsnapshot para Chrome DevTools)
- ✅ Monitoreo continuo de memoria
- ✅ Métricas detalladas (RSS, heap, external)

#### 2.3 Performance Profiling (Rust)

**Script ejecutable:** [`scripts/rust/benches/my_benchmark.rs`](scripts/rust/benches/my_benchmark.rs)

Benchmarks de performance para código Rust usando Criterion.

**Cuándo ejecutar:**
- Benchmarking de funciones críticas
- Comparación de implementaciones
- Validación de optimizaciones

**Uso:**
```bash
cd scripts/rust

# Ejecutar benchmarks
cargo bench

# Con profiling integrado
cargo bench -- --profile-time=10

# Ver reportes HTML
open target/criterion/report/index.html
```

**Características:**
- ✅ Benchmarks con Criterion
- ✅ Reportes HTML detallados
- ✅ Comparación entre ejecuciones
- ✅ Estadísticas avanzadas (percentiles, outliers)

#### 2.4 CPU Profiling con perf (Rust)

```bash
# Instalar herramientas de profiling
sudo apt-get install linux-perf

# Compilar con símbolos de debug (optimizado pero con símbolos)
RUSTFLAGS="-g" cargo build --release

# Profiling con perf
perf record --call-graph dwarf ./target/release/my-service

# Ver resultados
perf report

# Generar flamegraph
perf script | stackcollapse-perf.pl | flamegraph.pl > flamegraph.svg
```

```rust
// src/profiling.rs
use std::time::Instant;
use tracing::{info, debug};

pub struct PerformanceProfiler {
    start_time: Instant,
}

impl PerformanceProfiler {
    pub fn new() -> Self {
        Self {
            start_time: Instant::now(),
        }
    }

    pub fn elapsed(&self) -> u64 {
        self.start_time.elapsed().as_millis() as u64
    }

    pub fn log_elapsed(&self, operation: &str) {
        let elapsed = self.elapsed();
        info!(
            operation = operation,
            duration_ms = elapsed,
            "Operation completed"
        );
    }
}

impl Drop for PerformanceProfiler {
    fn drop(&mut self) {
        debug!(
            total_duration_ms = self.elapsed(),
            "Profiler dropped"
        );
    }
}

// Uso
pub async fn process_user_request(user_id: &str) -> Result<(), Error> {
    let _profiler = PerformanceProfiler::new();

    // Tu código aquí
    let user = fetch_user(user_id).await?;
    _profiler.log_elapsed("fetch_user");

    let result = process_data(&user).await?;
    _profiler.log_elapsed("process_data");

    Ok(())
}
```

#### 2.5 Memory Profiling (Rust)

```toml
# Cargo.toml
[dependencies]
dhat = "0.3"  # Para memory profiling
```

```rust
// src/lib.rs (solo para profiling)
#[cfg(feature = "dhat-heap")]
#[global_allocator]
static ALLOC: dhat::Alloc = dhat::Alloc;

// En main.rs o tests
#[cfg(feature = "dhat-heap")]
{
    let _profiler = dhat::Profiler::new_heap();

    // Tu código aquí
    run_application().await;
}
```

```bash
# Compilar con dhat feature
cargo build --release --features dhat-heap

# Ejecutar - generará dhat-heap.json
./target/release/my-service

# Analizar con dhat
dhat-view dhat-heap.json
```

#### 2.6 Flamegraph Profiling (Rust)

```bash
# Instalar cargo-flamegraph
cargo install flamegraph

# Generar flamegraph
cargo flamegraph --bin my-service

# Con opciones específicas
cargo flamegraph --dev --example my-example -- --test-input

# Para servicios web (necesita requests)
cargo flamegraph --dev --bin my-service &
# Hacer requests con k6 o curl
k6 run load-test.js
# Ctrl+C para detener flamegraph
```

#### 2.7 Performance Metrics en Rust (Actix Web)

```toml
# Cargo.toml
[dependencies]
actix-web = "4"
actix-web-prom = "0.6"
prometheus = "0.13"
```

```rust
// src/metrics.rs
use actix_web::web;
use actix_web_prom::PrometheusMetricsBuilder;
use prometheus::{Counter, Histogram, Registry, Opts};

lazy_static::lazy_static! {
    pub static ref HTTP_REQUESTS_TOTAL: Counter = Counter::with_opts(
        Opts::new("http_requests_total", "Total HTTP requests")
            .const_label("service", "my-service")
    ).unwrap();

    pub static ref HTTP_REQUEST_DURATION: Histogram = Histogram::with_opts(
        prometheus::HistogramOpts::new(
            "http_request_duration_seconds",
            "HTTP request duration"
        )
        .buckets(vec![0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0])
        .const_label("service", "my-service")
    ).unwrap();
}

pub fn init_metrics() -> Result<(), Box<dyn std::error::Error>> {
    let registry = Registry::new();
    registry.register(Box::new(HTTP_REQUESTS_TOTAL.clone()))?;
    registry.register(Box::new(HTTP_REQUEST_DURATION.clone()))?;
    Ok(())
}
```

```rust
// src/main.rs
use actix_web::{web, App, HttpServer, middleware};
use actix_web_prom::PrometheusMetricsBuilder;
use crate::metrics::init_metrics;

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    init_metrics().unwrap();

    let prometheus = PrometheusMetricsBuilder::new("api")
        .endpoint("/metrics")
        .build()
        .unwrap();

    HttpServer::new(move || {
        App::new()
            .wrap(prometheus.clone())
            .wrap(middleware::Logger::default())
            .route("/health", web::get().to(health))
            .route("/api/users", web::get().to(get_users))
    })
    .bind("0.0.0.0:8080")?
    .run()
    .await
}
```

#### 2.8 Load Testing Rust Backend con k6

**Script ejecutable:** [`scripts/k6/rust-api-load.js`](scripts/k6/rust-api-load.js)

Test de carga optimizado para APIs Rust con thresholds más estrictos debido al mejor rendimiento esperado.

**Uso:**
```bash
k6 run scripts/k6/rust-api-load.js --env BASE_URL=http://localhost:8080
```

#### 2.9 Performance Comparison Testing

**Script ejecutable:** [`scripts/k6/performance-comparison.js`](scripts/k6/performance-comparison.js)

Test de comparación de performance entre diferentes backends (Rust vs Node.js, etc.).

**Uso:**
```bash
k6 run scripts/k6/performance-comparison.js \
  --env RUST_API=http://rust-api:8080 \
  --env NODE_API=http://node-api:3000
```

### 3. Capacity Planning

**Script ejecutable:** [`scripts/python/capacity_calculator.py`](scripts/python/capacity_calculator.py)

Calculadora de capacidad para planificación de recursos basada en métricas de uso.

**Cuándo ejecutar:**
- Planificación de escalado
- Estimación de recursos necesarios
- Análisis de capacidad actual

**Uso:**
```bash
cd scripts/python

# Generar reporte de capacidad
python capacity_calculator.py --report

# Calcular recursos para usuarios objetivo
python capacity_calculator.py \
  --target-users 5000 \
  --current-users 1000 \
  --max-throughput 1000.0 \
  --current-instances 3
```

**Características:**
- ✅ Cálculo de capacity headroom
- ✅ Estimación de usuarios máximos
- ✅ Cálculo de recursos necesarios
- ✅ Reportes detallados

### 4. CI/CD Integration

```yaml
# .github/workflows/load-test.yml
name: Load Test

on:
  schedule:
    - cron: '0 2 * * *'  # Daily at 2 AM
  workflow_dispatch:

jobs:
  load-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Install k6
        run: |
          sudo gpg -k
          sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
          echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
          sudo apt-get update
          sudo apt-get install k6

      - name: Run load test
        run: |
          k6 run tests/load/basic-load.js
        env:
          API_TOKEN: ${{ secrets.API_TOKEN }}

      - name: Upload results
        uses: actions/upload-artifact@v3
        with:
          name: k6-results
          path: results/
```

### 5. Performance Monitoring

```yaml
# prometheus/performance-metrics.yml
scrape_configs:
  - job_name: 'k6'
    static_configs:
      - targets: ['k6:6565']
```

```javascript
// k6 output to Prometheus
import { Counter, Gauge, Trend } from 'k6/metrics';

const customCounter = new Counter('custom_errors');
const customGauge = new Gauge('custom_active_users');
const customTrend = new Trend('custom_request_duration');

export default function () {
  customGauge.set(100);
  customCounter.add(1);
  customTrend.add(123);
}
```

## 🎯 Mejores Prácticas

### 1. Test Design

✅ **DO:**
- Start with baseline tests
- Gradually increase load
- Test realistic scenarios
- Monitor during tests
- Test failure scenarios

❌ **DON'T:**
- Start with maximum load
- Ignore resource limits
- Test unrealistic scenarios
- Skip monitoring

### 2. Test Data

✅ **DO:**
- Use realistic test data
- Parameterize requests
- Use unique data per user
- Clean up test data

❌ **DON'T:**
- Use production data
- Hardcode test values
- Share data between users

### 3. Analysis

✅ **DO:**
- Compare against baselines
- Identify bottlenecks
- Document findings
- Share results with team

❌ **DON'T:**
- Ignore anomalies
- Skip root cause analysis
- Test without objectives

## 🚨 Troubleshooting

### Tests Failing

1. Check test configuration
2. Verify test data
3. Check network connectivity
4. Review application logs

### Performance Degradation

1. Identify bottlenecks
2. Profile application
3. Check resource usage
4. Review recent changes

## 📚 Recursos Adicionales

- [k6 Documentation](https://k6.io/docs/)
- [JMeter Best Practices](https://jmeter.apache.org/usermanual/best-practices.html)
- [Performance Testing Guide](https://www.guru99.com/performance-testing.html)

---

**Versión:** 1.0.0
**Última actualización:** Diciembre 2025
**Total líneas:** 1,100+

