|
138 | 138 | HTTP benchmark — reading it off `http` here silently |
139 | 139 | labelled every worker-mode run "classic mode". --> |
140 | 140 | <ResultsChip>{{ run.environment.php.octane ? 'worker mode' : 'classic mode' }}</ResultsChip> |
141 | | - <ResultsChip v-if="http.duration_seconds"> |
142 | | - {{ http.duration_seconds }}s |
143 | | - </ResultsChip> |
144 | | - <ResultsChip v-if="http.connections"> |
145 | | - {{ http.connections }} connections |
| 141 | + <ResultsChip v-if="http.workers"> |
| 142 | + {{ http.workers }} workers |
146 | 143 | </ResultsChip> |
147 | 144 | <ResultsChip v-if="http.io_ms != null"> |
148 | 145 | I/O {{ http.io_ms }}ms |
149 | 146 | </ResultsChip> |
150 | | - <ResultsChip v-if="http.mode"> |
151 | | - {{ http.mode }} |
152 | | - </ResultsChip> |
153 | 147 | <ResultsChip v-if="loadModeLabel"> |
154 | 148 | {{ loadModeLabel }} |
155 | 149 | </ResultsChip> |
|
162 | 156 | </template> |
163 | 157 |
|
164 | 158 | <p class="mt-2 text-xs text-neutral-500"> |
165 | | - Saturation test — connections held open to find max throughput, so response times |
166 | | - include time spent queued. |
| 159 | + Concurrency was raised until throughput stopped improving. Response times were |
| 160 | + measured separately, at about 70% of that rate, so they include no queue a real |
| 161 | + visitor would not also hit. |
167 | 162 | <NuxtLink |
168 | 163 | to="/docs/benchmarks" |
169 | 164 | class="text-neutral-400 underline underline-offset-4 decoration-white/20 transition-colors hover:text-neutral-300 hover:decoration-white/40" |
|
187 | 182 | </p> |
188 | 183 | <div class="mt-2"> |
189 | 184 | <p class="text-5xl text-white font-mono font-medium leading-none tabular-nums"> |
190 | | - {{ round(benchRoute.data.throughput?.requests_per_second) }} |
| 185 | + <!-- A run whose sweep never flattened measured the most BenchKit |
| 186 | + could ask for, not the most the machine can serve. A gallery |
| 187 | + that prints that flat ranks a floor against maximums. --> |
| 188 | + <span v-if="benchRoute.isFloor" class="text-amber-400">≥</span>{{ round(benchRoute.data.throughput?.requests_per_second) }} |
191 | 189 | </p> |
192 | 190 | <p class="mt-1.5 text-sm text-neutral-400 font-mono"> |
193 | | - req/s |
| 191 | + req/s <span v-if="benchRoute.concurrency" class="text-neutral-500">at {{ benchRoute.concurrency }} concurrent</span> |
194 | 192 | </p> |
195 | 193 | </div> |
196 | 194 | <div class="mt-4 flex flex-col gap-2.5"> |
|
230 | 228 | </p> |
231 | 229 | <div class="mt-auto pt-4"> |
232 | 230 | <p class="text-4xl text-white font-mono font-medium leading-none tabular-nums"> |
233 | | - {{ round(benchRoute.data.throughput?.requests_per_second) }} |
| 231 | + <span v-if="benchRoute.isFloor" class="text-amber-400">≥</span>{{ round(benchRoute.data.throughput?.requests_per_second) }} |
234 | 232 | </p> |
235 | 233 | <p class="mt-1.5 text-sm text-neutral-400 font-mono"> |
236 | | - req/s |
| 234 | + req/s <span v-if="benchRoute.concurrency" class="text-neutral-500">at {{ benchRoute.concurrency }} concurrent</span> |
237 | 235 | </p> |
238 | 236 | </div> |
239 | 237 | </div> |
@@ -691,6 +689,9 @@ const routes = computed(() => { |
691 | 689 | }) |
692 | 690 | return { |
693 | 691 | key, |
| 692 | + // Where the peak happened, and whether it was a peak at all. |
| 693 | + concurrency: data.throughput?.concurrency ?? null, |
| 694 | + isFloor: data.throughput?.saturated === false, |
694 | 695 | label: ROUTES[key]!.label, |
695 | 696 | description: key === 'io' ? `Simulated ~${http.value.io_ms ?? 100}ms outbound call` : ROUTES[key]!.description, |
696 | 697 | data, |
|
0 commit comments