빠르다는 Fastapi 가 뭔가 느릴 때. feat 비동기 > 자유게시판

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!

자유게시판

빠르다는 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'
)
 
1850095482_1715011819.6004.pngFAST API 자체는 수많은 벤치마크에 나온거처럼 빠르긴 하군요
초당 요청 처리량이 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"
)
 
831406949_1715008903.1275.png
 
초당 요청 처리량이 6152 -> 432 로 어마어마 하게
떨어져버렸습니다.
그냥 템플릿 하나 붙였을 뿐인데 속도가 1/14 로 떨어지고
요청 실패도 생겼습니다.
 
공식문서에 나온대로 했는데 왜 이럴까요?..
 
 
여기서 FastAPI 의 특성을 봐야하는데요
FastAPI 는 파이썬 비동기 서버(ASGI)를 지원하는 프레임워크입니다.
ASGI 설명을 보면 요청시작 ~ 요청 끝까지 전체가 비동기 이벤트 루프라고합니다.
 
한마디로 노드 JS 생각하시면 됩니다.
 
아래 그림을 보면
 
831406949_1715009206.6309.png
 
 
 
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)
 
 
831406949_1715009902.3842.png

 

초당 요청 처리 수가 4528/s  에 http 요청 실패도 0% 가 되었습니다

동기식 코드에 비해 제성능을 되찾은 것을 알 수있습니다.

 

정리. 초당 요청 수

*FastAPI- 기본 6152/s

* 진자 동기      432/s

* 진자 비동기 4528/s

 

결론

FastAPI 는 빠르다.

비동기 프레임워크에서는 블록킹 되는 코드가 들어가면 성능하락이 심하다.

노드 JS 처럼 비동기 루프이므로 비동기 코드만 써야 제 성능을 낸다.

 

 

파이썬은 php 보다 느리다고 들었는데 측정해보니까

비동기의 이점때문에 오히려 PHP 보다 빠른거같아요

 

그누 6은  정식버전되면 그누 5보다 엄청 빨라지겠죠!

요즘 뜨는 모 사이트도 그누 6으로 갈 수있다는데 어떻게 될지 궁금해지네요

추천
3

댓글 2개

전체 34 |RSS
자유게시판 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT