Skip to content

Conversation

ikaadil
Copy link
Contributor

@ikaadil ikaadil commented Aug 6, 2025

FILL IN THE PR DESCRIPTION HERE

FIX #635

BEFORE SUBMITTING, PLEASE READ THE CHECKLIST BELOW AND FILL IN THE DESCRIPTION ABOVE


  • Make sure the code changes pass the pre-commit checks.
  • Sign-off your commit by using -s when doing git commit
  • Try to classify PRs for easy understanding of the type of changes, such as [Bugfix], [Feat], and [CI].
Detailed Checklist (Click to Expand)

Thank you for your contribution to production-stack! Before submitting the pull request, please ensure the PR meets the following criteria. This helps us maintain the code quality and improve the efficiency of the review process.

PR Title and Classification

Please try to classify PRs for easy understanding of the type of changes. The PR title is prefixed appropriately to indicate the type of change. Please use one of the following:

  • [Bugfix] for bug fixes.
  • [CI/Build] for build or continuous integration improvements.
  • [Doc] for documentation fixes and improvements.
  • [Feat] for new features in the cluster (e.g., autoscaling, disaggregated prefill, etc.).
  • [Router] for changes to the vllm_router (e.g., routing algorithm, router observability, etc.).
  • [Misc] for PRs that do not fit the above categories. Please use this sparingly.

Note: If the PR spans more than one category, please include all relevant prefixes.

Code Quality

The PR need to meet the following code quality standards:

  • Pass all linter checks. Please use pre-commit to format your code. See README.md for installation.
  • The code need to be well-documented to ensure future contributors can easily understand the code.
  • Please include sufficient tests to ensure the change is stay correct and robust. This includes both unit tests and integration tests.

DCO and Signed-off-by

When contributing changes to this project, you must agree to the DCO. Commits must include a Signed-off-by: header which certifies agreement with the terms of the DCO.

Using -s with git commit will automatically add this header.

What to Expect for the Reviews

We aim to address all PRs in a timely manner. If no one reviews your PR within 5 days, please @-mention one of YuhanLiu11
, Shaoting-Feng or ApostaC.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary of Changes

Hello @ikaadil, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request aims to enhance the performance configuration of the vllm_router by updating its uvicorn dependency. The core change involves leveraging uvicorn's [standard] extra, which integrates uvloop for faster asynchronous operations, directly addressing a reported performance issue.

Highlights

  • Dependency Update: The uvicorn dependency in src/vllm_router/requirements.txt has been updated from uvicorn to uvicorn[standard]. This change pulls in additional performance-enhancing dependencies like uvloop and httptools.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in issue comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments or fill out our survey to provide feedback.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request aims to enhance performance by upgrading uvicorn to uvicorn[standard], which includes uvloop for a faster event loop. The change in src/vllm_router/requirements.txt is a positive step. However, there's a potential issue that this change might not be reflected in the production Docker image, as dependencies for the build seem to be managed by pyproject.toml. My review includes a comment to address this to ensure the performance benefits are realized in production.

@jonoillar
Copy link

Could we have a benchmark showing the improvements thanks to this enhancement ?

@ikaadil
Copy link
Contributor Author

ikaadil commented Aug 7, 2025

@YuhanLiu11 Could you please review the PR? Thanks!

Copy link
Contributor

@kobe0938 kobe0938 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we have a benchmark showing the improvements thanks to this enhancement ?

I would like to second this. Can you provide a benchmark result with the script? Thanks. @ikaadil

@ikaadil
Copy link
Contributor Author

ikaadil commented Aug 22, 2025

Could we have a benchmark showing the improvements thanks to this enhancement ?

I would like to second this. Can you provide a benchmark result with the script? Thanks. @ikaadil

This benchmark compares the performance of uvicorn vs uvicorn[standard] using a simple ASGI application that returns "ok" for all requests.

Benchmark Script

The benchmark uses the following script (bench.py):

import asyncio
import time
import threading

import aiohttp
import uvicorn

PORT = 8040
URL = f"http://127.0.0.1:{PORT}/"
TOTAL_REQUESTS = 20000
CONCURRENCY = 2000

# Tiny ASGI app that returns "ok"
async def app(scope, receive, send):
    assert scope["type"] == "http"
    await send({"type": "http.response.start", "status": 200, "headers": []})
    await send({"type": "http.response.body", "body": b"ok"})

# Run uvicorn in a background thread
def start_server():
    threading.Thread(
        target=uvicorn.run,
        args=(app,),
        kwargs=dict(host="127.0.0.1", port=PORT, log_level="warning", access_log=False),
        daemon=True,
    ).start()

# Wait until the server answers 200 OK
async def wait_until_up():
    async with aiohttp.ClientSession() as s:
        while True:
            try:
                async with s.get(URL) as r:
                    if r.status == 200:
                        return
            except Exception:
                pass
            await asyncio.sleep(0.05)

# Fire TOTAL_REQUESTS with up to CONCURRENCY in flight
async def bombard():
    sem = asyncio.Semaphore(CONCURRENCY)
    async with aiohttp.ClientSession() as s:
        async def one():
            async with sem:
                async with s.get(URL) as r:
                    await r.read()
        await asyncio.gather(*[one() for _ in range(TOTAL_REQUESTS)])

async def main():
    start_server()
    await wait_until_up()
    t0 = time.perf_counter()
    await bombard()
    print(f"Requests: {TOTAL_REQUESTS}, Concurrency: {CONCURRENCY}")
    print(f"Elapsed: {time.perf_counter() - t0:.3f}s")

if __name__ == "__main__":
    asyncio.run(main())

Setup Steps

  1. Create virtual environment:

    python3.12 -m venv venv
  2. Activate virtual environment:

    source venv/bin/activate

Benchmark Results

Test 1: Standard Uvicorn

Installation:

pip uninstall -y uvicorn
pip install "uvicorn==0.34.0" aiohttp

Run benchmark:

python3 bench.py

Result:

Requests: 20000, Concurrency: 2000
Elapsed: 2.536s

Requests per second: ~7,886 req/s


Test 2: Uvicorn with Standard Dependencies

Installation:

pip uninstall -y uvicorn
pip install "uvicorn[standard]==0.34.0" aiohttp

Run benchmark:

python3 bench.py

Result:

Requests: 20000, Concurrency: 2000
Elapsed: 1.405s

Requests per second: ~14,235 req/s

Performance Comparison

Configuration Requests Concurrency Elapsed Time Requests/Second Performance Improvement
uvicorn==0.34.0 20,000 2,000 2.536s ~7,886 req/s Baseline
uvicorn[standard]==0.34.0 20,000 2,000 1.405s ~14,235 req/s +80.4%

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

feature: Enhanced Performance Configuration with uvicorn[standard] and uvloop Integration
4 participants