四版本接口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% |
核心结论
- 空接口V1性能天花板极高,10并发可达4429 QPS,无任何业务与数据库开销
- 接入数据库查询后性能大幅下跌,手动DB会话(V2)全程优于依赖注入(V3)
- 同业务逻辑下,依赖注入DB相比手动自建会话,整体再多跌3%~8%性能
- 并发越高,三者性能差距逐步收窄,瓶颈由代码开销转向数据库连接池与IO