SlideShare a Scribd company logo
1 of 43
Download to read offline
PyCon Korea 2019
파이썬으로 서버를 극한까지 끌어다 쓰기
Async I/O의 밑바닥
한섬기
sync vs. 

async vs. 

blocking vs. 

non-blocking
•프로그램의 주 실행흐름을 멈추지 않고 진행할 수 있는가의 여부.

•코드의 실행 결과 처리 및 활용을 별도의 채널에 맡겨둔 뒤 결과를 기다리지 않고 

바로 다음 코드를 실행하는 방식으로 프로그램을 진행.

•예: Future, Promise, Coroutine 등.
!3
sync vs. async programming
•입출력 처리를 완료될 때까지 기다릴 것인지 혹은 시작만 해두고 

다음 작업을 계속 진행할 것인지 여부.

•I/O 작업이 완료된 이후에 연결해서 진행할 후속 작업이 있는 경우, 

Polling이나 Callback 함수를 사용.
!4
blocking vs. non-blocking I/O
•asynchronous programming vs. non-blocking I/O

•Blocking I/O를 사용했어도 이 부분이 별도의 채널을 통한 작업으로 이루어짐으로써 

어떤 프로그램의 주 실행흐름을 막지 않았다면, 

이 프로그램은 Asynchronous Programming으로 개발했다고 할 수 있음.
!5
async vs. non-blocking
Asynchronous Frameworks
•Quart

•Growler

•FastAPI
!7
etc.
•Flask와 유사한 프레임워크.

•가장 빠른 파이썬 웹 서버를 만드는 것이 목표.

•멀티 프로세스 아키텍쳐로, 멀티 CPU 코어를 기본적으로 사용.

•가능한 경우, uvloop과 C로 구현된 더 빠른 방식을 사용함.
!8
Vibora
•Flask와 유사한 프레임워크.

•가장 빠른 파이썬 웹 서버를 만드는 것이 목표.

•멀티 프로세스 아키텍쳐로, 멀티 CPU 코어를 기본적으로 사용.

•가능한 경우, uvloop과 C로 구현된 더 빠른 방식을 사용함.
!9
Vibora
이게 뭘까?
•asyncio를 사용하는 비동기 HTTP 클라이언트이자 서버 프레임워크.

•서버와 클라이언트 웹소켓을 둘 다 지원.

•웹서버는 미들웨어와 시그널을 제공.
!10
AIOHTTP
https://aiohttp.readthedocs.io/en/stable/
•Able to read and write cookies

•높은 성능의 HTTP서버를 쉽게 구축하고 확장할 수 있도록 만드는 것이 목표.

•클래스 기반의 뷰 제공

•블루프린트라는 기능을 통해 서브라우팅 제공.

•uvloop 기반의 비동기로 HTTP를 빠르게 처리할 수 있는 프레임워크.
!11
Sanic
•파이썬 웹 프레임워크이자 비동기 네트워크 라이브러리.

•HTTP의 클라이언트와 서버 둘 다 제공.

•코루틴 라이브러리인 tornado.gen 과 yield 문법을 통해 비동기를 구현.

•이 방식으로 인해 콜백 체이닝을 하지 않아도 코드를 깔끔하게 구현할 수 있었음.
!12
Tornado
Asynchronous Libraries
•asyncio는 async/await 구문을 사용하여 동시성 코드를 작성하는 라이브러리

•asyncio는 다음과 같은 작업을 위한 고수준 API 집합을 제공

•파이썬 코루틴들을 동시에 실행 및 제어

•자식 프로세스를 제어

•동시성 코드를 동기화

•저수준 API도 제공

•네트워킹, 자식 프로세스 실행, OS 시그널 처리 등의 

비동기 API를 제공하는 이벤트 루프를 만들고 관리
!14
asyncio
import asyncio
async def main():
print('Hello ...')
await asyncio.sleep(1)
print('... World!')
asyncio.run(main())
!15
asyncio
•uvloop은 Python의 asyncio에서 구현되어 있는 이벤트 루프를 대체함.

