← All Use Cases
🌐
Full Factorial Design

HTTP/2 Stream Multiplexing

Full factorial of max concurrent streams, window size, header table size, and priority for page load time

Summary

This experiment investigates http/2 stream multiplexing. Full factorial of max concurrent streams, window size, header table size, and priority for page load time.

The design varies 4 factors: max concurrent streams (streams), ranging from 50 to 250, window size kb (KB), ranging from 64 to 1024, header table kb (KB), ranging from 4 to 64, and priority enabled, ranging from off to on. The goal is to optimize 2 responses: page load ms (ms) (minimize) and ttfb ms (ms) (minimize). Fixed conditions held constant across all runs include tls = 1.3, server = nginx.

A full factorial design was used to explore all 16 possible combinations of the 4 factors at two levels. This guarantees that every main effect and interaction can be estimated independently, at the cost of a larger experiment (16 runs).

Quadratic response surface models were fitted to capture potential curvature and factor interactions. The RSM contour plots below visualize how pairs of factors jointly affect each response.

Key Findings

For page load ms, the most influential factors were max concurrent streams (44.8%), header table kb (21.3%), window size kb (19.0%). The best observed value was 768.0 (at max concurrent streams = 250, window size kb = 64, header table kb = 4).

For ttfb ms, the most influential factors were max concurrent streams (43.8%), priority enabled (38.5%), header table kb (15.1%). The best observed value was 59.0 (at max concurrent streams = 250, window size kb = 64, header table kb = 4).

Recommended Next Steps

Experimental Setup

Factors

FactorLowHighUnit
max_concurrent_streams50250streams
window_size_kb641024KB
header_table_kb464KB
priority_enabledoffon

Fixed: tls = 1.3, server = nginx

Responses

ResponseDirectionUnit
page_load_ms↓ minimizems
ttfb_ms↓ minimizems

Configuration

use_cases/54_http2_stream_multiplexing/config.json
{ "metadata": { "name": "HTTP/2 Stream Multiplexing", "description": "Full factorial of max concurrent streams, window size, header table size, and priority for page load time" }, "factors": [ { "name": "max_concurrent_streams", "levels": [ "50", "250" ], "type": "continuous", "unit": "streams" }, { "name": "window_size_kb", "levels": [ "64", "1024" ], "type": "continuous", "unit": "KB" }, { "name": "header_table_kb", "levels": [ "4", "64" ], "type": "continuous", "unit": "KB" }, { "name": "priority_enabled", "levels": [ "off", "on" ], "type": "categorical", "unit": "" } ], "fixed_factors": { "tls": "1.3", "server": "nginx" }, "responses": [ { "name": "page_load_ms", "optimize": "minimize", "unit": "ms" }, { "name": "ttfb_ms", "optimize": "minimize", "unit": "ms" } ], "settings": { "operation": "full_factorial", "test_script": "use_cases/54_http2_stream_multiplexing/sim.sh" } }

Experimental Matrix

The Full Factorial Design produces 16 runs. Each row is one experiment with specific factor settings.

Runmax_concurrent_streamswindow_size_kbheader_table_kbpriority_enabled
150102464on
2250644on
35010244on
450102464off
5250102464off
62506464off
725010244off
8250644off
950644on
10506464off
1125010244on
12250102464on
135010244off
142506464on
1550644off
16506464on

Step-by-Step Workflow

1

Preview the design

Terminal
$ doe info --config use_cases/54_http2_stream_multiplexing/config.json
2

Generate the runner script

Terminal
$ doe generate --config use_cases/54_http2_stream_multiplexing/config.json \ --output use_cases/54_http2_stream_multiplexing/results/run.sh --seed 42
3

Execute the experiments

Terminal
$ bash use_cases/54_http2_stream_multiplexing/results/run.sh
4

Analyze results

Terminal
$ doe analyze --config use_cases/54_http2_stream_multiplexing/config.json
5

Get optimization recommendations

Terminal
$ doe optimize --config use_cases/54_http2_stream_multiplexing/config.json
6

Multi-objective optimization

With 2 competing responses, use --multi to find the best compromise via Derringer–Suich desirability.

Terminal
$ doe optimize --config use_cases/54_http2_stream_multiplexing/config.json --multi
7

Generate the HTML report

