Runtime: mlock์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๋•Œ CoreCLR ์‹คํ–‰ ์‹คํŒจ

์— ๋งŒ๋“  2018๋…„ 06์›” 25์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dotnet/runtime

CoreCLR์€ ์‹œ์ž‘ํ•˜๋Š” ๋™์•ˆ mlock ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  mlock ๊ฐ€ EPERM ์™€ ํ•จ๊ป˜ ์‹คํŒจํ•˜๋ฉด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ Linux ๋ฐฐํฌํŒ์—์„œ ์ฝ”๋“œ ์ž‘์„ฑ์— systemd-nspawn ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ”„๋กœ๊ทธ๋žจ์— ์ œํ•œ๋œ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” chroot๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํŠนํžˆ CAP_IPC_LOCK ๊ฐ€ ์—†์œผ๋ฏ€๋กœ mlock ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

W mlock ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด coreclr์ด ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ strace ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbd542bb000
mlock(0x7fbd542bb000, 4096)       = -1 EPERM (Operation not permitted)
write(2, "Failed to initialize CoreCLR, HR"..., 49) = 49

๊ฒฐ๊ณผ์ ์œผ๋กœ ์ผ๋ถ€ Linux ๋ฐฐํฌ ๋นŒ๋“œ ์‹œ์Šคํ…œ์—์„œ coreclr์„ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

area-PAL-coreclr os-linux

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

mlock ๋Š” GC์— ๋Œ€ํ•œ ์•ˆ์ •์ ์ธ ๋Ÿฐํƒ€์ž„ ์ผ์‹œ ์ค‘๋‹จ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ FlushProcessWriteBuffers PAL ํ•จ์ˆ˜์˜ ์ ์ ˆํ•œ ๋™์ž‘์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด์œ ์— ๋Œ€ํ•œ ์„ค๋ช…์€ https://github.com/dotnet/coreclr/blob/e6ebea25bea93eb4ec07cbd5003545c4805886a8/src/pal/src/thread/process.cpp#L3095 -L3098์„ ์ฐธ์กฐํ•˜์„ธ์š”.
Linux 4.3 ์ด์ƒ์—๋Š” FlushProcessWriteBuffers๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€์ฒด ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” sys_membarrier ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ dotnet/runtime#4501์ด ์ด๋ฅผ ์ถ”์ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. @sdmaclea ๋Š” ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ๊ณ  ARM64์—์„œ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ์„ฑ๋Šฅ์ด ์ •๋ง ์ข‹์ง€ ์•Š์•˜๊ณ  ~11000๊ฐœ์˜ coreclr ํ…Œ์ŠคํŠธ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์ด ์•ฝ 50% ๋” ๊ธธ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ํ•˜๋“œ์›จ์–ด์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋Š” ์ˆ˜ํ–‰๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ARM64์—๋งŒ ํ•ด๋‹น๋˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์ „๋ฐ˜์ ์ธ ๋ฌธ์ œ์ธ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํฅ๋ฏธ๋กญ๊ฒŒ๋„ sys_membarrier์˜ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋‹ค์Œ ๋ฌธ์„œ๋ฅผ ๋ฐฉ๊ธˆ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. https://lttng.org/blog/2018/01/15/membarrier-system-call-performance-and-userspace-rcu/. ๊ทธ ์ด์œ ๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์‹œ์Šคํ…œ์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ˆ˜์‹ญ ๋ฐ€๋ฆฌ์ดˆ๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋Š” ์ปจํ…์ŠคํŠธ ์ „ํ™˜์„ ํ†ต๊ณผํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ธฐ์‚ฌ์—์„œ ์–ธ๊ธ‰ํ•œ ์ข‹์€ ์†Œ์‹์€ Linux 4.14๋ถ€ํ„ฐ sys_membarrier ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์žฅ๋ฒฝ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด IPI๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ํ›จ์”ฌ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  3 ๋Œ“๊ธ€

cc @tmds @alucryd

์ด๊ฒƒ์ด ์ผ๋ถ€ ํƒ€๊ฒฉ์„ ์ฃผ๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋Š” https://github.com/dotnet/source-build/issues/285#issuecomment -399949984 ๋ฐ https://github.com/rpm-software-management/mock/issues/186 ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๋นŒ๋“œ

mlock ๋Š” GC์— ๋Œ€ํ•œ ์•ˆ์ •์ ์ธ ๋Ÿฐํƒ€์ž„ ์ผ์‹œ ์ค‘๋‹จ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ FlushProcessWriteBuffers PAL ํ•จ์ˆ˜์˜ ์ ์ ˆํ•œ ๋™์ž‘์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด์œ ์— ๋Œ€ํ•œ ์„ค๋ช…์€ https://github.com/dotnet/coreclr/blob/e6ebea25bea93eb4ec07cbd5003545c4805886a8/src/pal/src/thread/process.cpp#L3095 -L3098์„ ์ฐธ์กฐํ•˜์„ธ์š”.
Linux 4.3 ์ด์ƒ์—๋Š” FlushProcessWriteBuffers๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€์ฒด ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” sys_membarrier ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ dotnet/runtime#4501์ด ์ด๋ฅผ ์ถ”์ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. @sdmaclea ๋Š” ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ๊ณ  ARM64์—์„œ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ์„ฑ๋Šฅ์ด ์ •๋ง ์ข‹์ง€ ์•Š์•˜๊ณ  ~11000๊ฐœ์˜ coreclr ํ…Œ์ŠคํŠธ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์ด ์•ฝ 50% ๋” ๊ธธ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ํ•˜๋“œ์›จ์–ด์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋Š” ์ˆ˜ํ–‰๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ARM64์—๋งŒ ํ•ด๋‹น๋˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์ „๋ฐ˜์ ์ธ ๋ฌธ์ œ์ธ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํฅ๋ฏธ๋กญ๊ฒŒ๋„ sys_membarrier์˜ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋‹ค์Œ ๋ฌธ์„œ๋ฅผ ๋ฐฉ๊ธˆ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. https://lttng.org/blog/2018/01/15/membarrier-system-call-performance-and-userspace-rcu/. ๊ทธ ์ด์œ ๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์‹œ์Šคํ…œ์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ˆ˜์‹ญ ๋ฐ€๋ฆฌ์ดˆ๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋Š” ์ปจํ…์ŠคํŠธ ์ „ํ™˜์„ ํ†ต๊ณผํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ธฐ์‚ฌ์—์„œ ์–ธ๊ธ‰ํ•œ ์ข‹์€ ์†Œ์‹์€ Linux 4.14๋ถ€ํ„ฐ sys_membarrier ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์žฅ๋ฒฝ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด IPI๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ํ›จ์”ฌ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

Timovzl picture Timovzl  ยท  3์ฝ”๋ฉ˜ํŠธ

jamesqo picture jamesqo  ยท  3์ฝ”๋ฉ˜ํŠธ

v0l picture v0l  ยท  3์ฝ”๋ฉ˜ํŠธ

bencz picture bencz  ยท  3์ฝ”๋ฉ˜ํŠธ

ilmax picture ilmax  ยท  3์ฝ”๋ฉ˜ํŠธ