ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด Rust 1.75 ๋ฐ unikernel Hermit 0.6.7 ์ถœ์‹œ

Mozilla ํ”„๋กœ์ ํŠธ์— ์˜ํ•ด ์„ค๋ฆฝ๋˜์—ˆ์ง€๋งŒ ํ˜„์žฌ๋Š” ๋…๋ฆฝ์ ์ธ ๋น„์˜๋ฆฌ ์กฐ์ง์ธ Rust Foundation์˜ ํ›„์›์œผ๋กœ ๊ฐœ๋ฐœ๋œ Rust 1.75 ๋ฒ”์šฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ์ถœ์‹œ๊ฐ€ ๋ฐœํ‘œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์–ธ์–ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์— ์ค‘์ ์„ ๋‘๊ณ  ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ ๋ฐ ๋Ÿฐํƒ€์ž„(๋Ÿฐํƒ€์ž„์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ธฐ๋ณธ ์ดˆ๊ธฐํ™” ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ๋กœ ์ถ•์†Œ๋จ)์˜ ์‚ฌ์šฉ์„ ํ”ผํ•˜๋ฉด์„œ ๋†’์€ ์ž‘์—… ๋ณ‘๋ ฌ์„ฑ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Rust์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์€ ํฌ์ธํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ๋•Œ ๊ฐœ๋ฐœ์ž๋ฅผ ์˜ค๋ฅ˜๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ํ•ด์ œ๋œ ํ›„ ์•ก์„ธ์Šค, null ํฌ์ธํ„ฐ ์—ญ์ฐธ์กฐ, ๋ฒ„ํผ ์˜ค๋ฒ„๋Ÿฐ ๋“ฑ๊ณผ ๊ฐ™์€ ์ €์ˆ˜์ค€ ๋ฉ”๋ชจ๋ฆฌ ์ฒ˜๋ฆฌ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐฐํฌ, ๋นŒ๋“œ ์ œ๊ณต ๋ฐ ์ข…์†์„ฑ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ๋Š” Cargo ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. crates.io ์ €์žฅ์†Œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธ์ŠคํŒ…์„ ์œ„ํ•ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์ฐธ์กฐ ํ™•์ธ, ๊ฐœ์ฒด ์†Œ์œ ๊ถŒ ์ถ”์ , ๊ฐœ์ฒด ์ˆ˜๋ช…(๋ฒ”์œ„) ์ถ”์  ๋ฐ ์ฝ”๋“œ ์‹คํ–‰ ์ค‘ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค์˜ ์ •ํ™•์„ฑ ํ‰๊ฐ€๋ฅผ ํ†ตํ•ด Rust์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. Rust๋Š” ๋˜ํ•œ ์ •์ˆ˜ ์˜ค๋ฒ„ํ”Œ๋กœ์— ๋Œ€ํ•œ ๋ณดํ˜ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ , ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋ณ€์ˆ˜ ๊ฐ’์˜ ํ•„์ˆ˜ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋” ์ž˜ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถˆ๋ณ€ ์ฐธ์กฐ ๋ฐ ๋ณ€์ˆ˜ ๊ฐœ๋…์„ ์ ์šฉํ•˜๊ณ , ๊ฐ•๋ ฅํ•œ ์ •์  ์œ ํ˜• ์ง€์ •์„ ์ œ๊ณตํ•˜์—ฌ ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜๋ฅผ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ํ˜์‹ :

  • ๋น„๊ณต๊ฐœ ํŠน์„ฑ์— "async fn" ๋ฐ "->impl Trait" ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "->impl Trait"์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜๋ณต์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํŠน์„ฑ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. trait Container { fn items(&self) -> impl Iterator; } MyContainer์šฉ impl ์ปจํ…Œ์ด๋„ˆ { fn items(&self) -> impl Iterator { self.items.iter().cloned() } }

    "async fn"์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์„ฑ์„ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. trait HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // ๋‹ค์Œ์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. // fn fetch(&self, url: Url) -> impl Future; }

  • ํฌ์ธํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ”์ดํŠธ ์˜คํ”„์…‹์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•œ API๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฒ ์–ด ํฌ์ธํ„ฐ("*const T" ๋ฐ "*mut T")๋กœ ์ž‘์—…ํ•  ๋•Œ ํฌ์ธํ„ฐ์— ์˜คํ”„์…‹์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ์ด๋ฅผ ์œ„ํ•ด "::add(1)"์™€ ๊ฐ™์€ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ "size_of::()" ํฌ๊ธฐ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด API๋Š” ์ด ์ž‘์—…์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๋จผ์ € ์œ ํ˜•์„ "*const u8" ๋˜๋Š” "*mut u8"๋กœ ์บ์ŠคํŒ…ํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ”์ดํŠธ ์˜คํ”„์…‹์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
    • ํฌ์ธํ„ฐ::byte_add
    • ํฌ์ธํ„ฐ::byte_offset
    • ํฌ์ธํ„ฐ::byte_offset_from
    • ํฌ์ธํ„ฐ::byte_sub
    • ํฌ์ธํ„ฐ::wrapping_byte_add
    • ํฌ์ธํ„ฐ::wrapping_byte_offset
    • ํฌ์ธํ„ฐ::wrapping_byte_sub
  • Rustc ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ง€์†์ ์ธ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๋งํฌ ํ›„ ๋‹จ๊ณ„์—์„œ ์‹คํ–‰๋˜๊ณ  ์‚ฌ์ „ ์ค€๋น„๋œ ์‹คํ–‰ ํ”„๋กœํ•„์˜ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” BOLT ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. BOLT๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ์„ธ์„œ ์บ์‹œ๋ฅผ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด librustc_driver.so ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์˜ ๋ ˆ์ด์•„์›ƒ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์ปดํŒŒ์ผ๋Ÿฌ ์‹คํ–‰ ์†๋„๋ฅผ ์•ฝ 2% ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    LLVM์˜ ์ตœ์ ํ™” ํ’ˆ์งˆ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด "-Ccodegen-units=1" ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ Rustc ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜ํ–‰๋œ ํ…Œ์ŠคํŠธ์—์„œ๋Š” "-Ccodegen-units=1" ๋นŒ๋“œ์˜ ๊ฒฝ์šฐ ์„ฑ๋Šฅ์ด ์•ฝ 1.5% ์ฆ๊ฐ€ํ•œ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋œ ์ตœ์ ํ™”๋Š” x86_64-unknown-linux-gnu ํ”Œ๋žซํผ์— ๋Œ€ํ•ด์„œ๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

    ์•ž์„œ ์–ธ๊ธ‰ํ•œ ์ตœ์ ํ™”๋Š” Rust๋กœ ์ž‘์„ฑ๋œ Android ํ”Œ๋žซํผ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋นŒ๋“œ ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด Google์—์„œ ํ…Œ์ŠคํŠธํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Android๋ฅผ ๋นŒ๋“œํ•  ๋•Œ "-C codegen-units=1"์„ ์‚ฌ์šฉํ•˜๋ฉด ํˆดํ‚ท ํฌ๊ธฐ๊ฐ€ 5.5% ์ค„์–ด๋“ค๊ณ  ์„ฑ๋Šฅ์ด 1.8% ํ–ฅ์ƒ๋˜๋Š” ๋™์‹œ์— ํˆดํ‚ท ์ž์ฒด์˜ ๋นŒ๋“œ ์‹œ๊ฐ„์ด ๊ฑฐ์˜ ๋‘ ๋ฐฐ๋กœ ๋Š˜์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค.

    ๋งํฌ ํƒ€์ž„ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(โ€œ--gc-sectionsโ€)์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์ตœ๋Œ€ 1.9% ํ–ฅ์ƒ๋˜๊ณ , ๋งํฌ ํƒ€์ž„ ์ตœ์ ํ™”(LTO)๋Š” ์ตœ๋Œ€ 7.7%, ํ”„๋กœํ•„ ๊ธฐ๋ฐ˜ ์ตœ์ ํ™”(PGO)๋Š” ์ตœ๋Œ€ 19.8% ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์ตœ์ข…์ ์œผ๋กœ๋Š” BOLT ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ด ์ตœ์ ํ™”๋ฅผ ์ ์šฉํ•ด ๋นŒ๋“œ ์†๋„๋ฅผ 24.7%๊นŒ์ง€ ๋†’์ผ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, ํˆดํ‚ท ํฌ๊ธฐ๋Š” 10.9% ๋Š˜์–ด๋‚ฌ๋‹ค.

    ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด Rust 1.75 ๋ฐ unikernel Hermit 0.6.7 ์ถœ์‹œ

  • API์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ถ„์ด ์•ˆ์ •ํ™”๋œ ํŠน์„ฑ์˜ ๋ฉ”์„œ๋“œ ๋ฐ ๊ตฌํ˜„์„ ํฌํ•จํ•˜์—ฌ ์•ˆ์ •์ ์ธ ๋ฒ”์ฃผ๋กœ ์ด๋™๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ์›์ž*::from_ptr
    • ํŒŒ์ผ ์‹œ๊ฐ„
    • FileTimesExt
    • ํŒŒ์ผ::set_modified
    • ํŒŒ์ผ::set_times
    • IpAddr::to_canonical
    • Ipv6Addr::to_canonical
    • ์˜ต์…˜::as_slice
    • ์˜ต์…˜::as_mut_slice
    • ํฌ์ธํ„ฐ::byte_add
    • ํฌ์ธํ„ฐ::byte_offset
    • ํฌ์ธํ„ฐ::byte_offset_from
    • ํฌ์ธํ„ฐ::byte_sub
    • ํฌ์ธํ„ฐ::wrapping_byte_add
    • ํฌ์ธํ„ฐ::wrapping_byte_offset
    • ํฌ์ธํ„ฐ::wrapping_byte_sub
  • ์ƒ์ˆ˜ ๋Œ€์‹  ๋ชจ๋“  ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์„ ๊ฒฐ์ •ํ•˜๋Š” "const" ์†์„ฑ์€ ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • Ipv6Addr::to_ipv4_mapped
    • MaybeUninit::assume_init_read
    • MaybeUninit::์ œ๋กœํ™”๋จ
    • mem::ํŒ๋ณ„
    • ๋ฉ”๋ชจ๋ฆฌ::์ œ๋กœํ™”๋จ
  • ์„ธ ๋ฒˆ์งธ ์ˆ˜์ค€์˜ ์ง€์›์€ csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd ๋ฐ mipsel-unknown-netbsd ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ ์ˆ˜์ค€์—๋Š” ๊ธฐ๋ณธ ์ง€์›์ด ํฌํ•จ๋˜์ง€๋งŒ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ, ๊ณต์‹ ๋นŒ๋“œ ๊ฒŒ์‹œ ๋˜๋Š” ์ฝ”๋“œ ๋นŒ๋“œ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธ์€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, Rust ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ํŠน์ˆ˜ ์ปค๋„(unikernel)์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์ถ”๊ฐ€ ๊ณ„์ธต ์—†์ด ํ•˜์ดํผ๋ฐ”์ด์ € ๋˜๋Š” ๋ฒ ์–ด ํ•˜๋“œ์›จ์–ด ์œ„์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ์ž์ฒด ํฌํ•จ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” Hermit ํ”„๋กœ์ ํŠธ์˜ ์ƒˆ ๋ฒ„์ „์— ์ฃผ๋ชฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šด์˜ ์ฒด์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ๋˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ OS ์ปค๋„ ๋ฐ ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋ฌถ์ด์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ •์ ์œผ๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋Š” Apache 2.0 ๋ฐ MIT ๋ผ์ด์„ผ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. Rust, Go, Fortran, C ๋ฐ C++๋กœ ์ž‘์„ฑ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋…๋ฆฝ ์‹คํ–‰ํ˜• ์‹คํ–‰์„ ์œ„ํ•ด ์–ด์…ˆ๋ธ”๋ฆฌ๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” ๋˜ํ•œ QEMU ๋ฐ KVM์„ ์‚ฌ์šฉํ•˜์—ฌ Hermit์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ž์ฒด ๋ถ€ํŠธ๋กœ๋”๋ฅผ ๊ฐœ๋ฐœ ์ค‘์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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