•uvloop은 Cython으로 구현되었으며, libuv를 기반으로 함.
!16
uvloop
import asyncio
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
!17
uvloop
•Unicorn Velociraptor Library.

•libuv는 크로스 플랫폼을 지원하는 라이브러리이며, 최초 Node.js를 위해 작성.

•이벤트 드리븐 비동기 I/O 모델을 기반으로 구성.

•kqueue, epoll, IOCP 등을 추상화.
!18
libuv
!19
http://docs.libuv.org/en/v1.x/design.html
•각각 다른 쓰레드에서 실행된다면 여러 이벤트 루프를 실행 가능.

•libuv의 이벤트 루프는 직접 언급되어 있지 않다면 안전하지 않은 쓰레드.

•모든 I/O는 각 OS에 맞는 non-blocking 소켓에서 수행.
!20
The I/O loop
!21
http://docs.libuv.org/en/v1.x/design.html
•이벤트 루프는 시간 관련 시스템 호출 수를 줄이기 위해 

이벤트 루프 틱 시작 시 현재 시각을 캐시.
22
•이벤트 루프가 활성 상태인 경우 반복이 시작되고, 그렇지
않으면 즉시 종료.

•루프에 활성 및 참조 처리된 핸들, 활성 요청 또는 닫히는 중
인 핸들이 있으면 활성 상태인 것으로 간주.
23
•마감 타이머가 시작됨.
24
•대기중인 콜백이 호출됨.

•I/O 콜백은 대부분 I/O 폴링 직후에 호출됨.

•그러나 다음 루프로 호출이 지연되는 콜백도 있음.

•이전 반복에서 지연된 I/O 콜백은 이 시점에서 호출됨.
25
•유휴(idle) 핸들 콜백이 호출됨.

•이름은 쉬고 있는 핸들이지만, 활성화 상태라면 모든 루프에
서 실행됨.
26
•핸들 준비 콜백이 호출됨.

•루프가 I/O를 차단(block)하기 직전에 준비 핸들이 

콜백을 호출함.
27
•I/O를 차단하기 전에 루프는 얼마나 오래 차단(block)해야 

하는지 폴링 타임아웃을 계산.

•루프가 I/O를 차단(block).

•이 시점에서 루프는 이전 단계에서 계산된 지속 시간 동안 

I/O를 차단(block).

•읽기 또는 쓰기 조작에 대해 주어진 파일 디스크립터를 

모니터링하고있는 모든 I/O 관련 핸들은 이 시점에서 

호출된 콜백을 가져옴.
28
•루프가 I/O를 차단(block)한 직후 체크 핸들이 콜백을 호출.

•체크 핸들은 기본적으로 준비 핸들과 대응됨.
29
•uv_close() 함수를 호출하여 핸들을 닫으면, 

닫기 콜백이 호출됨.
30
sync vs. async
Django vs. 

Flask vs. 

AIOHTTP vs. 

Sanic vs. 

Vibora
!33
사전 준비물
•AWS EC2 m5.2xlarge Instance - Dedicated Tenancy

•8 vCPU, 32 GiB Memory

•ubuntu 18.04

•https://github.com/vibora-io/benchmarks

•pip install 로 버전 지정없이 설치되는 최신 안정화 버전 웹 프레임워크들
!34
Forms Parsing
•multipart-form으로 몇 개의 파라미터와 

하나의 귀여운 파일을 POST로 전송하는 시나리오

•Vibora code
@app.route('/', methods=['POST'], cache=False)
async def home(request: Request):
return JsonResponse({'count': len(await request.files())})
!35
Forms Parsing
Frameworks Requests/Sec Version
Django 6896 2.2.4
Flask 12938 1.1.1
Aiohttp 2605 3.5.4
Sanic 47964 19.6.2
Vibora 81605 0.0.6
!36
Redis API
•JSON 데이터를 POST로 넘겨받아서 검증을 하고 

Redis에서 간단한 데이터를 하나 가져와서 반환하는 시나리오

