Remote Load Test Results: middleware.atraxion.com
Date: 2026-02-16 Server: https://middleware.atraxion.com (production testing server) Tool: k6 v1.5.0 Test data: Real Odoo payloads extracted from legacy DB (20k products, 10k partners, 10k sale orders, 10k stocks)
Summary
The remote server plateaus at ~35-40 req/s regardless of concurrency. This is 10x slower than local (350 req/s), explained by server sizing (CPU, PHP-FPM workers, DB connections) and network latency (~130ms round-trip). The optimal concurrency for this server is 10 VUs -- any higher just adds latency without improving throughput.
Remote Results: Inbound (POST) Endpoints
10 VUs (30s duration)
| Endpoint | Req/s | P95 Latency | Success Rate | vs Legacy (3/s) |
|---|---|---|---|---|
| Products | 37.76 | 342ms | 100.00% | 12.6x |
| Partners | 40.90 | 312ms | 99.59% | 13.6x |
| Sale Orders | 42.93 | 300ms | 100.00% | 14.3x |
| Stocks | 41.84 | 314ms | 51.74%* | 13.9x |
25 VUs (15s duration)
| Endpoint | Req/s | P95 Latency | Success Rate | vs Legacy (3/s) |
|---|---|---|---|---|
| Products | 31.23 | 968ms | 99.79% | 10.4x |
| Partners | 33.46 | 916ms | 99.81% | 11.2x |
| Sale Orders | 35.69 | 824ms | 100.00% | 11.9x |
| Stocks | 32.88 | 893ms | 29.64%* | 11.0x |
50 VUs (12s duration)
| Endpoint | Req/s | P95 Latency | Success Rate | vs Legacy (3/s) |
|---|---|---|---|---|
| Products | 31.20 | 1,747ms | 100.00% | 10.4x |
| Partners | 33.73 | 1,678ms | 99.77% | 11.2x |
| Sale Orders | 34.94 | 1,556ms | 100.00% | 11.6x |
| Stocks | 33.19 | 1,640ms | 23.29%* | 11.1x |
*Stocks failures are caused by a missing php-bcmath extension on the server (500 Internal Server Error: undefined function bccomp), not a performance issue.
1 VU baseline (30s duration)
| Endpoint | Req/s | P95 Latency | Success Rate |
|---|---|---|---|
| Products | 6.25 | 172ms | 100.00% |
| Partners | 8.00 | 157ms | 100.00% |
| Sale Orders | 7.59 | 153ms | 100.00% |
| Stocks | 8.31 | 146ms | 100.00% |
Comparison: Local vs Remote
Products (POST /api/v1/products)
| VUs | Local req/s | Local P95 | Remote req/s | Remote P95 | Throughput ratio |
|---|---|---|---|---|---|
| 1 | 39.95 | 26ms | 6.25 | 172ms | 6.4x |
| 10 | 278.67 | 65ms | 37.76 | 342ms | 7.4x |
| 25 | 323.50 | 135ms | 31.23 | 968ms | 10.4x |
| 50 | 350.73 | 190ms | 31.20 | 1,747ms | 11.2x |
All endpoints at peak concurrency (50 VUs)
| Endpoint | Local Best (req/s) | Remote 50 VU (req/s) | Ratio |
|---|---|---|---|
| Products | 350.73 | 31.20 | 11.2x |
| Partners | 296.00 | 33.73 | 8.8x |
| Sale Orders | 362.00 | 34.94 | 10.4x |
| Stocks | 405.00 | 33.19 | 12.2x |
Scaling behaviour
Local: Throughput scales linearly from 1 to 50 VUs (40 -> 351 req/s for products), indicating the local machine has ample CPU and DB capacity.
Remote: Throughput peaks at 10 VUs (~40 req/s) and then decreases slightly at 25-50 VUs while latency rises sharply. This is classic server saturation -- adding more concurrent connections just increases queueing without improving throughput.
Local scaling: 1 VU ──── 10 VU ──── 25 VU ──── 50 VU
Products: 40 ────── 279 ────── 324 ────── 351 (linear growth)
Remote scaling: 1 VU ──── 10 VU ──── 25 VU ──── 50 VU
Products: 6.3 ───── 37.8 ───── 31.2 ───── 31.2 (plateau at 10 VU)
Latency Analysis
The baseline network round-trip to the server is ~130-150ms (visible in the 1 VU P95 results). This dominates at low concurrency:
| VUs | Remote P95 | Network overhead | Server processing |
|---|---|---|---|
| 1 | 172ms | ~130ms | ~42ms |
| 10 | 342ms | ~130ms | ~212ms |
| 25 | 968ms | ~130ms | ~838ms (queueing) |
| 50 | 1,747ms | ~130ms | ~1,617ms (heavy queueing) |
At 25+ VUs, most of the latency is queueing time waiting for a PHP-FPM worker or DB connection.
Rate Limiting
The server has Symfony rate limiters configured at the application level:
| Limiter | Limit | Window |
|---|---|---|
api_inbound |
3,000 | 1 minute |
api_write |
1,500 | 1 minute |
api_read |
3,000 | 1 minute |
The POST endpoints use the api_write limiter (1,500/min = 25 req/s sustained). Since the server's actual capacity is ~35-40 req/s, this provides adequate headroom for burst traffic while preventing sustained overload.
Test durations were kept short (12-15s at higher VUs) to stay within rate limit windows.
Issues Found
1. Missing php-bcmath extension (Critical)
The stocks endpoint returns 500 errors for payloads that trigger bccomp():
Attempted to call undefined function "bccomp" from namespace "App\Service". (500 Internal Server Error)
Impact: ~50-75% of stock update requests fail.
Fix: Install php-bcmath on the server (apt install php8.4-bcmath or equivalent).
2. TLS certificate verification
k6 could not verify the server's TLS certificate (x509: OSStatus -26276). Tests required --insecure-skip-tls-verify. This may indicate a self-signed or improperly chained certificate.
Recommendations
- Install php-bcmath on the server to fix stock endpoint failures.
- Keep Odoo concurrency at 5-10 for this server -- higher concurrency adds latency without improving throughput.
- Scale server resources if higher throughput is needed: more PHP-FPM workers, CPU cores, or DB connection pool size.
- Fix TLS certificate chain so clients don't need to skip verification.
- 128k pricelist scenario at current remote throughput: 128,000 / 35 = ~61 minutes (vs 12 hours legacy = 12x faster). Scaling the server to match local performance would reduce this to ~6 minutes.
Test Environment
- Client: macOS Darwin 25.2.0 (Apple Silicon)
- Server: middleware.atraxion.com (nginx reverse proxy + PHP-FPM + MySQL)
- k6 version: v1.5.0
- Local tests date: 2026-02-02
- Remote tests date: 2026-02-16