Konu oluşturma, 4.3 çekirdekli “Kaynak geçici olarak kullanılamıyor” ile başarısız oluyor


39

Arch Linux'ta dock sunucusu çalıştırıyorum (çekirdek 4.3.3-2) birkaç kapsayıcılı. Son yeniden başlatmamdan beri, hem docker sunucusu hem de kapsayıcılardaki rastgele programlar, iş parçacığı oluşturulamaması ya da (daha az sıklıkta) çatalı olamayacağına dair bir mesajla çöküyor. Özel hata mesajı, programa bağlı olarak farklılık gösterir, ancak çoğu belirli hatadan söz ediyor gibi görünmektedir Resource temporarily unavailable. Bazı örnek hata mesajları için bu yazının sonuna bakın.

Şimdi bu hata mesajını alan birçok insan var ve onlara birçok cevap var. Gerçekten sinir bozucu olduğunu herkesin sorunu çözülecek nasıl spekülasyon gibi görünüyor, ama kimse nasıl işaret gibi görünüyor tanımlamak mevcut sorunun birçok olası nedenlerin hangisinin.

Hatanın bu 5 olası nedenini ve sistemimde bulunmadığını nasıl doğrulayacağımı topladım:

  1. /proc/sys/kernel/threads-max( Kaynak ) 'da konfigüre edilen iplik sayısında sistem çapında bir sınır vardır . Benim durumumda bu ayarlanır 60613.
  2. Her iş parçacığı yığında biraz yer tutar. Yığın büyüklüğü sınırı ulimit -s( kaynak ) kullanılarak yapılandırılır . Eskiden kabuğumun sınırı vardı 8192, ama * soft stack 32768içine koyarak arttırdım /etc/security/limits.conf, bu yüzden ulimit -sşimdi geri döndü 32768. Docker işlemi için bunu da LimitSTACK=33554432ekleyerek arttırdım /etc/systemd/system/docker.service( kaynak ve limanın bir docker konteynerinin içine bakarak /proc/<pid of docker>/limitsve ulimit -siçinde çalıştırarak limitin geçerli olduğunu doğruladım .
  3. Her iş parçacığı biraz hafıza alır. Bir sanal bellek sınırı kullanılarak yapılandırılır ulimit -v. Sistemimde ayarlanmış unlimitedve 3 GB'lık belleğimin% 80'i boş.
  4. Kullanılan işlem sayısının bir sınırı vardır ulimit -u. İplikler bu durumda süreçler olarak sayılır ( kaynak ). Sistemimde, sınır ayarlandı 30306ve liman işçisi arka plan programı ve liman işçisi konteynırları için sınır 1048576. Çalışmakta olan iş parçacığı sayısı çalıştırarak ls -1d /proc/*/task/* | wc -lveya çalıştırarak ps -elfT | wc -l( kaynak ) bulunabilir. Benim sistemimde 700ve arasındalar 800.
  5. Açık dosya sayısında bir sınırlama vardır; bunlar bazı kaynaklara göre de konu oluşturulurken de geçerlidir. Sınır kullanılarak yapılandırılır ulimit -n. Sistemimde ve docker'ın içinde, limit ayarlandı 1048576. Açık dosyaların sayısı lsof | wc -l( kaynak ) kullanılarak bulunabilir , sistemim hakkında 30000.

Görünüşe göre son yeniden başlatmadan önce çekirdek 4.2.5-1 çalıştırıyordum, şimdi 4.3.3-2 çalıştırıyorum. 4.2.5-1 seviyesine düşürülmesi tüm sorunları düzeltir. Sorun söz Diğer yayın verilmiştir bu ve bu . Arch Linux için bir hata raporu açtım .

Çekirdekte buna neden olabilecek neler değişti?


İşte bazı örnek hata mesajları:

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

1
Yakın zamanda 4.3 çekirdeğe yükselttiniz mi?
Roni Choudhury

Bu çok iyi mümkün. Neden?
cdauth,

1
Şaşırtıcı, ben 4.2.5-1 çekirdeğine düşürdüm ve her şey tekrar çalışıyor! Buna neyin neden olduğu ve 4.3 ile nasıl düzeltileceği hakkında bir fikriniz var mı?
cdauth

Buna neyin sebep olduğu hakkında hiçbir ipucu yok. Düzeltme yöntemim konuyla ilgili Arch Linux forum başlıklarının "SOLVED" :-P olarak işaretlenmesini bekliyor.
Roni Choudhury

1
Ben bile bir mükemmel istedi ve araştırılan soru olduğu için 1 vermedi aynı sorun var
Roy Truelove

Yanıtlar:


47

Soruna TasksMaxsystemd özniteliği neden olur . Sistem 228'de tanıtıldı ve linux çekirdeği 4.3'te tanıtılan grup pid alt sistemini kullandı. 512Böylece çekirdek 4.3 veya daha yenisi çalışıyorsa, görev sınırı sistemde etkindir. Özellik burada duyurulur ve bu çekme isteğinde tanıtılır ve varsayılan değerler bu çekme isteği tarafından belirlenir . Çekirdeğimi 4.3'e yükselttikten sonra systemctl status dockerbir Taskssatır görüntüler :

# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/etc/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2016-01-15 19:58:00 CET; 1min 52s ago
     Docs: https://docs.docker.com
 Main PID: 2770 (docker)
    Tasks: 502 (limit: 512)
   CGroup: /system.slice/docker.service

Ayar TasksMax=infinityiçinde [Service]bölümüne docker.servicedüzeltmeleri sorunu. docker.servicegenellikle içeridedir, ancak paket yöneticisi tarafından geçersiz kılınmasını önlemek /usr/share/systemd/systemiçin içine da kopyalanabilir /etc/systemd/system.

Liman işçisi örnek systemd dosyaları için bir çekme isteği artıyor TasksMaxve bir Arch Linux hata raporu paket için aynı şeyi yapmaya çalışıyor. Arch Linux Forumunda ve lxc ile ilgili Arch Linux hata raporunda bazı ek tartışmalar var .

DefaultTasksMaxiçin varsayılan değeri kontrol etmek amacıyla (veya kullanıcı tarafından işletilen servisler) [Manager]bölümünde kullanılabilir ./etc/systemd/system.conf/etc/systemd/user.confTasksMax

Systemd ayrıca bir giriş kabuğundan çalıştırılan programlar için bir sınır uygular. Bunlar, varsayılan 4096her kullanıcı (edilecektir yükseldi12288 ) gibi yapılandırılır UserTasksMaxiçinde [Login]kesit /etc/systemd/logind.conf.


1
FWIW, servis dosyası /lib/systemd/system/docker.serviceDebian sınavımdaydı.
Derleyici

2
FWIW, systemctl set-property docker.service TasksMax=4096şu anda çalışan bir servisin özelliğini ayarlayacağını ve sonraki yükleme için ayarların söz konusu liman işçisi kurulumu için doğru yerde devam edeceğini söylüyor .
Nakedible

Bu ortak bir yaklaşımdır . Ancak, önerdiğiniz Docker değişikliğinin bu cevabı gönderdikten sonra geri alındığını, 2016-02-09 tarihinde, bu reversiyonun daha sonra Docker sürüm 1.10.1'de dünyaya bırakıldığını unutmayın.
JdeBP

adam teşekkürler teşekkürler! Ben bunun için tooooo uzun arıyordum var
achabahe

Config dosyasında değişiklik yaparsanız (benimki /etc/systemd/system/docker.service.d/50-TasksMax.confUbuntu 16’daydı), çalıştırmanız gerekir systemctl daemon-reload. Bir sudo service docker restartişi yapmayacağım.
osman

4

cdauth'ın cevabı doğrudur, ancak eklemek için başka bir ayrıntı var.

Systemd 229 ve 4.3 çekirdekli Ubuntu 16.04 sistemimde, UserTasksMax yenisine ayarlandığında bile varsayılan olarak oturum kapsamlarında bir 512 teklif sınırı uygulandı, varsayılan olarak 12288 arttı.

Ben sınırını kaldırmak için bulunan tek yolu setine oldu DefaultTasksMax=unlimitedbölgesi /etc/systemd/system.confve systemctl daemon-reexec(veya yeniden başlatma).

systemctl statusBir oturum kapsamı belirleyerek, yayınlayarak ve bunun olup olmadığını kontrol edebilirsiniz cat /sys/fs/cgroup/pids/user.slice/user-${UID}.slice/session-FOO.scope/pids.max.


Değişikliği /etc/systemd/system.conf olarak yaptım ve yeniden başlattım. Docker, görevler üzerindeki sınırı yine de 512 olarak listeliyor. @ Nakedible'ın yukarıdan yaptığı yorum, mevcut görevleri güncelledi.
Ben Mathews

1
Teşekkürler Ryan! @BenMathews belki de bu çünkü oldu hem Ubuntu 16.04 geçerli sorunları vardır, bunları düzeltmek gerekir hem düzgün çalışması şeyleri. Bu sorun, kabuktaki bir kullanıcı tarafından değil, bir arka plan programı tarafından başlatılan kaplara uygulanır. Yani her şey yolunda görünüyor @reboot lxc-autostart, önyüklemede otomatik olarak başlatmak için crontab'ınıza ekliyorsunuz ve yeniden başlattıktan sonra aniden sakat kaplar alıyorsunuz.
qris

1

Bu konuyu okuduktan sonra .

Bu çözüm benim için çalıştı: docker -d --exec-opt native.cgroupdriver=cgroupfs. Aslında bunu ekledi OPTIONSin /etc/sysconfig/docker...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.