Skip to main content

Performance Test Results

Load tests run with Locust against the platform's three primary services. All tests target a shared deployment accessed via VPN unless noted otherwise.


1. Ingestion Service

Endpoint: POST /data-ingestion/nef/notify

UsersAvg (ms)p95 (ms)RPSFailures
254993~1800
100365510~1800

Conclusion: Ingestion is stable under both loads with zero failures. Throughput plateaus around 180 RPS, which means the bottleneck is downstream (Kafka/processor), not the ingestion endpoint itself. Latency degrades 7× from 25→100 users but remains well within acceptable range.


2. Data Storage Service

Endpoint: GET /data-storage/processed (ClickHouse query)

Remote (via reverse proxy)

UsersAvg (ms)p95 (ms)p99 (ms)RPSNotes
259013018085baseline
752614701100159baseline
75187340490168with replication

Localhost (before vs after optimization)

VersionUsersAvg (ms)RPS
Previous2501648~130
Current250134~700
Current1000765~700

Conclusion: The current version is a 12× improvement at 250 users (134ms vs 1648ms, 685 vs 132 RPS). Replication at 75 users actually improves latency (187ms vs 261ms) and slightly increases throughput. Reads benefit from replica distribution but still limited to the one instance of clickhouse. At 1000 users latency climbs to 765ms but still zero failures, suggesting the service degrades gracefully.


3. ML Inference Service

Endpoint: POST /pei-ml/inference

Previous version

HardwareUsersAvg (ms)p50 (ms)p95 (ms)RPSFailures
Standard53223004409.51 (model load)
Standard2516461700230013.21
Standard10067327200970012.14
Better1021822033023.00

Current version

HardwareUsersAvg (ms)p50 (ms)p95 (ms)RPSFailures
Standard2518717028061.30
Standard10014241300300049.60
Standard60023844260005400022.10
Better2556527893.50
Better100303280640161.82

Conclusion: ML inference is the primary bottleneck of the system, as expected for CPU-bound inference.

  • Current vs previous (standard hardware, 100u): 4× throughput gain (49.6 vs 12.1 RPS), 5.6× latency improvement (1424ms vs 6732ms avg).
  • Hardware matters most: On better hardware, 100u achieves 162 RPS at 303ms avg — a 13× throughput gain over the old version on standard hardware.
  • 600u stress test: System saturates at ~22 RPS with 23s average latency. No failures — the service queues requests rather than dropping them. Not suitable for high concurrency without horizontal scaling.

Conclusion

The ingestion and storage layers are not the bottleneck. All production load pressure lands on ML inference. The system scales and most of the services can be replicated to handle high concurrency. The problem on inference isn't the lack of GPU since models are tiny and can be served by a single CPU core. All the latency comes from data fetching ( including model and architecture ) and the overhead of passing the inference to a isolated container.