mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-11-28 22:31:06 +01:00
MINOR: quic: define max-stream-data configuration as a ratio
This commit is contained in:
parent
68c10d444d
commit
cf9e40bd8a
@ -1694,6 +1694,7 @@ The following keywords are supported in the "global" section :
|
|||||||
- tune.quic.frontend.max-data-size
|
- tune.quic.frontend.max-data-size
|
||||||
- tune.quic.frontend.max-idle-timeout
|
- tune.quic.frontend.max-idle-timeout
|
||||||
- tune.quic.frontend.max-streams-bidi
|
- tune.quic.frontend.max-streams-bidi
|
||||||
|
- tune.quic.frontend.stream-data-ratio
|
||||||
- tune.quic.frontend.default-max-window-size
|
- tune.quic.frontend.default-max-window-size
|
||||||
- tune.quic.max-frame-loss
|
- tune.quic.max-frame-loss
|
||||||
- tune.quic.reorder-ratio
|
- tune.quic.reorder-ratio
|
||||||
@ -4349,6 +4350,9 @@ tune.quic.frontend.max-data-size <size>
|
|||||||
This can be increased for example if a backend application relies on massive
|
This can be increased for example if a backend application relies on massive
|
||||||
uploads over high latency networks.
|
uploads over high latency networks.
|
||||||
|
|
||||||
|
See also: "tune.quic.frontend.max-streams-bidi",
|
||||||
|
"tune.quic.frontend.stream-data-ratio"
|
||||||
|
|
||||||
tune.quic.frontend.max-idle-timeout <timeout>
|
tune.quic.frontend.max-idle-timeout <timeout>
|
||||||
Sets the QUIC max_idle_timeout transport parameters in milliseconds for
|
Sets the QUIC max_idle_timeout transport parameters in milliseconds for
|
||||||
frontends which determines the period of time after which a connection silently
|
frontends which determines the period of time after which a connection silently
|
||||||
@ -4366,7 +4370,32 @@ tune.quic.frontend.max-streams-bidi <number>
|
|||||||
will be authorized to open. This determines the number of concurrent client
|
will be authorized to open. This determines the number of concurrent client
|
||||||
requests.
|
requests.
|
||||||
|
|
||||||
The default value is 100.
|
The default value is 100. Note that if you reduces it, it can restrict the
|
||||||
|
buffering capabilities of streams on receive, which would result in poor
|
||||||
|
upload throughput. It can be corrected by increasing
|
||||||
|
tune.quic.frontend.max-data-size setting.
|
||||||
|
|
||||||
|
See also: "tune.quic.frontend.max-data-size",
|
||||||
|
"tune.quic.frontend.stream-data-ratio"
|
||||||
|
|
||||||
|
tune.quic.frontend.stream-data-ratio <0..100, in percent>
|
||||||
|
This setting allows to configure the hard limit of the number of data bytes
|
||||||
|
in flight over each stream. It is expressed as a percentage relative to
|
||||||
|
"tune.quic.frontend.max-data-size" setting, with the result rounded up to
|
||||||
|
bufsize.
|
||||||
|
|
||||||
|
The default value is 90. This is suitable with the most frequent web
|
||||||
|
scenario, where uploads is performed only for one or a few streams, whereas
|
||||||
|
the rest are used for download only. If max-data-size connection limit
|
||||||
|
remains at a reasonable level, it ensures that only a portion of opened
|
||||||
|
streams can allocate to their maximum capacity.
|
||||||
|
|
||||||
|
In the case of an application using many uploading streams in parallel and
|
||||||
|
suffering from unfairness between these streams, it can make sense to reduce
|
||||||
|
this ratio, to increase fairness and reduce the per-stream bandwidth.
|
||||||
|
|
||||||
|
See also: "tune.quic.frontend.max-data-size",
|
||||||
|
"tune.quic.frontend.max-streams-bidi"
|
||||||
|
|
||||||
tune.quic.frontend.default-max-window-size <size>
|
tune.quic.frontend.default-max-window-size <size>
|
||||||
Sets the default maximum window size for the congestion controller of a
|
Sets the default maximum window size for the congestion controller of a
|
||||||
|
|||||||
@ -216,6 +216,7 @@ struct global {
|
|||||||
unsigned int quic_frontend_max_data;
|
unsigned int quic_frontend_max_data;
|
||||||
unsigned int quic_frontend_max_streams_bidi;
|
unsigned int quic_frontend_max_streams_bidi;
|
||||||
size_t quic_frontend_max_window_size;
|
size_t quic_frontend_max_window_size;
|
||||||
|
unsigned int quic_frontend_stream_data_ratio;
|
||||||
unsigned int quic_retry_threshold;
|
unsigned int quic_retry_threshold;
|
||||||
unsigned int quic_reorder_ratio;
|
unsigned int quic_reorder_ratio;
|
||||||
unsigned int quic_max_frame_loss;
|
unsigned int quic_max_frame_loss;
|
||||||
|
|||||||
@ -51,9 +51,6 @@ static inline int qmux_stream_rx_bufsz(void)
|
|||||||
return global.tune.bufsize - NCB_RESERVED_SZ;
|
return global.tune.bufsize - NCB_RESERVED_SZ;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Number of buffers usable on Rx per QCS instance. */
|
|
||||||
#define QMUX_STREAM_RX_BUF_FACTOR 90
|
|
||||||
|
|
||||||
/* Bit shift to get the stream sub ID for internal use which is obtained
|
/* Bit shift to get the stream sub ID for internal use which is obtained
|
||||||
* shifting the stream IDs by this value, knowing that the
|
* shifting the stream IDs by this value, knowing that the
|
||||||
* QCS_ID_TYPE_SHIFT less significant bits identify the stream ID
|
* QCS_ID_TYPE_SHIFT less significant bits identify the stream ID
|
||||||
|
|||||||
@ -100,6 +100,9 @@ typedef unsigned long long ull;
|
|||||||
/* Default congestion window size. 480 kB, equivalent to the legacy value which was 30*bufsize */
|
/* Default congestion window size. 480 kB, equivalent to the legacy value which was 30*bufsize */
|
||||||
#define QUIC_DFLT_MAX_WINDOW_SIZE 491520
|
#define QUIC_DFLT_MAX_WINDOW_SIZE 491520
|
||||||
|
|
||||||
|
/* Default ratio applied for max-stream-data-bidi-remote derived from max-data */
|
||||||
|
#define QUIC_DFLT_FRONT_STREAM_DATA_RATIO 90
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 0 1 2 3
|
* 0 1 2 3
|
||||||
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||||
|
|||||||
@ -44,6 +44,7 @@ struct tp_version_information {
|
|||||||
#define QUIC_TP_DFLT_FRONT_MAX_IDLE_TIMEOUT 30000 /* milliseconds */
|
#define QUIC_TP_DFLT_FRONT_MAX_IDLE_TIMEOUT 30000 /* milliseconds */
|
||||||
#define QUIC_TP_DFLT_FRONT_MAX_STREAMS_BIDI 100
|
#define QUIC_TP_DFLT_FRONT_MAX_STREAMS_BIDI 100
|
||||||
#define QUIC_TP_DFLT_BACK_MAX_IDLE_TIMEOUT 30000 /* milliseconds */
|
#define QUIC_TP_DFLT_BACK_MAX_IDLE_TIMEOUT 30000 /* milliseconds */
|
||||||
|
#define QUIC_TP_DFLT_FRONT_STREAM_DATA_RATIO 90
|
||||||
|
|
||||||
/* Types of QUIC transport parameters */
|
/* Types of QUIC transport parameters */
|
||||||
#define QUIC_TP_ORIGINAL_DESTINATION_CONNECTION_ID 0x00
|
#define QUIC_TP_ORIGINAL_DESTINATION_CONNECTION_ID 0x00
|
||||||
|
|||||||
@ -330,6 +330,13 @@ static int cfg_parse_quic_tune_setting(char **args, int section_type,
|
|||||||
|
|
||||||
global.tune.quic_frontend_max_window_size = cwnd;
|
global.tune.quic_frontend_max_window_size = cwnd;
|
||||||
}
|
}
|
||||||
|
else if (strcmp(suffix, "frontend.stream-data-ratio") == 0) {
|
||||||
|
if (arg < 1 || arg > 100) {
|
||||||
|
memprintf(err, "'%s' expects an integer argument between 1 and 100.", args[0]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
global.tune.quic_frontend_stream_data_ratio = arg;
|
||||||
|
}
|
||||||
else if (strcmp(suffix, "max-frame-loss") == 0)
|
else if (strcmp(suffix, "max-frame-loss") == 0)
|
||||||
global.tune.quic_max_frame_loss = arg;
|
global.tune.quic_max_frame_loss = arg;
|
||||||
else if (strcmp(suffix, "reorder-ratio") == 0) {
|
else if (strcmp(suffix, "reorder-ratio") == 0) {
|
||||||
@ -424,6 +431,7 @@ static struct cfg_kw_list cfg_kws = {ILH, {
|
|||||||
{ CFG_GLOBAL, "tune.quic.frontend.max-streams-bidi", cfg_parse_quic_tune_setting },
|
{ CFG_GLOBAL, "tune.quic.frontend.max-streams-bidi", cfg_parse_quic_tune_setting },
|
||||||
{ CFG_GLOBAL, "tune.quic.frontend.max-idle-timeout", cfg_parse_quic_time },
|
{ CFG_GLOBAL, "tune.quic.frontend.max-idle-timeout", cfg_parse_quic_time },
|
||||||
{ CFG_GLOBAL, "tune.quic.frontend.default-max-window-size", cfg_parse_quic_tune_setting },
|
{ CFG_GLOBAL, "tune.quic.frontend.default-max-window-size", cfg_parse_quic_tune_setting },
|
||||||
|
{ CFG_GLOBAL, "tune.quic.frontend.stream-data-ratio", cfg_parse_quic_tune_setting },
|
||||||
{ CFG_GLOBAL, "tune.quic.max-frame-loss", cfg_parse_quic_tune_setting },
|
{ CFG_GLOBAL, "tune.quic.max-frame-loss", cfg_parse_quic_tune_setting },
|
||||||
{ CFG_GLOBAL, "tune.quic.reorder-ratio", cfg_parse_quic_tune_setting },
|
{ CFG_GLOBAL, "tune.quic.reorder-ratio", cfg_parse_quic_tune_setting },
|
||||||
{ CFG_GLOBAL, "tune.quic.retry-threshold", cfg_parse_quic_tune_setting },
|
{ CFG_GLOBAL, "tune.quic.retry-threshold", cfg_parse_quic_tune_setting },
|
||||||
|
|||||||
@ -199,6 +199,7 @@ struct global global = {
|
|||||||
.quic_frontend_max_data = 0,
|
.quic_frontend_max_data = 0,
|
||||||
.quic_frontend_max_streams_bidi = QUIC_TP_DFLT_FRONT_MAX_STREAMS_BIDI,
|
.quic_frontend_max_streams_bidi = QUIC_TP_DFLT_FRONT_MAX_STREAMS_BIDI,
|
||||||
.quic_frontend_max_window_size = QUIC_DFLT_MAX_WINDOW_SIZE,
|
.quic_frontend_max_window_size = QUIC_DFLT_MAX_WINDOW_SIZE,
|
||||||
|
.quic_frontend_stream_data_ratio = QUIC_DFLT_FRONT_STREAM_DATA_RATIO,
|
||||||
.quic_reorder_ratio = QUIC_DFLT_REORDER_RATIO,
|
.quic_reorder_ratio = QUIC_DFLT_REORDER_RATIO,
|
||||||
.quic_retry_threshold = QUIC_DFLT_RETRY_THRESHOLD,
|
.quic_retry_threshold = QUIC_DFLT_RETRY_THRESHOLD,
|
||||||
.quic_max_frame_loss = QUIC_DFLT_MAX_FRAME_LOSS,
|
.quic_max_frame_loss = QUIC_DFLT_MAX_FRAME_LOSS,
|
||||||
|
|||||||
@ -76,8 +76,13 @@ void quic_transport_params_init(struct quic_transport_params *p, int server)
|
|||||||
else
|
else
|
||||||
p->initial_max_data = max_streams_bidi * stream_rx_bufsz;
|
p->initial_max_data = max_streams_bidi * stream_rx_bufsz;
|
||||||
|
|
||||||
/* Set remote streams flow-control data limit. */
|
/* Set remote streams flow-control data limit. This is calculated as a
|
||||||
p->initial_max_stream_data_bidi_remote = stream_rx_bufsz * QMUX_STREAM_RX_BUF_FACTOR;
|
* ratio from max-data, then rounded up to bufsize.
|
||||||
|
*/
|
||||||
|
p->initial_max_stream_data_bidi_remote =
|
||||||
|
p->initial_max_data * global.tune.quic_frontend_stream_data_ratio / 100;
|
||||||
|
p->initial_max_stream_data_bidi_remote =
|
||||||
|
stream_rx_bufsz * ((p->initial_max_stream_data_bidi_remote + (stream_rx_bufsz - 1)) / stream_rx_bufsz);
|
||||||
|
|
||||||
/* Set remaining flow-control data limit. Local bidi streams are unused
|
/* Set remaining flow-control data limit. Local bidi streams are unused
|
||||||
* on server side. Uni streams are only used for control exchange, so
|
* on server side. Uni streams are only used for control exchange, so
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user