빠르다는 Fastapi 가 뭔가 느릴 때. feat 비동기 정보
빠르다는 Fastapi 가 뭔가 느릴 때. feat 비동기본문
fastapi 가 빠르다는 벤치마크는 참 많은데
아직개발중인 그누보드 6은 약간 느린거 같습니다
웹의 많은 벤치마크들은 누가 만드냐에 따라
자기가 주장하고 싶은거에 유리하게 되어있는데 fastapi 도 과연 그럴까요? 궁금했어요
벤치마크 PC 사양.
CPU인텔 i5 1135G
램: 16GB
OS: 우분투
---
벤치마크툴은 K6
방법: 템플릿을 포함한 동일한 HTML 출력
2분간 1500명 방문기준.
------------------------------
Fastapi 를 설치하고
CORS/세션미들웨어를 붙여준다.
디버그모드도 off로
main.py
from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from starlette.middleware.sessions import SessionMiddleware from settings import settings from src.router import router app = FastAPI( debug=False, title="test", ) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) app.add_middleware(SessionMiddleware, secret_key=setting.SESSION_SECRET_KEY, session_cookie=setting.SESSION_COOKIE_NAME, max_age=3600 * 3) app.mount("/static", StaticFiles(directory="static"), name="static") app.include_router(router)
라우터에 hello world 를 찍어보면
from fastapi import APIRouter, Request
router = APIRouter()
@router.get('/index')
async def index(
request: Request
):
return 'hello world'
)
초당 요청 처리량이 6152/s 가 나옵니다
여기서 진자 템플릿을 Fastapi 공식 문서에 나온대로 붙여보면
from fastapi import APIRouter, Request
from fastapi.templating import Jinja2Templates
from jinja2 import Environment
router = APIRouter()
templates = Jinja2Templates(directory="templates")
@router.get('/index')
async def index(
request: Request
):
return templates.TemplateResponse(
request=request,
name="index.html"
)
초당 요청 처리량이 6152 -> 432 로 어마어마 하게
떨어져버렸습니다.
그냥 템플릿 하나 붙였을 뿐인데 속도가 1/14 로 떨어지고
요청 실패도 생겼습니다.
공식문서에 나온대로 했는데 왜 이럴까요?..
여기서 FastAPI 의 특성을 봐야하는데요
FastAPI 는 파이썬 비동기 서버(ASGI)를 지원하는 프레임워크입니다.
ASGI 설명을 보면 요청시작 ~ 요청 끝까지 전체가 비동기 이벤트 루프라고합니다.
한마디로 노드 JS 생각하시면 됩니다.
아래 그림을 보면
FAST API 는 오른쪽 아래 Async NonBlocking (비동기 논블록킹)인데
여기서 jinja 템플릿이 동기식으로 작동하여 왼쪽 아래그림처럼
대기(블록킹)이 일어났기 때문입니다.
참고로 PHP 는 왼쪽 위 Sync Blocking (동기 블록킹) 입니다
여기까지는 짐작만 하고 실제로 템플릿코드를 비동기로 고쳐보니
from fastapi import APIRouter, Request
from fastapi.responses import HTMLResponse
from jinja2 import Environment
router = APIRouter()
from jinja2 import FileSystemLoader, select_autoescape
environment = Environment(
enable_async=True,
loader=FileSystemLoader("templates"),
autoescape=select_autoescape(["html", "xml"])
)
@router.get('/index')
async def index(
request: Request
):
template = environment.get_template("index.html")
rendered_content = await template.render_async(request=request)
return HTMLResponse(content=rendered_content)
초당 요청 처리 수가 4528/s 에 http 요청 실패도 0% 가 되었습니다
동기식 코드에 비해 제성능을 되찾은 것을 알 수있습니다.
정리. 초당 요청 수
*FastAPI- 기본 6152/s
* 진자 동기 432/s
* 진자 비동기 4528/s
결론
FastAPI 는 빠르다.
비동기 프레임워크에서는 블록킹 되는 코드가 들어가면 성능하락이 심하다.
노드 JS 처럼 비동기 루프이므로 비동기 코드만 써야 제 성능을 낸다.
파이썬은 php 보다 느리다고 들었는데 측정해보니까
비동기의 이점때문에 오히려 PHP 보다 빠른거같아요
그누 6은 정식버전되면 그누 5보다 엄청 빨라지겠죠!
요즘 뜨는 모 사이트도 그누 6으로 갈 수있다는데 어떻게 될지 궁금해지네요
추천
3
3
댓글 2개
담당자에게 이 내용을 전달하겠습니다. 알려주셔서 감사합니다.