Terminal
$ doe report --config use_cases/54_http2_stream_multiplexing/config.json \ --output use_cases/54_http2_stream_multiplexing/results/report.html

Features Exercised

FeatureValue
Design typefull_factorial
Factor typescontinuous (3), categorical (1)
Arg styledouble-dash
Responses2 (page_load_ms ↓, ttfb_ms ↓)
Total runs16

Analysis Results

Generated from actual experiment runs using the DOE Helper Tool.

Response: page_load_ms

Top factors: max_concurrent_streams (44.8%), header_table_kb (21.3%), window_size_kb (19.0%).

ANOVA

SourceDFSSMSFp-value
SourceDFSSMSFp-value
max_concurrent_streams1336690.0625336690.06253.9420.1039
window_size_kb160639.062560639.06250.7100.4379
header_table_kb176314.062576314.06250.8930.3879
priority_enabled137539.062537539.06250.4400.5367
max_concurrent_streams*window_size_kb1316125.0625316125.06253.7010.1124
max_concurrent_streams*header_table_kb162375.062562375.06250.7300.4318
max_concurrent_streams*priority_enabled1517.5625517.56250.0060.9410
window_size_kb*header_table_kb164135.562564135.56250.7510.4258
window_size_kb*priority_enabled15365.56255365.56250.0630.8121
header_table_kb*priority_enabled1612.5625612.56250.0070.9358
Error5427059.312585411.8625
Total151387372.937592491.5292

Pareto Chart

Pareto chart for page_load_ms

Main Effects Plot

Main effects plot for page_load_ms

Normal Probability Plot of Effects

Normal probability plot for page_load_ms

Half-Normal Plot of Effects

Half-normal plot for page_load_ms

Model Diagnostics

Model diagnostics for page_load_ms

Response: ttfb_ms

Top factors: max_concurrent_streams (43.8%), priority_enabled (38.5%), header_table_kb (15.1%).

ANOVA

SourceDFSSMSFp-value
SourceDFSSMSFp-value
max_concurrent_streams13813.06253813.06252.1980.1983
window_size_kb114.062514.06250.0080.9318
header_table_kb1451.5625451.56250.2600.6316
priority_enabled12943.06252943.06251.6970.2495
max_concurrent_streams*window_size_kb17525.56257525.56254.3390.0917
max_concurrent_streams*header_table_kb1540.5625540.56250.3120.6007
max_concurrent_streams*priority_enabled1248.0625248.06250.1430.7208
window_size_kb*header_table_kb1689.0625689.06250.3970.5562
window_size_kb*priority_enabled122.562522.56250.0130.9136
header_table_kb*priority_enabled1126.5625126.56250.0730.7979
Error58672.81251734.5625
Total1525046.93751669.7958

Pareto Chart

Pareto chart for ttfb_ms

Main Effects Plot

Main effects plot for ttfb_ms

Normal Probability Plot of Effects

Normal probability plot for ttfb_ms

Half-Normal Plot of Effects

Half-normal plot for ttfb_ms

Model Diagnostics

Model diagnostics for ttfb_ms

Response Surface Plots

3D surfaces fitted with quadratic RSM. Red dots are observed data points.

page load ms max concurrent streams vs header table kb

RSM surface: page load ms max concurrent streams vs header table kb

page load ms max concurrent streams vs window size kb

RSM surface: page load ms max concurrent streams vs window size kb

page load ms window size kb vs header table kb

RSM surface: page load ms window size kb vs header table kb

ttfb ms max concurrent streams vs header table kb

RSM surface: ttfb ms max concurrent streams vs header table kb

ttfb ms max concurrent streams vs window size kb

RSM surface: ttfb ms max concurrent streams vs window size kb

ttfb ms window size kb vs header table kb

RSM surface: ttfb ms window size kb vs header table kb

Multi-Objective Optimization

When responses compete, Derringer–Suich desirability finds the best compromise. Each response is scaled to a 0–1 desirability, then combined via a weighted geometric mean.

Overall Desirability
D = 0.9545

Per-Response Desirability

ResponseWeightDesirabilityPredictedDir
page_load_ms 1.5
0.9545
768.00 0.9545 768.00 ms
ttfb_ms 1.0
0.9545
59.00 0.9545 59.00 ms

Recommended Settings

