Instagram์—์„œ ์‚ฌ์šฉํ•˜๋Š” CPython์˜ ํฌํฌ์ธ Facebook ์˜คํ”ˆ ์†Œ์Šค Cinder

Facebook์€ Python ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ์ฃผ์š” ์ฐธ์กฐ ๊ตฌํ˜„์ธ CPython 3.8.5์˜ ํฌํฌ์ธ Project Cinder์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ณต๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. Cinder๋Š” Facebook์˜ ํ”„๋กœ๋•์…˜ ์ธํ”„๋ผ์—์„œ Instagram์„ ๊ฐ•ํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•œ ์ตœ์ ํ™” ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๋Š” ์ค€๋น„๋œ ์ตœ์ ํ™”๋ฅผ ๊ธฐ๋ณธ CPython ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์ด์‹ํ•  ๊ฐ€๋Šฅ์„ฑ์„ ๋…ผ์˜ํ•˜๊ณ  CPython ์„ฑ๋Šฅ ๊ฐœ์„ ๊ณผ ๊ด€๋ จ๋œ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์Šค๋ถ์€ Cinder๋ฅผ ๋ณ„๋„์˜ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ ํ˜•ํƒœ๋กœ ์ง€์›ํ•  ๊ณ„ํš์ด ์—†์œผ๋ฉฐ, ์ฝ”๋“œ๋Š” ์ถ”๊ฐ€์ ์ธ ์ •๋ฆฌ์™€ ๋ฌธ์„œํ™” ์—†์ด ํšŒ์‚ฌ ์ธํ”„๋ผ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ˜•ํƒœ๋กœ ์ œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋˜ํ•œ Cinder๋ฅผ CPython์˜ ๋Œ€์•ˆ์œผ๋กœ ํ™๋ณดํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์˜ ์ฃผ์š” ๋ชฉํ‘œ๋Š” CPython ์ž์ฒด๋ฅผ ๊ฐœ์„ ํ•˜๋ ค๋Š” ์š•๊ตฌ์ž…๋‹ˆ๋‹ค.

