Runtime: CoreCLR gagal berjalan ketika mlock tidak tersedia

Dibuat pada 25 Jun 2018  ·  3Komentar  ·  Sumber: dotnet/runtime

CoreCLR menggunakan mlock selama startup dan gagal jika mlock gagal dengan EPERM . Secara umum, itu tidak masalah.

Namun, banyak distro Linux mulai menggunakan systemd-nspawn untuk membuat kode. Ini menciptakan chroot di mana program memiliki kemampuan terbatas. Secara khusus mereka tidak memiliki CAP_IPC_LOCK , yang berarti mereka tidak dapat menggunakan mlock .

Ketika mlock tidak bekerja, coreclr gagal untuk memulai. Ini muncul di strace sebagai sesuatu seperti:

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

Akibatnya, ini pada dasarnya tidak memungkinkan untuk membangun coreclr di beberapa sistem pembangunan distribusi Linux.

area-PAL-coreclr os-linux

Komentar yang paling membantu

mlock diperlukan untuk perilaku yang tepat dari fungsi FlushProcessWriteBuffers PAL yang sangat penting untuk memastikan penangguhan runtime yang andal untuk GC. Lihat https://github.com/dotnet/coreclr/blob/e6ebea25bea93eb4ec07cbd5003545c4805886a8/src/pal/src/thread/process.cpp#L3095 -L3098 untuk penjelasan alasannya.
Pada Linux 4.3 dan yang lebih tinggi, ada syscall sys_membarrier yang dapat kita gunakan sebagai mekanisme alternatif untuk mengimplementasikan FlushProcessWriteBuffers. Masalah dotnet/runtime#4501 melacak itu. @sdmaclea mencoba mengimplementasikannya dan mengujinya di ARM64 . Dia telah menemukan bahwa kinerjanya sangat buruk dan waktu menjalankan pengujian ~11000 coreclr kami sekitar 50% lebih lama. Namun, tidak ada pengujian yang dilakukan pada perangkat keras lain, jadi tidak jelas apakah masalah kinerja khusus ARM64 atau masalah keseluruhan.
Yang cukup menarik, saya baru saja menemukan artikel berikut yang menjelaskan masalah kinerja dengan sys_membarrier: https://lttng.org/blog/2018/01/15/membarrier-system-call-performance-and-userspace-rcu/. Alasannya adalah syscall secara internal menunggu hingga semua utas yang berjalan pada sistem melewati sakelar konteks, yang dapat memakan waktu puluhan milidetik. Tetapi kabar baiknya yang disebutkan dalam artikel ini adalah bahwa mulai dengan Linux 4.14, ada flag baru yang dapat diteruskan ke sys_membarrier syscall dan membuatnya menggunakan IPI untuk mengimplementasikan semantik penghalang memori. Dan itu jauh lebih cepat. Jadi kita harus mencobanya.

Semua 3 komentar

cc @tmds @alucryd

Lihat https://github.com/dotnet/source-build/issues/285#issuecomment -399949984 dan https://github.com/rpm-software-management/mock/issues/186 untuk beberapa contoh di mana ini memukul beberapa membangun

mlock diperlukan untuk perilaku yang tepat dari fungsi FlushProcessWriteBuffers PAL yang sangat penting untuk memastikan penangguhan runtime yang andal untuk GC. Lihat https://github.com/dotnet/coreclr/blob/e6ebea25bea93eb4ec07cbd5003545c4805886a8/src/pal/src/thread/process.cpp#L3095 -L3098 untuk penjelasan alasannya.
Pada Linux 4.3 dan yang lebih tinggi, ada syscall sys_membarrier yang dapat kita gunakan sebagai mekanisme alternatif untuk mengimplementasikan FlushProcessWriteBuffers. Masalah dotnet/runtime#4501 melacak itu. @sdmaclea mencoba mengimplementasikannya dan mengujinya di ARM64 . Dia telah menemukan bahwa kinerjanya sangat buruk dan waktu menjalankan pengujian ~11000 coreclr kami sekitar 50% lebih lama. Namun, tidak ada pengujian yang dilakukan pada perangkat keras lain, jadi tidak jelas apakah masalah kinerja khusus ARM64 atau masalah keseluruhan.
Yang cukup menarik, saya baru saja menemukan artikel berikut yang menjelaskan masalah kinerja dengan sys_membarrier: https://lttng.org/blog/2018/01/15/membarrier-system-call-performance-and-userspace-rcu/. Alasannya adalah syscall secara internal menunggu hingga semua utas yang berjalan pada sistem melewati sakelar konteks, yang dapat memakan waktu puluhan milidetik. Tetapi kabar baiknya yang disebutkan dalam artikel ini adalah bahwa mulai dengan Linux 4.14, ada flag baru yang dapat diteruskan ke sys_membarrier syscall dan membuatnya menggunakan IPI untuk mengimplementasikan semantik penghalang memori. Dan itu jauh lebih cepat. Jadi kita harus mencobanya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat