四版本接口WRK压测QPS汇总

四版本接口WRK压测QPS汇总表


from config import PG_USER, PG_PASSWORD, PG_HOST, PG_PORT, PG_DATABASE
from config import DEBUG
db_url = "postgresql+asyncpg://{username}:{password}@{host}:{port}/{dbname}".format(username=PG_USER,
                                                                                    password=PG_PASSWORD,
                                                                                    host=PG_HOST,
                                                                                    port=PG_PORT,
                                                                                    dbname=PG_DATABASE)
# sessionmanager = DatabaseSessionManager(db_url, {"echo": True})
# print(db_url)
sessionmanager = DatabaseSessionManager(db_url, echo=DEBUG, pool_pre_ping=True)
# sessionmanager = DatabaseSessionManager(settings.database_url, {"echo": settings.echo_sql})

async def get_db():
    async with sessionmanager.session() as session:
        yield session


async def get_conn():
    async with sessionmanager.connect() as conn:
        yield conn
import uuid6


@router.post("/test/v1/run")
async def rule_run_v1(user_id: str, proj_id: str, request: Request):
    res = {
        'status': 0,
        'data': {"trace_id":uuid6.uuid6().hex},
        'message': 'version 1.0'
    }
    return res


@router.post("/test/v2/run")
async def rule_run_v2(user_id: str, proj_id: str, request: Request):
    # 引入了数据库
    async with sessionmanager.session() as db:
        cache_data = await disk_cache_get(db, user_id, cache_type='user')
    db_user_key = cache_data.get("user_key")
    db_username = cache_data.get("username")
    res = {
        'status': 0,
        'data': {"trace_id":uuid6.uuid6().hex},
        'message': 'version 1.0'
    }
    return res


@router.post("/test/v3/run")
async def rule_run_v3(user_id: str, proj_id: str, request: Request, db: AsyncSession = Depends(get_db)):
    user_key = request.query_params.get('user_key')
    cache_data = await disk_cache_get(db, user_id, cache_type='user')
    db_user_key = cache_data.get("user_key")
    db_username = cache_data.get("username")
    res = {
        'status': 0,
        'data': {"trace_id":uuid6.uuid6().hex},
        'message': 'version 1.0'
    }
    return res

版本说明

  • V1:纯空接口(性能基准)
  • V2:手动创建DB会话执行业务查询
  • V3:FastAPI依赖注入DB会话执行业务查询
  • 计算规则:降幅 = (V1-QPS - 当前QPS) ÷ V1-QPS × 100%
并发连接 V1基准QPS V2手动DB QPS V3注入DB QPS V2相对V1降幅 V3相对V1降幅
10 4429.57 2905.49 2691.92 34.41% 39.23%
30 3579.51 2745.21 2598.52 23.31% 27.41%
50 3288.42 2605.41 2460.50 20.77% 25.18%
70 3201.90 2541.41 2388.81 20.63% 25.39%
90 3178.76 2528.87 2162.61 20.44% 31.97%
110 2934.36 2463.22 2019.72 16.05% 31.17%
130 3046.97 2345.72 2248.57 22.99% 26.20%
150 2812.34 2255.18 2229.34 19.81% 20.73%
170 2820.46 2300.91 2196.14 18.42% 22.13%
190 2742.53 2276.42 2042.78 16.99% 25.51%

核心结论

  1. 空接口V1性能天花板极高,10并发可达4429 QPS,无任何业务与数据库开销
  2. 接入数据库查询后性能大幅下跌,手动DB会话(V2)全程优于依赖注入(V3)
  3. 同业务逻辑下,依赖注入DB相比手动自建会话,整体再多跌3%~8%性能
  4. 并发越高,三者性能差距逐步收窄,瓶颈由代码开销转向数据库连接池与IO
posted @ 2026-05-19 17:46  cerofang  阅读(4)  评论(0)    收藏  举报