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