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
Jawaban:
Masalahnya disebabkan oleh
TasksMax
atribut systemd. Itu diperkenalkan di systemd 228 dan memanfaatkan subsistem pid cgroups, yang diperkenalkan di kernel linux 4.3. Batasan tugas512
dengan demikian diaktifkan di systemd jika kernel 4.3 atau yang lebih baru berjalan. Fitur diumumkan di sini dan diperkenalkan dalam permintaan tarikan ini dan nilai-nilai default ditetapkan oleh permintaan tarikan ini . Setelah memutakhirkan kernel saya ke 4.3,systemctl status docker
menampilkanTasks
baris:Pengaturan
TasksMax=infinity
di[Service]
bagiandocker.service
perbaikan masalah.docker.service
biasanya masuk/usr/share/systemd/system
, tetapi juga bisa dimasukkan / disalin/etc/systemd/system
agar tidak ditimpa oleh manajer paket.Sebuah permintaan tarik meningkat
TasksMax
untuk buruh pelabuhan misalnya systemd file, dan laporan bug Arch Linux berusaha untuk mencapai hal yang sama untuk paket. Ada beberapa diskusi tambahan yang terjadi di Arch Linux Forum dan dalam laporan bug Arch Linux tentang lxc .DefaultTasksMax
dapat digunakan di[Manager]
bagian dalam/etc/systemd/system.conf
(atau/etc/systemd/user.conf
untuk layanan yang dijalankan pengguna) untuk mengontrol nilai default untukTasksMax
.Systemd juga menerapkan batas untuk program yang dijalankan dari shell-login. Default ini untuk
4096
per pengguna (akan ditingkatkan menjadi12288
) dan dikonfigurasikan sepertiUserTasksMax
pada[Login]
bagian/etc/systemd/logind.conf
.sumber
/lib/systemd/system/docker.service
dalam pengujian Debian saya.systemctl set-property docker.service TasksMax=4096
akan mengatur properti untuk layanan yang sedang berjalan dan bertahan pengaturan untuk reboot berikutnya di tempat yang benar untuk instalasi buruh pelabuhan yang dimaksud./etc/systemd/system/docker.service.d/50-TasksMax.conf
Ubuntu 16), Anda harus menjalankannyasystemctl daemon-reload
. Melakukansudo service docker restart
TIDAK akan berhasil.Jawaban cdauth benar, tetapi ada detail lain untuk ditambahkan.
Pada sistem Ubuntu 16.04 saya dengan systemd 229 dan kernel 4.3, batas 512 pid diberlakukan pada cakupan sesi secara default bahkan ketika UserTasksMax diatur ke yang baru, peningkatan default 12288. Jadi, setiap sesi sesi pengguna dibatasi hingga 512 utas.
Satu-satunya cara saya menemukan untuk menghapus batas itu untuk set
DefaultTasksMax=unlimited
di/etc/systemd/system.conf
dansystemctl daemon-reexec
(atau reboot).Anda dapat memeriksa apakah ini terjadi dengan mengeluarkan
systemctl status
, memilih cakupan sesi, dancat /sys/fs/cgroup/pids/user.slice/user-${UID}.slice/session-FOO.scope/pids.max
.sumber
@reboot lxc-autostart
ke crontab Anda untuk melakukan autostart pada saat boot, dan Anda tiba-tiba mendapatkan wadah yang lumpuh setelah reboot.Setelah membaca utas ini .
Solusi ini bekerja untuk saya:
docker -d --exec-opt native.cgroupdriver=cgroupfs
. Saya sebenarnya menambahkannya keOPTIONS
dalam/etc/sysconfig/docker
...sumber