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์ ๋น๋ํ๋ ๊ฒ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๊ฐ๋ฅํฉ๋๋ค.
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๋ฅผ ์ฌ์ฉํ๋๋ก ๋ง๋ญ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ํจ์ฌ ๋ ๋น ๋ฆ
๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์๋ํด์ผํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
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๋ฅผ ์ฌ์ฉํ๋๋ก ๋ง๋ญ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ํจ์ฌ ๋ ๋น ๋ฆ ๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์๋ํด์ผํฉ๋๋ค.