diff --git a/python/sglang/srt/arg_groups/serving_hook.py b/python/sglang/srt/arg_groups/serving_hook.py index 5c3e3f307..e6a7fa496 100644 --- a/python/sglang/srt/arg_groups/serving_hook.py +++ b/python/sglang/srt/arg_groups/serving_hook.py @@ -80,6 +80,11 @@ def handle_ssl_validation(server_args: Any): raise ValueError( "--http2-max-concurrent-streams must be between 1 and " "4294967295." ) + if not 1024 <= cfg.http2_initial_connection_window_size < 2**31: + raise ValueError( + "--http2-initial-connection-window-size must be between " + "1024 and 2147483647." + ) try: import granian # noqa: F401 diff --git a/python/sglang/srt/entrypoints/http_server.py b/python/sglang/srt/entrypoints/http_server.py index 560a7e44e..2d5c6ffbb 100644 --- a/python/sglang/srt/entrypoints/http_server.py +++ b/python/sglang/srt/entrypoints/http_server.py @@ -2445,6 +2445,7 @@ def _run_granian_server( port, log_level, http2_max_concurrent_streams, + http2_initial_connection_window_size, tokenizer_worker_num=1, ssl_certfile=None, ssl_keyfile=None, @@ -2482,7 +2483,8 @@ def _run_granian_server( interface=Interfaces.ASGI, http=HTTPModes.auto, http2_settings=HTTP2Settings( - max_concurrent_streams=http2_max_concurrent_streams + initial_connection_window_size=http2_initial_connection_window_size, + max_concurrent_streams=http2_max_concurrent_streams, ), log_level=log_level, ssl_cert=ssl_certfile, @@ -2617,6 +2619,9 @@ def _setup_and_run_http_server( http2_max_concurrent_streams=( server_args.http2_max_concurrent_streams ), + http2_initial_connection_window_size=( + server_args.http2_initial_connection_window_size + ), ssl_certfile=server_args.ssl_certfile, ssl_keyfile=server_args.ssl_keyfile, ssl_ca_certs=server_args.ssl_ca_certs, @@ -2707,6 +2712,9 @@ def _setup_and_run_http_server( http2_max_concurrent_streams=( server_args.http2_max_concurrent_streams ), + http2_initial_connection_window_size=( + server_args.http2_initial_connection_window_size + ), tokenizer_worker_num=server_args.tokenizer_worker_num, ssl_certfile=server_args.ssl_certfile, ssl_keyfile=server_args.ssl_keyfile, diff --git a/python/sglang/srt/server_args.py b/python/sglang/srt/server_args.py index 5739ca8a8..90af66ca6 100644 --- a/python/sglang/srt/server_args.py +++ b/python/sglang/srt/server_args.py @@ -1283,6 +1283,14 @@ class ServerArgs: "connection (1 to 2^32 - 1). Only applies with --enable-http2.", NS("serving"), ] = 200 + http2_initial_connection_window_size: A[ + int, + "Initial connection-level HTTP/2 receive window in bytes (1024 to " + "2^31 - 1). Only applies with --enable-http2.", + NS("serving"), + ] = ( + 1024 * 1024 + ) # ------------------------------------------------------------------------- # SSL/TLS diff --git a/test/registered/unit/entrypoints/test_http2_server_config.py b/test/registered/unit/entrypoints/test_http2_server_config.py index b3881a686..a8be40f83 100644 --- a/test/registered/unit/entrypoints/test_http2_server_config.py +++ b/test/registered/unit/entrypoints/test_http2_server_config.py @@ -31,9 +31,14 @@ class TestGranianHTTP2Config(unittest.TestCase): port=30000, log_level="info", http2_max_concurrent_streams=37, + http2_initial_connection_window_size=8 * 1024 * 1024, ) self.assertEqual(configured["http2_settings"].max_concurrent_streams, 37) + self.assertEqual( + configured["http2_settings"].initial_connection_window_size, + 8 * 1024 * 1024, + ) if __name__ == "__main__":