SlideShare une entreprise Scribd logo
1  sur  43
Télécharger pour lire hors ligne
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의 밑바닥

Contenu connexe

Tendances

OOP 설계 원칙 S.O.L.I.D.
OOP 설계 원칙 S.O.L.I.D.OOP 설계 원칙 S.O.L.I.D.
OOP 설계 원칙 S.O.L.I.D.Ryan Park
 
Kafka replication apachecon_2013
Kafka replication apachecon_2013Kafka replication apachecon_2013
Kafka replication apachecon_2013Jun Rao
 
Cilium - Container Networking with BPF & XDP
Cilium - Container Networking with BPF & XDPCilium - Container Networking with BPF & XDP
Cilium - Container Networking with BPF & XDPThomas Graf
 
[MeetUp][1st] 오리뎅이의_쿠버네티스_네트워킹
[MeetUp][1st] 오리뎅이의_쿠버네티스_네트워킹[MeetUp][1st] 오리뎅이의_쿠버네티스_네트워킹
[MeetUp][1st] 오리뎅이의_쿠버네티스_네트워킹InfraEngineer
 
ELF(executable and linkable format)
ELF(executable and linkable format)ELF(executable and linkable format)
ELF(executable and linkable format)Seungha Son
 
Apache BookKeeper: A High Performance and Low Latency Storage Service
Apache BookKeeper: A High Performance and Low Latency Storage ServiceApache BookKeeper: A High Performance and Low Latency Storage Service
Apache BookKeeper: A High Performance and Low Latency Storage ServiceSijie Guo
 
Stability Patterns for Microservices
Stability Patterns for MicroservicesStability Patterns for Microservices
Stability Patterns for Microservicespflueras
 
Ninja Build: Simple Guide for Beginners
Ninja Build: Simple Guide for BeginnersNinja Build: Simple Guide for Beginners
Ninja Build: Simple Guide for BeginnersChang W. Doh
 
Scalability, Availability & Stability Patterns
Scalability, Availability & Stability PatternsScalability, Availability & Stability Patterns
Scalability, Availability & Stability PatternsJonas Bonér
 
SeaweedFS introduction
SeaweedFS introductionSeaweedFS introduction
SeaweedFS introductionchrislusf
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기beom kyun choi
 
아마존 클라우드와 함께한 1개월, 쿠키런 사례중심 (KGC 2013)
아마존 클라우드와 함께한 1개월, 쿠키런 사례중심 (KGC 2013)아마존 클라우드와 함께한 1개월, 쿠키런 사례중심 (KGC 2013)
아마존 클라우드와 함께한 1개월, 쿠키런 사례중심 (KGC 2013)Brian Hong
 
Apache kafka performance(latency)_benchmark_v0.3
Apache kafka performance(latency)_benchmark_v0.3Apache kafka performance(latency)_benchmark_v0.3
Apache kafka performance(latency)_benchmark_v0.3SANG WON PARK
 
Running Kubernetes in Production: A Million Ways to Crash Your Cluster - DevO...
Running Kubernetes in Production: A Million Ways to Crash Your Cluster - DevO...Running Kubernetes in Production: A Million Ways to Crash Your Cluster - DevO...
Running Kubernetes in Production: A Million Ways to Crash Your Cluster - DevO...Henning Jacobs
 
Nginx Reverse Proxy with Kafka.pptx
Nginx Reverse Proxy with Kafka.pptxNginx Reverse Proxy with Kafka.pptx
Nginx Reverse Proxy with Kafka.pptxwonyong hwang
 
서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)수보 김
 
4. 대용량 아키텍쳐 설계 패턴
4. 대용량 아키텍쳐 설계 패턴4. 대용량 아키텍쳐 설계 패턴
4. 대용량 아키텍쳐 설계 패턴Terry Cho
 
redis 소개자료 - 네오클로바
redis 소개자료 - 네오클로바redis 소개자료 - 네오클로바
redis 소개자료 - 네오클로바NeoClova
 

Tendances (20)

OOP 설계 원칙 S.O.L.I.D.
OOP 설계 원칙 S.O.L.I.D.OOP 설계 원칙 S.O.L.I.D.
OOP 설계 원칙 S.O.L.I.D.
 
