http2: Use huge HTTP/2 windows

- Improve performance by using a huge HTTP/2 window size.

Bug: https://github.com/curl/curl/issues/1102
Reported-by: afrind@users.noreply.github.com
Assisted-by: Tatsuhiro Tsujikawa
This commit is contained in:
Jay Satiro 2016-11-16 02:55:30 -05:00
parent 342aa4797e
commit a4d888857e
2 changed files with 13 additions and 10 deletions

View File

@ -63,7 +63,6 @@
5.1 Better persistency for HTTP 1.0 5.1 Better persistency for HTTP 1.0
5.2 support FF3 sqlite cookie files 5.2 support FF3 sqlite cookie files
5.3 Rearrange request header order 5.3 Rearrange request header order
5.4 Use huge HTTP/2 windows
5.5 auth= in URLs 5.5 auth= in URLs
5.6 Refuse "downgrade" redirects 5.6 Refuse "downgrade" redirects
5.7 Brotli compression 5.7 Brotli compression
@ -528,13 +527,6 @@ This is not detailed in any FTP specification.
headers use a default value so only headers that need to be moved have to be headers use a default value so only headers that need to be moved have to be
specified. specified.
5.4 Use huge HTTP/2 windows
We're currently using nghttp2's default window size which is terribly small
(64K). This becomes a bottle neck over high bandwidth networks. We should
instead make the window size to be very big (512MB?) as we really don't do
much flow control anyway.
5.5 auth= in URLs 5.5 auth= in URLs
Add the ability to specify the preferred authentication mechanism to use by Add the ability to specify the preferred authentication mechanism to use by

View File

@ -59,6 +59,8 @@
#define nghttp2_session_callbacks_set_error_callback(x,y) #define nghttp2_session_callbacks_set_error_callback(x,y)
#endif #endif
#define HTTP2_HUGE_WINDOW_SIZE (1 << 30)
/* /*
* Curl_http2_init_state() is called when the easy handle is created and * Curl_http2_init_state() is called when the easy handle is created and
* allows for HTTP/2 specific init of state. * allows for HTTP/2 specific init of state.
@ -965,7 +967,7 @@ static ssize_t data_source_read_callback(nghttp2_session *session,
*/ */
static nghttp2_settings_entry settings[] = { static nghttp2_settings_entry settings[] = {
{ NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 100 }, { NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 100 },
{ NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE, NGHTTP2_INITIAL_WINDOW_SIZE }, { NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE, HTTP2_HUGE_WINDOW_SIZE },
}; };
#define H2_BUFSIZE 32768 #define H2_BUFSIZE 32768
@ -2031,7 +2033,8 @@ CURLcode Curl_http2_switched(struct connectdata *conn,
else { else {
/* stream ID is unknown at this point */ /* stream ID is unknown at this point */
stream->stream_id = -1; stream->stream_id = -1;
rv = nghttp2_submit_settings(httpc->h2, NGHTTP2_FLAG_NONE, NULL, 0); rv = nghttp2_submit_settings(httpc->h2, NGHTTP2_FLAG_NONE, settings,
sizeof(settings) / sizeof(settings[0]));
if(rv != 0) { if(rv != 0) {
failf(data, "nghttp2_submit_settings() failed: %s(%d)", failf(data, "nghttp2_submit_settings() failed: %s(%d)",
nghttp2_strerror(rv), rv); nghttp2_strerror(rv), rv);
@ -2039,6 +2042,14 @@ CURLcode Curl_http2_switched(struct connectdata *conn,
} }
} }
rv = nghttp2_session_set_local_window_size(httpc->h2, NGHTTP2_FLAG_NONE, 0,
HTTP2_HUGE_WINDOW_SIZE);
if(rv != 0) {
failf(data, "nghttp2_session_set_local_window_size() failed: %s(%d)",
nghttp2_strerror(rv), rv);
return CURLE_HTTP2;
}
/* we are going to copy mem to httpc->inbuf. This is required since /* we are going to copy mem to httpc->inbuf. This is required since
mem is part of buffer pointed by stream->mem, and callbacks mem is part of buffer pointed by stream->mem, and callbacks
called by nghttp2_session_mem_recv() will write stream specific called by nghttp2_session_mem_recv() will write stream specific