•Vibora code
@app.route('/', methods=['POST'])
async def home(request: Request, redis: Redis):
schema = await SimpleSchema.load_json(request)
value = await redis.get(schema.key_name)
return Response(value)
!37
Redis API
Frameworks Requests/Sec Version
Django 11207 2.2.4
Flask 26793 1.1.1
Aiohttp 30213 3.5.4
Sanic 50825 19.6.2
Vibora 87269 0.0.6
asyncio vs. uvloop & libuv
•이벤트 루프의 모든 코드를 Cython으로 구현

•파이썬 객체를 모두 C의 구조체와 함수로 구현

•최적화된 메모리 관리

•시스템 자원 사용 최적화

•그 외의 기본적인 구현 방향은 거의 유사
39
왜 이벤트 루프에만 사용했을까?
41
•Django 3.0에서 ASGI와 함께 동작할 수 있는 완전한 비동기 방식을 지원할 예정

•Django 3.0은 2019년 12월 배포 예상

•동기 방식 코드를 그대로 사용하면 SynchronousOnlyOperation 에러를 볼 수 있음

•기존 코드는 거대한 마이그레이션이 필요할 것으로 보임
!42
Django X async
https://docs.djangoproject.com/en/dev/releases/3.0/#asgi-support
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥

More Related Content

What's hot

