Skip to content

Commit 5904f82

Browse files
committed
MINOR: mux-h1: perform a graceful close at 75% glitches threshold
This avoids hitting the hard wall for connections with non-compliant peers that are accumulating errors. We recycle the connection early enough to permit to reset the counter. Example below with a threshold set to 100: Before, 1% errors: $ h1load -H "Host : blah" -c 1 -n 10000000 0:4445 # time conns tot_conn tot_req tot_bytes err cps rps bps ttfb 1 1 1039 103872 6763365 1038 1k03 103k 54M1 9.426u 2 1 2128 212793 14086140 2127 1k08 108k 58M5 8.963u 3 1 3215 321465 21392137 3214 1k08 108k 58M3 8.982u 4 1 4307 430684 28735013 4306 1k09 109k 58M6 8.935u 5 1 5390 538989 36016294 5389 1k08 108k 58M1 9.021u After, no more errors: $ h1load -H "Host : blah" -c 1 -n 10000000 0:4445 # time conns tot_conn tot_req tot_bytes err cps rps bps ttfb 1 1 1509 113161 7487809 0 1k50 113k 59M9 8.482u 2 1 3002 225101 15114659 0 1k49 111k 60M9 8.582u 3 1 4508 338045 22809911 0 1k50 112k 61M5 8.523u 4 1 5971 447785 30286861 0 1k46 109k 59M7 8.772u 5 1 7472 560335 37955271 0 1k49 112k 61M2 8.537u
1 parent 05b4570 commit 5904f82

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

doc/configuration.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4211,6 +4211,10 @@ tune.h1.be.glitches-threshold <number>
42114211
probably be in the hundreds or thousands to be effective without affecting
42124212
slightly bogus servers. It is also possible to only kill connections when the
42134213
CPU usage crosses a certain level, by using "tune.glitches.kill.cpu-usage".
4214+
Note that a graceful close is attempted at 75% of the configured threshold by
4215+
advertising a GOAWAY for a future stream. This ensures that a slightly faulty
4216+
connection will stop being used after some time without risking to interrupt
4217+
ongoing transfers.
42144218

42154219
See also: tune.h1.fe.glitches-threshold, bc_glitches, and
42164220
tune.glitches.kill.cpu-usage
@@ -4226,6 +4230,11 @@ tune.h1.fe.glitches-threshold <number>
42264230
probably be in the hundreds or thousands to be effective without affecting
42274231
slightly bogus clients. It is also possible to only kill connections when the
42284232
CPU usage crosses a certain level, by using "tune.glitches.kill.cpu-usage".
4233+
Note that a graceful close is attempted at 75% of the configured threshold by
4234+
advertising a GOAWAY for a future stream. This ensures that a slightly non-
4235+
compliant client will have the opportunity to create a new connection and
4236+
continue to work unaffected without ever triggering the hard close thus
4237+
risking to interrupt ongoing transfers.
42294238

42304239
See also: tune.h1.be.glitches-threshold, fc_glitches, and
42314240
tune.glitches.kill.cpu-usage

src/mux_h1.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -525,10 +525,20 @@ static inline int _h1_report_glitch(struct h1c *h1c, int increment)
525525
h1_be_glitches_threshold : h1_fe_glitches_threshold;
526526

527527
h1c->glitches += increment;
528-
if (thres && h1c->glitches >= thres &&
529-
(th_ctx->idle_pct <= global.tune.glitch_kill_maxidle)) {
530-
h1c->flags |= H1C_F_ERROR;
531-
return 1;
528+
if (unlikely(thres && h1c->glitches >= (thres * 3 + 1) / 4)) {
529+
/* at 75% of the threshold, we switch to close mode
530+
* to force clients to periodically reconnect.
531+
*/
532+
h1c->h1s->flags = (h1c->h1s->flags & ~H1S_F_WANT_MSK) | H1S_F_WANT_CLO;
533+
534+
/* at 100% of the threshold and excess of CPU usage we also
535+
* actively kill the connection.
536+
*/
537+
if (h1c->glitches >= thres &&
538+
(th_ctx->idle_pct <= global.tune.glitch_kill_maxidle)) {
539+
h1c->flags |= H1C_F_ERROR;
540+
return 1;
541+
}
532542
}
533543
return 0;
534544
}

0 commit comments

Comments
 (0)