Kafka replication apachecon_2013
Kafka replication apachecon_2013Kafka replication apachecon_2013
Kafka replication apachecon_2013
 
Cilium - Container Networking with BPF & XDP
Cilium - Container Networking with BPF & XDPCilium - Container Networking with BPF & XDP
Cilium - Container Networking with BPF & XDP
 
Init of Android
Init of AndroidInit of Android
Init of Android
 
[MeetUp][1st] 오리뎅이의_쿠버네티스_네트워킹
[MeetUp][1st] 오리뎅이의_쿠버네티스_네트워킹[MeetUp][1st] 오리뎅이의_쿠버네티스_네트워킹
[MeetUp][1st] 오리뎅이의_쿠버네티스_네트워킹
 
ELF(executable and linkable format)
ELF(executable and linkable format)ELF(executable and linkable format)
ELF(executable and linkable format)
 
Apache BookKeeper: A High Performance and Low Latency Storage Service
Apache BookKeeper: A High Performance and Low Latency Storage ServiceApache BookKeeper: A High Performance and Low Latency Storage Service
Apache BookKeeper: A High Performance and Low Latency Storage Service
 
Stability Patterns for Microservices
Stability Patterns for MicroservicesStability Patterns for Microservices
Stability Patterns for Microservices
 
Ninja Build: Simple Guide for Beginners
Ninja Build: Simple Guide for BeginnersNinja Build: Simple Guide for Beginners
Ninja Build: Simple Guide for Beginners
 
Scalability, Availability & Stability Patterns
Scalability, Availability & Stability PatternsScalability, Availability & Stability Patterns
Scalability, Availability & Stability Patterns
 
SeaweedFS introduction
SeaweedFS introductionSeaweedFS introduction
SeaweedFS introduction
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기
 
아마존 클라우드와 함께한 1개월, 쿠키런 사례중심 (KGC 2013)
아마존 클라우드와 함께한 1개월, 쿠키런 사례중심 (KGC 2013)아마존 클라우드와 함께한 1개월, 쿠키런 사례중심 (KGC 2013)
아마존 클라우드와 함께한 1개월, 쿠키런 사례중심 (KGC 2013)
 
Apache kafka performance(latency)_benchmark_v0.3
Apache kafka performance(latency)_benchmark_v0.3Apache kafka performance(latency)_benchmark_v0.3
Apache kafka performance(latency)_benchmark_v0.3
 
Running Kubernetes in Production: A Million Ways to Crash Your Cluster - DevO...
Running Kubernetes in Production: A Million Ways to Crash Your Cluster - DevO...Running Kubernetes in Production: A Million Ways to Crash Your Cluster - DevO...
Running Kubernetes in Production: A Million Ways to Crash Your Cluster - DevO...
 
Nginx Reverse Proxy with Kafka.pptx
Nginx Reverse Proxy with Kafka.pptxNginx Reverse Proxy with Kafka.pptx
Nginx Reverse Proxy with Kafka.pptx
 
서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)
 
eBPF maps 101
eBPF maps 101eBPF maps 101
eBPF maps 101
 
4. 대용량 아키텍쳐 설계 패턴
4. 대용량 아키텍쳐 설계 패턴4. 대용량 아키텍쳐 설계 패턴
4. 대용량 아키텍쳐 설계 패턴
 
redis 소개자료 - 네오클로바
redis 소개자료 - 네오클로바redis 소개자료 - 네오클로바
redis 소개자료 - 네오클로바
 

Similaire à 파이콘 한국 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)경섭 심
 
Asynchronous 101 - (1)
Asynchronous 101 - (1)Asynchronous 101 - (1)
Asynchronous 101 - (1)MinChul Lee
 
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
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기Chanwoong Kim
 
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)어형 이
 

Similaire à 파이콘 한국 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)
 
Asynchronous 101 - (1)
Asynchronous 101 - (1)Asynchronous 101 - (1)
Asynchronous 101 - (1)
 
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 펌웨어 구조 설계
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
 
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)
 

파이콘 한국 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