FactorValue
max_concurrent_streams250 streams
window_size_kb64 KB
header_table_kb4 KB
priority_enabledoff

Source: from observed run #12

Trade-off Summary

Sacrifice = how much worse than single-objective best.

ResponsePredictedBest ObservedSacrifice
ttfb_ms59.0059.00+0.00

Top 3 Runs by Desirability

RunDFactor Settings
#10.8000max_concurrent_streams=50, window_size_kb=1024, header_table_kb=64, priority_enabled=on
#110.7989max_concurrent_streams=50, window_size_kb=1024, header_table_kb=64, priority_enabled=off

Model Quality

ResponseType
ttfb_ms0.3108linear

Full Multi-Objective Output

doe optimize --multi
============================================================ MULTI-OBJECTIVE OPTIMIZATION Method: Derringer-Suich Desirability Function ============================================================ Overall desirability: D = 0.9545 Response Weight Desirability Predicted Direction --------------------------------------------------------------------- page_load_ms 1.5 0.9545 768.00 ms ↓ ttfb_ms 1.0 0.9545 59.00 ms ↓ Recommended settings: max_concurrent_streams = 250 streams window_size_kb = 64 KB header_table_kb = 4 KB priority_enabled = off (from observed run #12) Trade-off summary: page_load_ms: 768.00 (best observed: 768.00, sacrifice: +0.00) ttfb_ms: 59.00 (best observed: 59.00, sacrifice: +0.00) Model quality: page_load_ms: R² = 0.3714 (linear) ttfb_ms: R² = 0.3108 (linear) Top 3 observed runs by overall desirability: 1. Run #12 (D=0.9545): max_concurrent_streams=250, window_size_kb=64, header_table_kb=4, priority_enabled=off 2. Run #1 (D=0.8000): max_concurrent_streams=50, window_size_kb=1024, header_table_kb=64, priority_enabled=on 3. Run #11 (D=0.7989): max_concurrent_streams=50, window_size_kb=1024, header_table_kb=64, priority_enabled=off

Full Analysis Output

doe analyze
=== Main Effects: page_load_ms === Factor Effect Std Error % Contribution -------------------------------------------------------------- max_concurrent_streams -290.1250 76.0311 44.8% header_table_kb 138.1250 76.0311 21.3% window_size_kb -123.1250 76.0311 19.0% priority_enabled -96.8750 76.0311 14.9% === ANOVA Table: page_load_ms === Source DF SS MS F p-value ----------------------------------------------------------------------------- max_concurrent_streams 1 336690.0625 336690.0625 3.942 0.1039 window_size_kb 1 60639.0625 60639.0625 0.710 0.4379 header_table_kb 1 76314.0625 76314.0625 0.893 0.3879 priority_enabled 1 37539.0625 37539.0625 0.440 0.5367 max_concurrent_streams*window_size_kb 1 316125.0625 316125.0625 3.701 0.1124 max_concurrent_streams*header_table_kb 1 62375.0625 62375.0625 0.730 0.4318 max_concurrent_streams*priority_enabled 1 517.5625 517.5625 0.006 0.9410 window_size_kb*header_table_kb 1 64135.5625 64135.5625 0.751 0.4258 window_size_kb*priority_enabled 1 5365.5625 5365.5625 0.063 0.8121 header_table_kb*priority_enabled 1 612.5625 612.5625 0.007 0.9358 Error 5 427059.3125 85411.8625 Total 15 1387372.9375 92491.5292 === Interaction Effects: page_load_ms === Factor A Factor B Interaction % Contribution ------------------------------------------------------------------------ max_concurrent_streams window_size_kb -281.1250 47.4% window_size_kb header_table_kb 126.6250 21.4% max_concurrent_streams header_table_kb -124.8750 21.1% window_size_kb priority_enabled 36.6250 6.2% header_table_kb priority_enabled 12.3750 2.1% max_concurrent_streams priority_enabled -11.3750 1.9% === Summary Statistics: page_load_ms === max_concurrent_streams: Level N Mean Std Min Max ------------------------------------------------------------ 250 8 1417.0000 293.8683 1012.0000 1809.0000 50 8 1126.8750 252.4658 768.0000 1502.0000 window_size_kb: Level N Mean Std Min Max ------------------------------------------------------------ 1024 8 1333.5000 224.7958 1012.0000 1680.0000 64 8 1210.3750 372.8274 768.0000 1809.0000 header_table_kb: Level N Mean Std Min Max ------------------------------------------------------------ 4 8 1202.8750 239.3309 768.0000 1502.0000 64 8 1341.0000 360.5757 903.0000 1809.0000 priority_enabled: Level N Mean Std Min Max ------------------------------------------------------------ off 8 1320.3750 285.7306 903.0000 1693.0000 on 8 1223.5000 333.4538 768.0000 1809.0000 === Main Effects: ttfb_ms === Factor Effect Std Error % Contribution -------------------------------------------------------------- max_concurrent_streams -30.8750 10.2158 43.8% priority_enabled -27.1250 10.2158 38.5% header_table_kb 10.6250 10.2158 15.1% window_size_kb 1.8750 10.2158 2.7% === ANOVA Table: ttfb_ms === Source DF SS MS F p-value ----------------------------------------------------------------------------- max_concurrent_streams 1 3813.0625 3813.0625 2.198 0.1983 window_size_kb 1 14.0625 14.0625 0.008 0.9318 header_table_kb 1 451.5625 451.5625 0.260 0.6316 priority_enabled 1 2943.0625 2943.0625 1.697 0.2495 max_concurrent_streams*window_size_kb 1 7525.5625 7525.5625 4.339 0.0917 max_concurrent_streams*header_table_kb 1 540.5625 540.5625 0.312 0.6007 max_concurrent_streams*priority_enabled 1 248.0625 248.0625 0.143 0.7208 window_size_kb*header_table_kb 1 689.0625 689.0625 0.397 0.5562 window_size_kb*priority_enabled 1 22.5625 22.5625 0.013 0.9136 header_table_kb*priority_enabled 1 126.5625 126.5625 0.073 0.7979 Error 5 8672.8125 1734.5625 Total 15 25046.9375 1669.7958 === Interaction Effects: ttfb_ms === Factor A Factor B Interaction % Contribution ------------------------------------------------------------------------ max_concurrent_streams window_size_kb -43.3750 51.6% window_size_kb header_table_kb 13.1250 15.6% max_concurrent_streams header_table_kb -11.6250 13.8% max_concurrent_streams priority_enabled -7.8750 9.4% header_table_kb priority_enabled 5.6250 6.7% window_size_kb priority_enabled 2.3750 2.8% === Summary Statistics: ttfb_ms === max_concurrent_streams: Level N Mean Std Min Max ------------------------------------------------------------ 250 8 143.3750 42.5506 68.0000 200.0000 50 8 112.5000 34.9694 59.0000 168.0000 window_size_kb: Level N Mean Std Min Max ------------------------------------------------------------ 1024 8 127.0000 34.8999 68.0000 169.0000 64 8 128.8750 48.5605 59.0000 200.0000 header_table_kb: Level N Mean Std Min Max ------------------------------------------------------------ 4 8 122.6250 34.3633 59.0000 168.0000 64 8 133.2500 48.2989 68.0000 200.0000 priority_enabled: Level N Mean Std Min Max ------------------------------------------------------------ off 8 141.5000 30.3692 103.0000 181.0000 on 8 114.3750 47.2801 59.0000 200.0000

Optimization Recommendations

doe optimize
=== Optimization: page_load_ms === Direction: minimize Best observed run: #12 max_concurrent_streams = 250 window_size_kb = 64 header_table_kb = 4 priority_enabled = on Value: 768.0 RSM Model (linear, R² = 0.5404, Adj R² = 0.3732): Coefficients: intercept +1271.9375 max_concurrent_streams +13.4375 window_size_kb +78.0625 header_table_kb +75.0625 priority_enabled -186.9375 RSM Model (quadratic, R² = 0.6099, Adj R² = -4.8519): Coefficients: intercept +254.3875 max_concurrent_streams +13.4375 window_size_kb +78.0625 header_table_kb +75.0625 priority_enabled -186.9375 max_concurrent_streams*window_size_kb -50.4375 max_concurrent_streams*header_table_kb +42.3125 max_concurrent_streams*priority_enabled -35.9375 window_size_kb*header_table_kb -19.3125 window_size_kb*priority_enabled -4.3125 header_table_kb*priority_enabled -3.3125 max_concurrent_streams^2 +254.3875 window_size_kb^2 +254.3875 header_table_kb^2 +254.3875 priority_enabled^2 +254.3875 Curvature analysis: max_concurrent_streams coef=+254.3875 convex (has a minimum) window_size_kb coef=+254.3875 convex (has a minimum) header_table_kb coef=+254.3875 convex (has a minimum) priority_enabled coef=+254.3875 convex (has a minimum) Notable interactions: max_concurrent_streams*window_size_kb coef=-50.4375 (antagonistic) max_concurrent_streams*header_table_kb coef=+42.3125 (synergistic) max_concurrent_streams*priority_enabled coef=-35.9375 (antagonistic) window_size_kb*header_table_kb coef=-19.3125 (antagonistic) window_size_kb*priority_enabled coef=-4.3125 (antagonistic) header_table_kb*priority_enabled coef=-3.3125 (antagonistic) Predicted optimum (from linear model, at observed points): max_concurrent_streams = 250 window_size_kb = 1024 header_table_kb = 64 priority_enabled = off Predicted value: 1625.4375 Surface optimum (via L-BFGS-B, linear model): max_concurrent_streams = 50 window_size_kb = 64 header_table_kb = 4 priority_enabled = on Predicted value: 918.4375 Model quality: Moderate fit — use predictions directionally, not precisely. Factor importance: 1. priority_enabled (effect: -373.9, contribution: 52.9%) 2. window_size_kb (effect: -156.1, contribution: 22.1%) 3. header_table_kb (effect: 150.1, contribution: 21.2%) 4. max_concurrent_streams (effect: -26.9, contribution: 3.8%) === Optimization: ttfb_ms === Direction: minimize Best observed run: #12 max_concurrent_streams = 250 window_size_kb = 64 header_table_kb = 4 priority_enabled = on Value: 59.0 RSM Model (linear, R² = 0.4027, Adj R² = 0.1855): Coefficients: intercept +127.9375 max_concurrent_streams -3.9375 window_size_kb +10.5625 header_table_kb +8.0625 priority_enabled -20.9375 RSM Model (quadratic, R² = 0.4927, Adj R² = -6.6095): Coefficients: intercept +25.5875 max_concurrent_streams -3.9375 window_size_kb +10.5625 header_table_kb +8.0625 priority_enabled -20.9375 max_concurrent_streams*window_size_kb -9.0625 max_concurrent_streams*header_table_kb +0.6875 max_concurrent_streams*priority_enabled -4.0625 window_size_kb*header_table_kb -6.0625 window_size_kb*priority_enabled +0.4375 header_table_kb*priority_enabled +2.1875 max_concurrent_streams^2 +25.5875 window_size_kb^2 +25.5875 header_table_kb^2 +25.5875 priority_enabled^2 +25.5875 Curvature analysis: max_concurrent_streams coef=+25.5875 convex (has a minimum) window_size_kb coef=+25.5875 convex (has a minimum) header_table_kb coef=+25.5875 convex (has a minimum) priority_enabled coef=+25.5875 convex (has a minimum) Notable interactions: max_concurrent_streams*window_size_kb coef=-9.0625 (antagonistic) window_size_kb*header_table_kb coef=-6.0625 (antagonistic) max_concurrent_streams*priority_enabled coef=-4.0625 (antagonistic) header_table_kb*priority_enabled coef=+2.1875 (synergistic) max_concurrent_streams*header_table_kb coef=+0.6875 (synergistic) window_size_kb*priority_enabled coef=+0.4375 (synergistic) Predicted optimum (from linear model, at observed points): max_concurrent_streams = 50 window_size_kb = 1024 header_table_kb = 64 priority_enabled = off Predicted value: 171.4375 Surface optimum (via L-BFGS-B, linear model): max_concurrent_streams = 250 window_size_kb = 64 header_table_kb = 4 priority_enabled = on Predicted value: 84.4375 Model quality: Weak fit — consider adding center points or using a different design. Factor importance: 1. priority_enabled (effect: -41.9, contribution: 48.1%) 2. window_size_kb (effect: -21.1, contribution: 24.3%) 3. header_table_kb (effect: 16.1, contribution: 18.5%) 4. max_concurrent_streams (effect: 7.9, contribution: 9.1%)
← All Use Cases Next: Network Buffer Sizing →