diff --git a/vllm/entrypoints/cli/launch.py b/vllm/entrypoints/cli/launch.py index 50e46d81cc..d13a0c67c8 100644 --- a/vllm/entrypoints/cli/launch.py +++ b/vllm/entrypoints/cli/launch.py @@ -120,7 +120,7 @@ async def run_launch_fastapi(args: argparse.Namespace) -> None: signal.signal(signal.SIGTERM, _interrupt_init) # 1. Socket binding - listen_address, sock = setup_server(args) + listen_address, sock = setup_server(args, reuse_port=False) # 2. Build and serve the API server engine_args = AsyncEngineArgs.from_cli_args(args) diff --git a/vllm/entrypoints/cli/serve.py b/vllm/entrypoints/cli/serve.py index 8491e98216..d5e9b2bc87 100644 --- a/vllm/entrypoints/cli/serve.py +++ b/vllm/entrypoints/cli/serve.py @@ -281,7 +281,7 @@ def run_multi_api_server(args: argparse.Namespace): signal.signal(signal.SIGTERM, signal_handler) signal.signal(signal.SIGINT, signal_handler) - listen_address, sock = setup_server(args) + listen_address, sock = setup_server(args, reuse_port=num_api_servers > 1) engine_args = vllm.AsyncEngineArgs.from_cli_args(args) engine_args._api_process_count = num_api_servers diff --git a/vllm/entrypoints/openai/api_server.py b/vllm/entrypoints/openai/api_server.py index 6ae6dd70ab..6fb27c365d 100644 --- a/vllm/entrypoints/openai/api_server.py +++ b/vllm/entrypoints/openai/api_server.py @@ -508,14 +508,19 @@ async def init_render_app_state( state.server_load_metrics = 0 -def create_server_socket(addr: tuple[str, int]) -> socket.socket: +def create_server_socket( + addr: tuple[str, int], + *, + reuse_port: bool, +) -> socket.socket: family = socket.AF_INET if is_valid_ipv6_address(addr[0]): family = socket.AF_INET6 sock = socket.socket(family=family, type=socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) + if reuse_port: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) sock.bind(addr) return sock @@ -546,7 +551,7 @@ def validate_api_server_args(args): @instrument(span_name="API server setup") -def setup_server(args): +def setup_server(args, *, reuse_port: bool): """Validate API server args and create the server socket.""" log_version_and_model(logger, VLLM_VERSION, args.model) @@ -567,7 +572,7 @@ def setup_server(args): sock = create_server_unix_socket(args.uds) else: sock_addr = (args.host or "", args.port) - sock = create_server_socket(sock_addr) + sock = create_server_socket(sock_addr, reuse_port=reuse_port) # workaround to avoid footguns where uvicorn drops requests with too # many concurrent requests active @@ -688,7 +693,7 @@ async def run_server(args, **uvicorn_kwargs) -> None: signal.signal(signal.SIGTERM, _interrupt_init) - listen_address, sock = setup_server(args) + listen_address, sock = setup_server(args, reuse_port=False) await run_server_worker(listen_address, sock, args, **uvicorn_kwargs)