Runtime: рдХреЛрд░рд╕реАрдПрд▓рдЖрд░ рдЪрд▓рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рдЬрдм рдПрдорд▓реЙрдХ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реЛрддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 25 рдЬреВрди 2018  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: dotnet/runtime

CoreCLR рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЗ рджреМрд░рд╛рди mlock рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ mlock рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ $# EPERM рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрдИ рд▓рд┐рдирдХреНрд╕ рд╡рд┐рддрд░рдг рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП systemd-nspawn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдХреНрд░реЛрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рд╕реАрдорд┐рдд рдХреНрд╖рдорддрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рдкрд╛рд╕ CAP_IPC_LOCK рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡реЗ mlock рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЬрдм 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

рдирддреАрдЬрддрди, рдпрд╣ рдХреБрдЫ рд▓рд┐рдирдХреНрд╕ рд╡рд┐рддрд░рдг рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рдХреЛрд░рдХреНрд▓рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред

area-PAL-coreclr os-linux

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

FlushProcessWriteBuffers PAL рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрдЪрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП mlock рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ GC рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░рдирдЯрд╛рдЗрдо рдирд┐рд▓рдВрдмрди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдХрд╛рд░рдг рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП https://github.com/dotnet/coreclr/blob/e6ebea25bea93eb4ec07cbd5003545c4805886a8/src/pal/src/thread/process.cpp#L3095 -L3098 рджреЗрдЦреЗрдВред
Linux 4.3 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдкрд░, рдПрдХ sys_membarrier syscall рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо FlushProcessWriteBuffers рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрдВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╢реНрдпреВ рдбреЙрдЯрдиреЗрдЯ/рд░рдирдЯрд╛рдЗрдо#4501 рдЙрд╕реЗ рдЯреНрд░реИрдХ рдХрд░ рд░рд╣рд╛ рд╣реИред @sdmaclea рдиреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ ARM64 рдкрд░ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦрд░рд╛рдм рдерд╛ рдФрд░ рд╣рдорд╛рд░реЗ ~11000 рдХреЛрд░рдХреНрд▓рд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдЪрд▓рдиреЗ рдХрд╛ рд╕рдордп рд▓рдЧрднрдЧ 50% рдЕрдзрд┐рдХ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдиреНрдп рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдХреЛрдИ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛ ARM64 рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ рдпрд╛ рд╕рдордЧреНрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИред
рджрд┐рд▓рдЪрд╕реНрдк рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдореИрдВрдиреЗ sys_membarrier рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦ рдХреА рдЦреЛрдЬ рдХреА рд╣реИ: https://lttng.org/blog/2018/01/15/membarrier-system-call-performance-and-userspace-rcu/ред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ syscall рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЪрд▓ рд░рд╣реЗ рд╕рднреА рдереНрд░реЗрдб рдПрдХ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рд╕реЗ рди рдЧреБрдЬрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рджрд╕рд┐рдпреЛрдВ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рд▓рд┐рдирдХреНрд╕ 4.14 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рдПрдХ рдирдпрд╛ рдзреНрд╡рдЬ рд╣реИ рдЬрд┐рд╕реЗ sys_membarrier syscall рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕реНрдореГрддрд┐ рдмрд╛рдзрд╛ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдИрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдмрд╣реБрдд рддреЗрдЬ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рдЖрдЬрдорд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

cc @tmds @alucryd

рджреЗрдЦреЗрдВ https://github.com/dotnet/source-build/issues/285#issuecomment -399949984 рдФрд░ https://github.com/rpm-software-management/mock/issues/186 рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рдпрд╣ рдХреБрдЫ рд╣рд┐рдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ рдмрдирд╛рддрд╛

FlushProcessWriteBuffers PAL рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрдЪрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП mlock рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ GC рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░рдирдЯрд╛рдЗрдо рдирд┐рд▓рдВрдмрди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдХрд╛рд░рдг рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП https://github.com/dotnet/coreclr/blob/e6ebea25bea93eb4ec07cbd5003545c4805886a8/src/pal/src/thread/process.cpp#L3095 -L3098 рджреЗрдЦреЗрдВред
Linux 4.3 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдкрд░, рдПрдХ sys_membarrier syscall рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо FlushProcessWriteBuffers рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрдВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╢реНрдпреВ рдбреЙрдЯрдиреЗрдЯ/рд░рдирдЯрд╛рдЗрдо#4501 рдЙрд╕реЗ рдЯреНрд░реИрдХ рдХрд░ рд░рд╣рд╛ рд╣реИред @sdmaclea рдиреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ ARM64 рдкрд░ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦрд░рд╛рдм рдерд╛ рдФрд░ рд╣рдорд╛рд░реЗ ~11000 рдХреЛрд░рдХреНрд▓рд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдЪрд▓рдиреЗ рдХрд╛ рд╕рдордп рд▓рдЧрднрдЧ 50% рдЕрдзрд┐рдХ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдиреНрдп рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдХреЛрдИ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛ ARM64 рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ рдпрд╛ рд╕рдордЧреНрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИред
рджрд┐рд▓рдЪрд╕реНрдк рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдореИрдВрдиреЗ sys_membarrier рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦ рдХреА рдЦреЛрдЬ рдХреА рд╣реИ: https://lttng.org/blog/2018/01/15/membarrier-system-call-performance-and-userspace-rcu/ред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ syscall рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЪрд▓ рд░рд╣реЗ рд╕рднреА рдереНрд░реЗрдб рдПрдХ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рд╕реЗ рди рдЧреБрдЬрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рджрд╕рд┐рдпреЛрдВ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рд▓рд┐рдирдХреНрд╕ 4.14 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рдПрдХ рдирдпрд╛ рдзреНрд╡рдЬ рд╣реИ рдЬрд┐рд╕реЗ sys_membarrier syscall рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕реНрдореГрддрд┐ рдмрд╛рдзрд╛ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдИрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдмрд╣реБрдд рддреЗрдЬ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рдЖрдЬрдорд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

v0l picture v0l  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

aggieben picture aggieben  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

matty-hall picture matty-hall  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jchannon picture jchannon  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ilmax picture ilmax  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