# * uvloop

Written by ๐Ÿ“ Hidekuma

uvloop๋Š” asyncio์˜ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๋Œ€์ฒด์žฌ๋กœ, asyncio๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ณ , nodejs, gevent ๋ฐ ๋‹ค๋ฅธ python ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋น„๊ตํ•ด๋ด๋„, 2๋ฐฐ์ด์ƒ์˜ ํผํฌ๋จผ์Šค๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

TIP

python3.5 ๋ถ€ํ„ฐ ํŒŒ์ด์ฌ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ถ”๊ฐ€๋œ asyncio๋Š” ๋น„๋™๊ธฐ I/O ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

# asyncio & uvloop

asnycio๋Š” ๋„คํŠธ์›Œํฌ ์ „์†ก, ํ”„๋กœํ† ์ฝœ ๋ฐ ์ŠคํŠธ๋ฆผ ์ถ”์ƒํ™” ์ปฌ๋ ‰์…˜๊ณผ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉฐ, ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” asyncio์˜ ํ•ต์‹ฌ์ด๋‹ค. asyncio์˜ ์ฃผ์š”๊ธฐ๋Šฅ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์Šค์ผ€์ค„๋ง์— ์˜ํ•œ ํ˜ธ์ถœ
  • ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก
  • DNS ์ฟผ๋ฆฌ์ˆ˜ํ–‰
  • OS ์‹ ํ˜ธ ํ•ธ๋“ค๋ง
  • ์„œ๋ฒ„์™€ ์ปค๋„ฅ์…˜์„ ๋งŒ๋“œ๋Š” ํŽธ๋ฆฌํ•œ ์ถ”์ƒํ™”
  • ๋น„๋™๊ธฐ์  ์„œ๋ธŒํ”„๋กœ์„ธ์Šค

uvloop๋Š” asyncio์˜ ๋‚ด์žฅ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ๋Œ€์ฒดํ•˜๋ฉฐ ์„ค์น˜๋ฐฉ๋ฒ• ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

pip install uvloop
1

asyncio ์ฝ”๋“œ์— uvloop๋ฅผ ์ ‘๋ชฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

import asyncio, uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
1
2

ํ•ด๋‹น ์ฝ”๋“œ๋Š” asyncio.get_event_loop()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, uvloop์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

# ์•„ํ‚คํ…์ฒ˜

uvloop๋Š” libuv๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Cython์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ๋‹ค. libuv๋Š” nodejs์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ์„ฑ๋Šฅ ๋ฉ€ํ‹ฐ ํ”Œ๋žซํผ ๋น„๋™๊ธฐ I / O ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋ฉฐ, ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ด๋‹ค. nodej๊ฐ€ ์ธ๊ธฐ๋ฅผ ์–ป๊ณ  ๋„๋ฆฌ ๋ณด๊ธ‰๋œ ์ด์œ ๊ฐ€ libuv ๋•๋ถ„์ด๋ผ๊ณ  ํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹ˆ๋‹ค.

# ๋ฒค์น˜๋งˆํฌ

# TCP ๋ฒค์น˜๋งˆํฌ

  • ๊ณตํ†ต์กฐ๊ฑด
    • Intel Xeon CPU E5-1620 v2 @ 3.70GHz
    • Ubuntu Linux
    • 1, 10, 100 KiB ํฌ๊ธฐ์˜ ๋ฉ”์‹œ์ง€
    • ๋™์‹œ์„ฑ์ˆ˜์ค€: 10
    • ๋Ÿฌ๋‹ํƒ€์ž„ : 30s
  • asyncio, uvloop
    • Python 3.5
  • Go
    • GOMAXPROCS = 1
    • net.Conn.Read/Write ํ˜ธ์ถœ
  • nodejs
    • No cluster
    • v4.2.6

# TCP ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ

tcp performance

# HTTP ๋ฒค์น˜๋งˆํฌ

  • ์กฐ๊ฑด
    • ๋™์‹œ์„ฑ์ˆ˜์ค€: 300
    • ๋Ÿฌ๋‹ํƒ€์ž„: 30s

# HTTP ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ

http performance

๊ณ ์„ฑ๋Šฅ HTTPํŒŒ์„œ์˜ ๋„์›€์„ ๋ฐ›๋Š” asyncio๋Š” ๋™์ผํ•œ HTTPํŒŒ์„œ๋ฅผ ์ด์šฉํ•˜๋Š” nodejs๋ณด๋‹ค ๋น ๋ฅด๋‹ค. ์‹ฌ์ง€์–ด uvloop๋ฅผ ํƒ‘์žฌํ•  ๊ฒฝ์šฐ, nodejs์˜ ์•ฝ 2๋ฐฐ, Go์™€ ๋น„์Šทํ•œ ์ˆ˜์ค€์˜ ํผํฌ๋จผ์Šค๋ฅผ ๋ณด์—ฌ์ฃผ๋ฉฐ ์„œ๋น„์Šค ํ’ˆ์งˆ์€ ๋งค์šฐ ์šฐ์ˆ˜ํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

httptools ๊ธฐ๋ฐ˜ ์„œ๋ฒ„๋Š” ๋‹ค๋ฅธ ๊ตฌํ˜„๊ณผ ๋‹ฌ๋ฆฌ ๋ผ์šฐํŒ… ๋กœ์ง์„ ํฌํ•จํ•˜์ง€ ์•Š์•„ ๋งค์šฐ ๋ฏธํกํ•˜๋‚˜, ํ•ด๋‹น ๋ฒค์น˜ ๋งˆํฌ๋Š” ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ ๋œ ํ”„๋กœํ† ์ฝœ๋กœ uvloop๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋น ๋ฅผ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค. ํ•ด๋‹น ๋ฒค์น˜๋งˆํฌ์— ์˜๊ฐ์„ ๋ฐ›์•„ ํƒ„์ƒํ•œ Python ์›นํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋ฐ”๋กœ Sanic์ด๋‹ค.

aiohttp

aiohttp๋Š” ๋น„๋™๊ธฐ HTTP ์„œ๋ฒ„๋ฅผ asyncio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‚˜, HTTP parser๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์˜€๋‹ค. ํ•ด๋‹น ๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด, Nginx ์šฉ์œผ๋กœ ๊ฐœ๋ฐœ ๋œ nodejs HTTP ํŒŒ์„œ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ httptools๋ฅผ ์ด์šฉํ•˜์˜€๋‹ค.

# ๋ ˆํผ๋Ÿฐ์Šค

Last Updated: 7/5/2019, 8:38:55 AM