Saya menjalankan server buruh pelabuhan di Arch Linux (kernel 4.3.3-2) dengan beberapa kontainer. Sejak reboot terakhir saya, baik server docker dan program acak di dalam wadah macet dengan pesan tentang tidak dapat membuat utas, atau (lebih jarang) melakukan fork. Pesan kesalahan spesifik berbeda tergantung pada program, tetapi sebagian besar dari mereka tampaknya menyebutkan kesalahan spesifik Resource temporarily unavailable
. Lihat di akhir posting ini untuk beberapa contoh pesan kesalahan.
Sekarang ada banyak orang yang memiliki pesan kesalahan ini, dan banyak tanggapan terhadap mereka. Apa yang benar-benar membuat frustasi adalah bahwa semua orang tampaknya berspekulasi bagaimana masalah ini dapat diselesaikan, tetapi tidak ada yang menunjukkan bagaimana mengidentifikasi penyebab dari berbagai kemungkinan masalah yang ada.
Saya telah mengumpulkan 5 kemungkinan penyebab kesalahan ini dan cara memverifikasi bahwa mereka tidak ada di sistem saya:
- Ada batasan seluruh sistem pada jumlah utas yang dikonfigurasikan dalam
/proc/sys/kernel/threads-max
( sumber ). Dalam kasus saya ini diatur ke60613
. - Setiap utas membutuhkan ruang di tumpukan. Batas ukuran tumpukan dikonfigurasikan menggunakan
ulimit -s
( sumber ). Batas untuk shell saya dulu8192
, tapi saya telah meningkat dengan meletakkan* soft stack 32768
ke dalam/etc/security/limits.conf
, sehinggaulimit -s
sekarang kembali32768
. Saya juga telah meningkat untuk proses buruh pelabuhan dengan menempatkanLimitSTACK=33554432
ke dalam/etc/systemd/system/docker.service
( sumber , dan saya memverifikasi bahwa batas berlaku dengan melihat ke dalam/proc/<pid of docker>/limits
dan dengan menjalankanulimit -s
dalam sebuah wadah buruh pelabuhan. - Setiap utas membutuhkan memori. Batas memori virtual dikonfigurasi menggunakan
ulimit -v
. Di sistem saya diatur keunlimited
, dan 80% dari 3 GB memori saya bebas. - Ada batasan jumlah proses yang digunakan
ulimit -u
. Thread dihitung sebagai proses dalam hal ini ( sumber ). Pada sistem saya, batasnya diatur ke30306
, dan untuk daemon buruh pelabuhan dan di dalam wadah buruh pelabuhan, batasnya adalah1048576
. Jumlah utas yang saat ini berjalan dapat ditemukan dengan menjalankanls -1d /proc/*/task/* | wc -l
atau dengan menjalankanps -elfT | wc -l
( sumber ). Di sistem saya mereka berada di antara700
dan800
. - Ada batasan jumlah file terbuka, yang menurut beberapa sumber juga relevan saat membuat utas. Batas tersebut dikonfigurasi menggunakan
ulimit -n
. Di sistem saya dan di dalam buruh pelabuhan, batasnya diatur ke1048576
. Jumlah file terbuka dapat ditemukan menggunakanlsof | wc -l
( sumber ), di sistem saya ini tentang30000
.
Sepertinya sebelum reboot terakhir saya menjalankan kernel 4.2.5-1, sekarang saya menjalankan 4.3.3-2. Downgrade ke 4.2.5-1 memperbaiki semua masalah. Posting lain yang menyebutkan masalahnya adalah ini dan ini . Saya telah membuka laporan bug untuk Arch Linux .
Apa yang telah berubah di kernel yang dapat menyebabkan ini?
Berikut ini beberapa contoh pesan kesalahan:
Crash dump was written to: erl_crash.dump
Failed to create aux thread
Jan 07 14:37:25 edeltraud docker[30625]: runtime/cgo: pthread_create failed: Resource temporarily unavailable
dpkg: unrecoverable fatal error, aborting:
fork failed: Resource temporarily unavailable
E: Sub-process /usr/bin/dpkg returned an error code (2)
test -z "/usr/include" || /usr/sbin/mkdir -p "/tmp/lib32-popt/pkg/lib32-popt/usr/include"
/bin/sh: fork: retry: Resource temporarily unavailable
/usr/bin/install -c -m 644 popt.h '/tmp/lib32-popt/pkg/lib32-popt/usr/include'
test -z "/usr/share/man/man3" || /usr/sbin/mkdir -p "/tmp/lib32-popt/pkg/lib32-popt/usr/share/man/man3"
/bin/sh: fork: retry: Resource temporarily unavailable
/bin/sh: fork: retry: No child processes
/bin/sh: fork: retry: Resource temporarily unavailable
/bin/sh: fork: retry: No child processes
/bin/sh: fork: retry: No child processes
/bin/sh: fork: retry: Resource temporarily unavailable
/bin/sh: fork: retry: Resource temporarily unavailable
/bin/sh: fork: retry: No child processes
/bin/sh: fork: Resource temporarily unavailable
/bin/sh: fork: Resource temporarily unavailable
make[3]: *** [install-man3] Error 254
Jan 07 11:04:39 edeltraud docker[780]: time="2016-01-07T11:04:39.986684617+01:00" level=error msg="Error running container: [8] System error: fork/exec /proc/self/exe: resource temporarily unavailable"
[Wed Jan 06 23:20:33.701287 2016] [mpm_event:alert] [pid 217:tid 140325422335744] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread