From: Willy Tarreau Date: Thu, 27 Jul 2017 09:47:28 +0000 (+0200) Subject: MINOR: h2: expose tune.h2.max-concurrent-streams to limit the number of streams X-Git-Tag: v1.8-rc1~66 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5242ef8095d60cdf2d48b97595aeebf624c253e9;p=thirdparty%2Fhaproxy.git MINOR: h2: expose tune.h2.max-concurrent-streams to limit the number of streams This will be advertised in the settings frame. --- diff --git a/doc/configuration.txt b/doc/configuration.txt index e64cd32020..8ac1fb6018 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -601,6 +601,7 @@ The following keywords are supported in the "global" section : - tune.comp.maxlevel - tune.h2.header-table-size - tune.h2.initial-window-size + - tune.h2.max-concurrent-streams - tune.http.cookielen - tune.http.logurilen - tune.http.maxhdr @@ -1386,6 +1387,15 @@ tune.h2.initial-window-size faster uploads, or to reduce it to increase fairness when dealing with many clients. It doesn't affect resource usage. +tune.h2.max-concurrent-streams + Sets the HTTP/2 maximum number of concurrent streams per connection (ie the + number of outstanding requests on a single connection). The default value is + 100. A larger one may slightly improve page load time for complex sites when + visited over high latency networks, but increases the amount of resources a + single client may allocate. A value of zero disables the limit so a single + client may create as many streams as allocatable by haproxy. It is highly + recommended not to change this value. + tune.http.cookielen Sets the maximum length of captured cookies. This is the maximum value that the "capture cookie xxx len yyy" will be allowed to take, and any upper value diff --git a/src/mux_h2.c b/src/mux_h2.c index 6143d3bf27..ff870a118d 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -19,6 +19,7 @@ /* a few settings from the global section */ static int h2_settings_header_table_size = 4096; /* initial value */ static int h2_settings_initial_window_size = 65535; /* initial value */ +static int h2_settings_max_concurrent_streams = 100; /*****************************************************************/ @@ -163,6 +164,22 @@ static int h2_parse_initial_window_size(char **args, int section_type, struct pr return 0; } +/* config parser for global "tune.h2.max-concurrent-streams" */ +static int h2_parse_max_concurrent_streams(char **args, int section_type, struct proxy *curpx, + struct proxy *defpx, const char *file, int line, + char **err) +{ + if (too_many_args(1, args, err, NULL)) + return -1; + + h2_settings_max_concurrent_streams = atoi(args[1]); + if (h2_settings_max_concurrent_streams < 0) { + memprintf(err, "'%s' expects a positive numeric value.", args[0]); + return -1; + } + return 0; +} + /****************************************/ /* MUX initialization and instanciation */ @@ -193,6 +210,7 @@ static struct alpn_mux_list alpn_mux_h2 = static struct cfg_kw_list cfg_kws = {ILH, { { CFG_GLOBAL, "tune.h2.header-table-size", h2_parse_header_table_size }, { CFG_GLOBAL, "tune.h2.initial-window-size", h2_parse_initial_window_size }, + { CFG_GLOBAL, "tune.h2.max-concurrent-streams", h2_parse_max_concurrent_streams }, { 0, NULL, NULL } }};