[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축Ji-Woong Choi
 
아마존의 관리형 게임 플랫폼 활용하기: GameLift (Deep Dive) :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS ...
아마존의 관리형 게임 플랫폼 활용하기: GameLift (Deep Dive) :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS ...아마존의 관리형 게임 플랫폼 활용하기: GameLift (Deep Dive) :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS ...
아마존의 관리형 게임 플랫폼 활용하기: GameLift (Deep Dive) :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS ...Amazon Web Services Korea
 
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 SeoulElastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 SeoulSeungYong Oh
 
Jenkins tutorial for beginners
Jenkins tutorial for beginnersJenkins tutorial for beginners
Jenkins tutorial for beginnersBugRaptors
 
AWS를 활용해서 글로벌 게임 런칭하기 - 박진성 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
AWS를 활용해서 글로벌 게임 런칭하기 - 박진성 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021AWS를 활용해서 글로벌 게임 런칭하기 - 박진성 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
AWS를 활용해서 글로벌 게임 런칭하기 - 박진성 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021Amazon Web Services Korea
 
MSA를 넘어 Function의 로의 진화::주경호 수석::AWS Summit Seoul 2018
MSA를 넘어 Function의 로의 진화::주경호 수석::AWS Summit Seoul 2018MSA를 넘어 Function의 로의 진화::주경호 수석::AWS Summit Seoul 2018
MSA를 넘어 Function의 로의 진화::주경호 수석::AWS Summit Seoul 2018Amazon Web Services Korea
 
Amazon OpenSearch Deep dive - 내부구조, 성능최적화 그리고 스케일링
Amazon OpenSearch Deep dive - 내부구조, 성능최적화 그리고 스케일링Amazon OpenSearch Deep dive - 내부구조, 성능최적화 그리고 스케일링
Amazon OpenSearch Deep dive - 내부구조, 성능최적화 그리고 스케일링Amazon Web Services Korea
 
Terraform을 기반한 AWS 기반 대규모 마이크로서비스 인프라 운영 노하우 - 이용욱, 삼성전자 :: AWS Summit Seoul ...
Terraform을 기반한 AWS 기반 대규모 마이크로서비스 인프라 운영 노하우 - 이용욱, 삼성전자 :: AWS Summit Seoul ...Terraform을 기반한 AWS 기반 대규모 마이크로서비스 인프라 운영 노하우 - 이용욱, 삼성전자 :: AWS Summit Seoul ...
Terraform을 기반한 AWS 기반 대규모 마이크로서비스 인프라 운영 노하우 - 이용욱, 삼성전자 :: AWS Summit Seoul ...Amazon Web Services Korea
 
Ansible presentation
Ansible presentationAnsible presentation
Ansible presentationJohn Lynch
 
AWS 클라우드 기반 게임 아키텍처 사례 - AWS Summit Seoul 2017
AWS 클라우드 기반 게임 아키텍처 사례 - AWS Summit Seoul 2017AWS 클라우드 기반 게임 아키텍처 사례 - AWS Summit Seoul 2017
AWS 클라우드 기반 게임 아키텍처 사례 - AWS Summit Seoul 2017Amazon Web Services Korea
 
Asynchronous 101 - (1)
Asynchronous 101 - (1)Asynchronous 101 - (1)
Asynchronous 101 - (1)MinChul Lee
 
Windows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonWindows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonSeungmo Koo
 
Serverless Architectures in Banking: OpenWhisk on IBM Bluemix at Santander
Serverless Architectures in Banking: OpenWhisk on IBM Bluemix at SantanderServerless Architectures in Banking: OpenWhisk on IBM Bluemix at Santander
Serverless Architectures in Banking: OpenWhisk on IBM Bluemix at SantanderDaniel Krook
 
CloudWatch 성능 모니터링과 신속한 대응을 위한 노하우 - 박선용 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
CloudWatch 성능 모니터링과 신속한 대응을 위한 노하우 - 박선용 솔루션즈 아키텍트:: AWS Cloud Track 3 GamingCloudWatch 성능 모니터링과 신속한 대응을 위한 노하우 - 박선용 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
CloudWatch 성능 모니터링과 신속한 대응을 위한 노하우 - 박선용 솔루션즈 아키텍트:: AWS Cloud Track 3 GamingAmazon Web Services Korea
 

What's hot (20)

[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
 
Android Internals
Android InternalsAndroid Internals
Android Internals
 
Ansible
AnsibleAnsible
Ansible
 
아마존의 관리형 게임 플랫폼 활용하기: GameLift (Deep Dive) :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS ...
아마존의 관리형 게임 플랫폼 활용하기: GameLift (Deep Dive) :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS ...아마존의 관리형 게임 플랫폼 활용하기: GameLift (Deep Dive) :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS ...
아마존의 관리형 게임 플랫폼 활용하기: GameLift (Deep Dive) :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS ...
 
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 SeoulElastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
 
Jenkins tutorial for beginners
Jenkins tutorial for beginnersJenkins tutorial for beginners
Jenkins tutorial for beginners
 
Ansible 101
Ansible 101Ansible 101
Ansible 101
 
AWS를 활용해서 글로벌 게임 런칭하기 - 박진성 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
AWS를 활용해서 글로벌 게임 런칭하기 - 박진성 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021AWS를 활용해서 글로벌 게임 런칭하기 - 박진성 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
AWS를 활용해서 글로벌 게임 런칭하기 - 박진성 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
 
Prometheus course
Prometheus coursePrometheus course
Prometheus course
 
MSA를 넘어 Function의 로의 진화::주경호 수석::AWS Summit Seoul 2018
MSA를 넘어 Function의 로의 진화::주경호 수석::AWS Summit Seoul 2018MSA를 넘어 Function의 로의 진화::주경호 수석::AWS Summit Seoul 2018
MSA를 넘어 Function의 로의 진화::주경호 수석::AWS Summit Seoul 2018
 
Ansible - Hands on Training
Ansible - Hands on TrainingAnsible - Hands on Training
Ansible - Hands on Training
 
Prometheus and Grafana
Prometheus and GrafanaPrometheus and Grafana
Prometheus and Grafana
 
Amazon OpenSearch Deep dive - 내부구조, 성능최적화 그리고 스케일링
Amazon OpenSearch Deep dive - 내부구조, 성능최적화 그리고 스케일링Amazon OpenSearch Deep dive - 내부구조, 성능최적화 그리고 스케일링
Amazon OpenSearch Deep dive - 내부구조, 성능최적화 그리고 스케일링
 
Terraform을 기반한 AWS 기반 대규모 마이크로서비스 인프라 운영 노하우 - 이용욱, 삼성전자 :: AWS Summit Seoul ...
Terraform을 기반한 AWS 기반 대규모 마이크로서비스 인프라 운영 노하우 - 이용욱, 삼성전자 :: AWS Summit Seoul ...Terraform을 기반한 AWS 기반 대규모 마이크로서비스 인프라 운영 노하우 - 이용욱, 삼성전자 :: AWS Summit Seoul ...
Terraform을 기반한 AWS 기반 대규모 마이크로서비스 인프라 운영 노하우 - 이용욱, 삼성전자 :: AWS Summit Seoul ...
 
Ansible presentation
Ansible presentationAnsible presentation
Ansible presentation
 
AWS 클라우드 기반 게임 아키텍처 사례 - AWS Summit Seoul 2017
AWS 클라우드 기반 게임 아키텍처 사례 - AWS Summit Seoul 2017AWS 클라우드 기반 게임 아키텍처 사례 - AWS Summit Seoul 2017
AWS 클라우드 기반 게임 아키텍처 사례 - AWS Summit Seoul 2017
 
Asynchronous 101 - (1)
Asynchronous 101 - (1)Asynchronous 101 - (1)
Asynchronous 101 - (1)
 
Windows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonWindows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance Comparison
 
Serverless Architectures in Banking: OpenWhisk on IBM Bluemix at Santander
Serverless Architectures in Banking: OpenWhisk on IBM Bluemix at SantanderServerless Architectures in Banking: OpenWhisk on IBM Bluemix at Santander
Serverless Architectures in Banking: OpenWhisk on IBM Bluemix at Santander
 
CloudWatch 성능 모니터링과 신속한 대응을 위한 노하우 - 박선용 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
CloudWatch 성능 모니터링과 신속한 대응을 위한 노하우 - 박선용 솔루션즈 아키텍트:: AWS Cloud Track 3 GamingCloudWatch 성능 모니터링과 신속한 대응을 위한 노하우 - 박선용 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
CloudWatch 성능 모니터링과 신속한 대응을 위한 노하우 - 박선용 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
 

Similar to 파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥

인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍Chris Ohk
 
Concurrent programming 2
Concurrent programming 2Concurrent programming 2
Concurrent programming 2Byeongsu Kang
 
7가지 동시성 모델 - 6장. 순차 프로세스 통신
7가지 동시성 모델 - 6장. 순차 프로세스 통신7가지 동시성 모델 - 6장. 순차 프로세스 통신
7가지 동시성 모델 - 6장. 순차 프로세스 통신Hyunsoo Jung
 
ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자Sewon Ann
 
More Effective Python 3st (Multitask)
More Effective Python 3st (Multitask)More Effective Python 3st (Multitask)
More Effective Python 3st (Multitask)경섭 심
 
Pcl 라이브러리 빌드_튜토리얼
Pcl 라이브러리 빌드_튜토리얼Pcl 라이브러리 빌드_튜토리얼
Pcl 라이브러리 빌드_튜토리얼Hyounggap An
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발Jeongkyu Shin
 
bamboo 로 PHP 프로젝트 지속적인 배포
bamboo 로 PHP 프로젝트 지속적인 배포bamboo 로 PHP 프로젝트 지속적인 배포
bamboo 로 PHP 프로젝트 지속적인 배포KwangSeob Jeong
 
강좌 04 펌웨어 구조 설계
강좌 04 펌웨어 구조 설계강좌 04 펌웨어 구조 설계
강좌 04 펌웨어 구조 설계chcbaram
 
Concurreny programming
Concurreny programmingConcurreny programming
Concurreny programmingJaejin Yun
 
[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for Appspresso[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for AppspressoKTH, 케이티하이텔
 
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍NDOORS
 
[Azure bootcamp2017] Azure App Service로 서비스 탄탄하게 관리하기
[Azure bootcamp2017] Azure App Service로 서비스 탄탄하게 관리하기[Azure bootcamp2017] Azure App Service로 서비스 탄탄하게 관리하기
[Azure bootcamp2017] Azure App Service로 서비스 탄탄하게 관리하기Youngjae Kim
 
20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debugging20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debuggingJongwon Han
 
manage inhouse openstack the hard way(kakao case study about 10,000 vms)
manage inhouse openstack the hard way(kakao case study about 10,000 vms)manage inhouse openstack the hard way(kakao case study about 10,000 vms)
manage inhouse openstack the hard way(kakao case study about 10,000 vms)어형 이
 
Envoy 를 이용한 코드 배포 자동화
Envoy 를 이용한 코드 배포 자동화Envoy 를 이용한 코드 배포 자동화
Envoy 를 이용한 코드 배포 자동화Juwon Kim
 
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현NAVER Engineering
 

Similar to 파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥 (20)

인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
 
Concurrent programming 2
Concurrent programming 2Concurrent programming 2
Concurrent programming 2
 
7가지 동시성 모델 - 6장. 순차 프로세스 통신
7가지 동시성 모델 - 6장. 순차 프로세스 통신7가지 동시성 모델 - 6장. 순차 프로세스 통신
7가지 동시성 모델 - 6장. 순차 프로세스 통신
 
ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자
 
More Effective Python 3st (Multitask)
More Effective Python 3st (Multitask)More Effective Python 3st (Multitask)
More Effective Python 3st (Multitask)
 
Pcl 라이브러리 빌드_튜토리얼
Pcl 라이브러리 빌드_튜토리얼Pcl 라이브러리 빌드_튜토리얼
Pcl 라이브러리 빌드_튜토리얼
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
 
bamboo 로 PHP 프로젝트 지속적인 배포
bamboo 로 PHP 프로젝트 지속적인 배포bamboo 로 PHP 프로젝트 지속적인 배포
bamboo 로 PHP 프로젝트 지속적인 배포
 
Spring boot DI
Spring boot DISpring boot DI
Spring boot DI
 
강좌 04 펌웨어 구조 설계
강좌 04 펌웨어 구조 설계강좌 04 펌웨어 구조 설계
강좌 04 펌웨어 구조 설계
 
Concurreny programming
Concurreny programmingConcurreny programming
Concurreny programming
 
[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for Appspresso[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for Appspresso
 
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
 
[Azure bootcamp2017] Azure App Service로 서비스 탄탄하게 관리하기
[Azure bootcamp2017] Azure App Service로 서비스 탄탄하게 관리하기[Azure bootcamp2017] Azure App Service로 서비스 탄탄하게 관리하기
[Azure bootcamp2017] Azure App Service로 서비스 탄탄하게 관리하기
 
20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debugging20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debugging
 
Ninja
NinjaNinja
Ninja
 
System+os study 3
System+os study 3System+os study 3
System+os study 3
 
manage inhouse openstack the hard way(kakao case study about 10,000 vms)
manage inhouse openstack the hard way(kakao case study about 10,000 vms)manage inhouse openstack the hard way(kakao case study about 10,000 vms)
manage inhouse openstack the hard way(kakao case study about 10,000 vms)
 
Envoy 를 이용한 코드 배포 자동화
Envoy 를 이용한 코드 배포 자동화Envoy 를 이용한 코드 배포 자동화
Envoy 를 이용한 코드 배포 자동화
 
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
 

파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥

  • 1. PyCon Korea 2019 파이썬으로 서버를 극한까지 끌어다 쓰기 Async I/O의 밑바닥 한섬기
  • 2. sync vs. async vs. blocking vs. non-blocking
  • 3. •프로그램의 주 실행흐름을 멈추지 않고 진행할 수 있는가의 여부. •코드의 실행 결과 처리 및 활용을 별도의 채널에 맡겨둔 뒤 결과를 기다리지 않고 
 바로 다음 코드를 실행하는 방식으로 프로그램을 진행. •예: Future, Promise, Coroutine 등. !3 sync vs. async programming
  • 4. •입출력 처리를 완료될 때까지 기다릴 것인지 혹은 시작만 해두고 
 다음 작업을 계속 진행할 것인지 여부. •I/O 작업이 완료된 이후에 연결해서 진행할 후속 작업이 있는 경우, 
 Polling이나 Callback 함수를 사용. !4 blocking vs. non-blocking I/O
  • 5. •asynchronous programming vs. non-blocking I/O •Blocking I/O를 사용했어도 이 부분이 별도의 채널을 통한 작업으로 이루어짐으로써 
 어떤 프로그램의 주 실행흐름을 막지 않았다면, 
 이 프로그램은 Asynchronous Programming으로 개발했다고 할 수 있음. !5 async vs. non-blocking
  • 8. •Flask와 유사한 프레임워크. •가장 빠른 파이썬 웹 서버를 만드는 것이 목표. •멀티 프로세스 아키텍쳐로, 멀티 CPU 코어를 기본적으로 사용. •가능한 경우, uvloop과 C로 구현된 더 빠른 방식을 사용함. !8 Vibora
  • 9. •Flask와 유사한 프레임워크. •가장 빠른 파이썬 웹 서버를 만드는 것이 목표. •멀티 프로세스 아키텍쳐로, 멀티 CPU 코어를 기본적으로 사용. •가능한 경우, uvloop과 C로 구현된 더 빠른 방식을 사용함. !9 Vibora 이게 뭘까?
  • 10. •asyncio를 사용하는 비동기 HTTP 클라이언트이자 서버 프레임워크. •서버와 클라이언트 웹소켓을 둘 다 지원. •웹서버는 미들웨어와 시그널을 제공. !10 AIOHTTP https://aiohttp.readthedocs.io/en/stable/
  • 11. •Able to read and write cookies •높은 성능의 HTTP서버를 쉽게 구축하고 확장할 수 있도록 만드는 것이 목표. •클래스 기반의 뷰 제공 •블루프린트라는 기능을 통해 서브라우팅 제공. •uvloop 기반의 비동기로 HTTP를 빠르게 처리할 수 있는 프레임워크. !11 Sanic
  • 12. •파이썬 웹 프레임워크이자 비동기 네트워크 라이브러리. •HTTP의 클라이언트와 서버 둘 다 제공. •코루틴 라이브러리인 tornado.gen 과 yield 문법을 통해 비동기를 구현. •이 방식으로 인해 콜백 체이닝을 하지 않아도 코드를 깔끔하게 구현할 수 있었음. !12 Tornado
  • 14. •asyncio는 async/await 구문을 사용하여 동시성 코드를 작성하는 라이브러리 •asyncio는 다음과 같은 작업을 위한 고수준 API 집합을 제공 •파이썬 코루틴들을 동시에 실행 및 제어 •자식 프로세스를 제어 •동시성 코드를 동기화 •저수준 API도 제공 •네트워킹, 자식 프로세스 실행, OS 시그널 처리 등의 
 비동기 API를 제공하는 이벤트 루프를 만들고 관리 !14 asyncio
  • 15. import asyncio async def main(): print('Hello ...') await asyncio.sleep(1) print('... World!') asyncio.run(main()) !15 asyncio
  • 16. •uvloop은 Python의 asyncio에서 구현되어 있는 이벤트 루프를 대체함. •uvloop은 Cython으로 구현되었으며, libuv를 기반으로 함. !16 uvloop
  • 18. •Unicorn Velociraptor Library. •libuv는 크로스 플랫폼을 지원하는 라이브러리이며, 최초 Node.js를 위해 작성. •이벤트 드리븐 비동기 I/O 모델을 기반으로 구성. •kqueue, epoll, IOCP 등을 추상화. !18 libuv
  • 20. •각각 다른 쓰레드에서 실행된다면 여러 이벤트 루프를 실행 가능. •libuv의 이벤트 루프는 직접 언급되어 있지 않다면 안전하지 않은 쓰레드. •모든 I/O는 각 OS에 맞는 non-blocking 소켓에서 수행. !20 The I/O loop
  • 22. •이벤트 루프는 시간 관련 시스템 호출 수를 줄이기 위해 
 이벤트 루프 틱 시작 시 현재 시각을 캐시. 22
  • 23. •이벤트 루프가 활성 상태인 경우 반복이 시작되고, 그렇지 않으면 즉시 종료. •루프에 활성 및 참조 처리된 핸들, 활성 요청 또는 닫히는 중 인 핸들이 있으면 활성 상태인 것으로 간주. 23
  • 25. •대기중인 콜백이 호출됨. •I/O 콜백은 대부분 I/O 폴링 직후에 호출됨. •그러나 다음 루프로 호출이 지연되는 콜백도 있음. •이전 반복에서 지연된 I/O 콜백은 이 시점에서 호출됨. 25
  • 26. •유휴(idle) 핸들 콜백이 호출됨. •이름은 쉬고 있는 핸들이지만, 활성화 상태라면 모든 루프에 서 실행됨. 26
  • 27. •핸들 준비 콜백이 호출됨. •루프가 I/O를 차단(block)하기 직전에 준비 핸들이 
 콜백을 호출함. 27
  • 28. •I/O를 차단하기 전에 루프는 얼마나 오래 차단(block)해야 
 하는지 폴링 타임아웃을 계산. •루프가 I/O를 차단(block). •이 시점에서 루프는 이전 단계에서 계산된 지속 시간 동안 
 I/O를 차단(block). •읽기 또는 쓰기 조작에 대해 주어진 파일 디스크립터를 
 모니터링하고있는 모든 I/O 관련 핸들은 이 시점에서 
 호출된 콜백을 가져옴. 28
  • 29. •루프가 I/O를 차단(block)한 직후 체크 핸들이 콜백을 호출. •체크 핸들은 기본적으로 준비 핸들과 대응됨. 29
  • 30. •uv_close() 함수를 호출하여 핸들을 닫으면, 
 닫기 콜백이 호출됨. 30
  • 32. Django vs. Flask vs. AIOHTTP vs. Sanic vs. Vibora
  • 33. !33 사전 준비물 •AWS EC2 m5.2xlarge Instance - Dedicated Tenancy •8 vCPU, 32 GiB Memory •ubuntu 18.04 •https://github.com/vibora-io/benchmarks •pip install 로 버전 지정없이 설치되는 최신 안정화 버전 웹 프레임워크들
  • 34. !34 Forms Parsing •multipart-form으로 몇 개의 파라미터와 
 하나의 귀여운 파일을 POST로 전송하는 시나리오 •Vibora code @app.route('/', methods=['POST'], cache=False) async def home(request: Request): return JsonResponse({'count': len(await request.files())})
  • 35. !35 Forms Parsing Frameworks Requests/Sec Version Django 6896 2.2.4 Flask 12938 1.1.1 Aiohttp 2605 3.5.4 Sanic 47964 19.6.2 Vibora 81605 0.0.6
  • 36. !36 Redis API •JSON 데이터를 POST로 넘겨받아서 검증을 하고 
 Redis에서 간단한 데이터를 하나 가져와서 반환하는 시나리오 •Vibora code @app.route('/', methods=['POST']) async def home(request: Request, redis: Redis): schema = await SimpleSchema.load_json(request) value = await redis.get(schema.key_name) return Response(value)
  • 37. !37 Redis API Frameworks Requests/Sec Version Django 11207 2.2.4 Flask 26793 1.1.1 Aiohttp 30213 3.5.4 Sanic 50825 19.6.2 Vibora 87269 0.0.6
  • 39. •이벤트 루프의 모든 코드를 Cython으로 구현 •파이썬 객체를 모두 C의 구조체와 함수로 구현 •최적화된 메모리 관리 •시스템 자원 사용 최적화 •그 외의 기본적인 구현 방향은 거의 유사 39
  • 40. 왜 이벤트 루프에만 사용했을까?
  • 41. 41
  • 42. •Django 3.0에서 ASGI와 함께 동작할 수 있는 완전한 비동기 방식을 지원할 예정 •Django 3.0은 2019년 12월 배포 예상 •동기 방식 코드를 그대로 사용하면 SynchronousOnlyOperation 에러를 볼 수 있음 •기존 코드는 거대한 마이그레이션이 필요할 것으로 보임 !42 Django X async https://docs.djangoproject.com/en/dev/releases/3.0/#asgi-support