MaxConcurrentStreams Comparison: 100 vs 250
Last Updated: February 2026
HTTP Write Performance with Different MaxConcurrentStreams Settings. Configuration: HTTP/2, no auth, 100 concurrent connections, 50,000 requests (Go 1.26.0) with executor caching and search service reuse enabled.
Test Configuration
- Requests: 50,000
- Concurrency: 100 goroutines
- Database: nornic
- Warmup: 10 requests
- HTTP/2: Enabled (h2c cleartext mode)
- Authentication: Disabled (
-auth "") - Memory Optimizations: Executor caching + Search service reuse
Results Comparison
Apple M3 Max
MaxConcurrentStreams = 100
| Metric | Value |
|---|---|
| Throughput | 37,450.73 req/s |
| Average Latency | 2.67ms |
| P50 (median) | 2.62ms |
| P95 | 3.25ms |
| P99 | 4.12ms |
| P99.9 | 9.16ms |
| Max | 12.00ms |
| Min | 0.18ms |
| Success Rate | 100% |
MaxConcurrentStreams = 250 (Go Default)
| Metric | Value |
|---|---|
| Throughput | 37,092.65 req/s |
| Average Latency | 6.72ms |
| P50 (median) | 6.43ms |
| P95 | 8.95ms |
| P99 | 10.18ms |
| P99.9 | 29.19ms |
| Max | 31.16ms |
| Min | 0.29ms |
| Success Rate | 100% |
Performance Impact
Throughput
- 100 streams: 37,450.73 req/s
- 250 streams: 37,092.65 req/s
- Difference: 100 streams is +1.0% faster
Latency
- Average: 100: 2.67ms vs 250: 6.72ms
- P50: 100: 2.62ms vs 250: 6.43ms
- P95: 100: 3.25ms vs 250: 8.95ms
- P99: 100: 4.12ms vs 250: 10.18ms
- P99.9: 100: 9.16ms vs 250: 29.19ms
Analysis
Key Findings
With memory optimizations (executor caching + search service reuse) enabled:
- 100 streams provides slightly higher throughput (37,450 req/s vs 37,093 req/s for 250)
- Significantly better tail latency (P99: 4.12ms vs 10.18ms for 250)
- Lower high-percentile latency under load (P95/P99/P99.9 all improved)
- Much better median and average latency (P50/avg both improved by ~60%)
- No errors - 100% success rate maintained
- 89% reduction in memory growth during load
Why 100 Streams Performs Best
With 100 concurrent connections:
- Each connection can handle up to 100 streams (with MaxStreams=100)
- Total potential: 100 × 100 = 10,000 concurrent streams
- Actual usage: ~50,000 requests total, distributed across 100 connections
- 100 streams provides optimal balance - sufficient capacity without overhead
The performance advantage of 100 streams comes from:
- Lower memory overhead - fewer stream buffers per connection
- Better resource utilization - optimal for this workload size
- Reduced queuing - streams complete faster, reducing tail latency
- Memory optimizations eliminate per-request overhead (executor + search service caching)
Tail Latency Improvement
The 59.5% improvement in P99 latency (10.18ms → 4.12ms) with 100 streams is the most significant benefit:
- Fewer requests waiting for stream availability
- Better load distribution across connections
- Reduced queuing when connection limits are hit
- Sub-5ms P99 latency - excellent for high-concurrency workloads
Recommendations
For High-Concurrency Workloads
Use MaxConcurrentStreams = 100 when:
- Best performance - highest throughput and lowest latency
- Optimal for 100 concurrent connections - as tested
- Lower memory usage - fewer stream buffers
- Better security - DoS protection with lower limits
- Standard web workloads - sufficient for most use cases
Use MaxConcurrentStreams = 250 when:
- You need Go's default behavior (matches standard library)
- You have many more concurrent clients (200+)
- Each client makes many parallel requests
- Memory usage is not a concern
Current Default: 250
The default is 250 (Go's internal default) to:
- Match standard library behavior
- Provide good balance for most workloads
- Allow flexibility for high-concurrency scenarios
However, for optimal performance with ~100 concurrent connections, 100 streams provides better results.
Conclusion
MaxConcurrentStreams = 100 (with memory optimizations) provides stronger tail-latency performance:
- Slightly higher throughput (37,451 req/s vs 37,093 req/s for 250)
- 59.5% P99 latency improvement (4.12ms vs 10.18ms for 250) - most significant
- 63.7% P95 latency improvement (3.25ms vs 8.95ms for 250)
- 60.3% average latency improvement (2.67ms vs 6.72ms for 250)
- 89% reduction in memory growth during load
- No performance regressions
- 100% success rate maintained
The combination of MaxConcurrentStreams = 100 and memory optimizations (executor caching + search service reuse) provides stronger tail-latency behavior for high-concurrency database workloads. The sub-5ms P99 latency (4.12ms) demonstrates excellent performance. While the default is 250 (matching Go's standard library), 100 streams is recommended when tail latency is the priority with ~100 concurrent connections.