Cinder ์ฝ”๋“œ๋Š” ์ƒ๋‹นํžˆ ์•ˆ์ •์ ์ด๊ณ  ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ๋œ ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ํ™•์ธ๋˜๋ฉด Facebook์ด ์™ธ๋ถ€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๋ฐ ํ’€ ์š”์ฒญ์— ์‘๋‹ตํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋ณด์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๋ฅผ ์ง์ ‘ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— Facebook์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€์˜ ๊ฑด์„ค์ ์ธ ํ˜‘๋ ฅ์„ ๋ฐฐ์ œํ•˜์ง€ ์•Š์œผ๋ฉฐ Cinder๋ฅผ ๋”์šฑ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด๋‚˜ ์ค€๋น„๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ CPython์˜ ์ฃผ์š” ๋ถ€๋ถ„์œผ๋กœ ์ „์†กํ•˜๋Š” ์†๋„๋ฅผ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ๋…ผ์˜ํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Cinder์— ๊ตฌํ˜„๋œ ์ฃผ์š” ์ตœ์ ํ™”:

  • ๋ฐ”์ดํŠธ์ฝ”๋“œ("์„€๋„์šฐ ๋ฐ”์ดํŠธ์ฝ”๋“œ")์˜ ์ธ๋ผ์ธ ์บ์‹ฑ. ์ด ๋ฐฉ๋ฒ•์˜ ํ•ต์‹ฌ์€ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ opcode๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ƒํ™ฉ์„ ์‹๋ณ„ํ•˜๊ณ  ์ด๋Ÿฌํ•œ opcode๋ฅผ ๋” ๋น ๋ฅธ ํŠน์ˆ˜ ์˜ต์…˜(์˜ˆ: ์ž์ฃผ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜ ๋Œ€์ฒด)์œผ๋กœ ๋™์ ์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์—ด์ •์ ์ธ ์ฝ”๋ฃจํ‹ด ํ‰๊ฐ€. ์ฆ‰์‹œ ์ฒ˜๋ฆฌ๋˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๊ฒฝ์šฐ(await๋กœ ์ธํ•ด wait๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜๊ฐ€ ๋” ์ผ์ฐ return ๋ฌธ์— ๋„๋‹ฌํ•จ) ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋Š” ์ฝ”๋ฃจํ‹ด์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. async/await๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” Facebook ์ฝ”๋“œ์—์„œ๋Š” ์ตœ์ ํ™”๋กœ ์ธํ•ด ์†๋„๊ฐ€ ์•ฝ 5% ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ๋ณ„ ๋ฉ”์„œ๋“œ ๋ฐ ๊ธฐ๋Šฅ ์ˆ˜์ค€์—์„œ ์„ ํƒ์  JIT ์ปดํŒŒ์ผ(ํ•œ ๋ฒˆ์— ๋ฉ”์„œ๋“œ) "-X jit" ์˜ต์…˜ ๋˜๋Š” PYTHONJIT=1 ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ํ™œ์„ฑํ™”๋˜๋ฉฐ ๋งŽ์€ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์†๋„๋ฅผ 1.5-4๋ฐฐ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. JIT ์ปดํŒŒ์ผ์€ ์ž์ฃผ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์—๋งŒ ๊ด€๋ จ๋˜๋ฏ€๋กœ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์—๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์ธํ•ด ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์†๋„๊ฐ€ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์˜ต์…˜ "-X jit-list-file=/path/to/jitlist.txt" ๋˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ "PYTHONJITLISTFILE=/path/to/jitlist.txt"๋ฅผ ํ†ตํ•ด JIT๋ฅผ ์ˆ˜ํ–‰ํ•  ํ•จ์ˆ˜ ๋ชฉ๋ก์ด ์žˆ๋Š” ํŒŒ์ผ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ฒฝ๋กœ ํ˜•์‹ .to.module:funcname ๋˜๋Š” path.to.module:ClassName.method_name). JIT๋ฅผ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋Šฅ ๋ชฉ๋ก์€ ํ”„๋กœํŒŒ์ผ๋ง ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ๊ฒฐ์ •๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋นˆ๋„์— ๋Œ€ํ•œ ๋‚ด๋ถ€ ๋ถ„์„์„ ๋ฐ”ํƒ•์œผ๋กœ ๋™์  JIT ์ปดํŒŒ์ผ์— ๋Œ€ํ•œ ์ง€์›์ด ์˜ˆ์ƒ๋˜์ง€๋งŒ ์ธ์Šคํƒ€๊ทธ๋žจ์˜ ์‹คํ–‰ ํ”„๋กœ์„ธ์Šค ํŠน์„ฑ์„ ๊ณ ๋ คํ•˜๋ฉด ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ๋Š” JIT ์ปดํŒŒ์ผ์ด Facebook์—๋„ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

    JIT๋Š” ๋จผ์ € Python ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ HIR(๊ณ ์ˆ˜์ค€ ์ค‘๊ฐ„ ํ‘œํ˜„)๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Python ๋ฐ”์ดํŠธ์ฝ”๋“œ์™€ ์ƒ๋‹นํžˆ ์œ ์‚ฌํ•˜์ง€๋งŒ ์Šคํƒ ๊ธฐ๋ฐ˜ ๊ฐ€์ƒ ๋จธ์‹  ๋Œ€์‹  ๋ ˆ์ง€์Šคํ„ฐ ๊ธฐ๋ฐ˜ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ ์œ ํ˜• ์ •๋ณด ๋ฐ ์ถ”๊ฐ€ ์ •๋ณด๋„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์— ์ค‘์š”ํ•œ ์„ธ๋ถ€ ์ •๋ณด(์˜ˆ: ์ฐธ์กฐ ๊ณ„์‚ฐ) ๊ทธ๋Ÿฐ ๋‹ค์Œ HIR์€ SSA(์ •์  ๋‹จ์ผ ํ• ๋‹น) ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜๋˜๊ณ  ์ฐธ์กฐ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ์™€ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ๋ คํ•˜๋Š” ์ตœ์ ํ™” ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด์— ๊ฐ€๊นŒ์šด LIR(์ €์ˆ˜์ค€ ์ค‘๊ฐ„ ํ‘œํ˜„)์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. LIR ๊ธฐ๋ฐ˜ ์ตœ์ ํ™”์˜ ๋˜ ๋‹ค๋ฅธ ๋‹จ๊ณ„ ํ›„์—๋Š” asmjit ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด์…ˆ๋ธ”๋ฆฌ ์ง€์นจ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์—„๊ฒฉํ•œ ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์—๋Š” ์„ธ ๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. Type StrictModule. ๋ชจ๋“ˆ ์‹คํ–‰์ด ํ•ด๋‹น ๋ชจ๋“ˆ ์™ธ๋ถ€์˜ ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ •์  ๋ถ„์„๊ธฐ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์ด strict ๋ชจ๋“œ(์ฝ”๋“œ๋Š” "import __strict__" ์ง€์ •)์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๋‹ค๋ฅธ ๋ชจ๋“ˆ๊ณผ์˜ ๊ต์ฐจ ๋ถ€๋ถ„์ด ์—†๋Š”์ง€ ํ™•์ธํ•˜๊ณ , strict ๋ชจ๋“ˆ์„ StrictModule ๊ฐ์ฒด๋กœ sys.modules์— ๋กœ๋“œํ•˜๋Š” ๋ชจ๋“ˆ ๋กœ๋”์ž…๋‹ˆ๋‹ค.
  • ์ •์  Python์€ ์œ ํ˜• ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ JIT ์ปดํŒŒ์ผ ๋•๋ถ„์— ๋” ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋˜๋Š” ์œ ํ˜•๋ณ„ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์‹คํ—˜์ ์ธ ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ปดํŒŒ์ผ๋Ÿฌ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ…Œ์ŠคํŠธ์—์„œ Static Python๊ณผ JIT์˜ ์กฐํ•ฉ์€ ํ‘œ์ค€ CPython์— ๋น„ํ•ด ์ตœ๋Œ€ 7๋ฐฐ์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋งŽ์€ ์ƒํ™ฉ์—์„œ ๊ฒฐ๊ณผ๋Š” MyPyC ๋ฐ Cython ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ๊ฒƒ์œผ๋กœ ์ถ”์ •๋ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€