थ्रेड्स बनाना "संसाधन अस्थायी रूप से अनुपलब्ध" के साथ 4.3 कर्नेल के साथ विफल हो जाता है


39

मैं कई कंटेनरों के साथ आर्क लिनक्स (कर्नेल 4.3.3-2) पर एक डॉक सर्वर चला रहा हूं। मेरे अंतिम रिबूट के बाद से, कंटेनर के भीतर डॉकटर सर्वर और रैंडम प्रोग्राम दोनों एक संदेश के साथ दुर्घटनाग्रस्त हो जाते हैं, कांटा बनाने में सक्षम नहीं होने के बारे में या (कम अक्सर) कांटा करने के लिए। कार्यक्रम के आधार पर विशिष्ट त्रुटि संदेश अलग है, लेकिन उनमें से अधिकांश विशिष्ट त्रुटि का उल्लेख करते हैं Resource temporarily unavailable। कुछ उदाहरण त्रुटि संदेशों के लिए इस पोस्ट के अंत में देखें।

अब ऐसे बहुत सारे लोग हैं जिनके पास यह त्रुटि संदेश है, और उन पर बहुत अधिक प्रतिक्रियाएं हैं। वास्तव में निराशा की बात यह है कि हर कोई यह अनुमान लगा रहा है कि इस मुद्दे को कैसे सुलझाया जा सकता है, लेकिन कोई भी इस बात की ओर इशारा नहीं करता है कि समस्या के कई संभावित कारणों में से किसकी पहचान की जाए।

मैंने त्रुटि के लिए इन 5 संभावित कारणों को एकत्र किया है और यह सत्यापित करने के लिए कि वे मेरे सिस्टम पर मौजूद नहीं हैं:

  1. /proc/sys/kernel/threads-max( स्रोत ) में कॉन्फ़िगर किए गए थ्रेड्स की संख्या पर एक सिस्टम-वाइड सीमा है । मेरे मामले में यह निर्धारित है 60613
  2. हर धागा स्टैक में कुछ जगह लेता है। स्टैक आकार सीमा का उपयोग ulimit -s( स्रोत ) कॉन्फ़िगर किया गया है । मेरी खोल के लिए सीमा हुआ करता था 8192, लेकिन मैं रख कर यह वृद्धि हुई है * soft stack 32768में /etc/security/limits.conf, यह इतना ulimit -sअब रिटर्न 32768। मैंने डॉकटर प्रक्रिया के लिए इसे बढ़ा दिया LimitSTACK=33554432है /etc/systemd/system/docker.service( स्रोत में डालकर , और मैंने सत्यापित किया कि लिमिट डॉकटर कंटेनर के अंदर /proc/<pid of docker>/limitsऔर बाहर देखने से लागू होती है ulimit -s
  3. हर धागा कुछ स्मृति लेता है। वर्चुअल मेमोरी सीमा का उपयोग करके कॉन्फ़िगर किया गया है ulimit -v। मेरे सिस्टम पर यह सेट है unlimited, और मेरी 3 जीबी मेमोरी में से 80% मुफ्त हैं।
  4. उपयोग करने की प्रक्रियाओं की संख्या पर एक सीमा है ulimit -u। थ्रेड्स इस मामले ( स्रोत ) में प्रक्रियाओं के रूप में गिनती करते हैं । मेरे सिस्टम पर, सीमा निर्धारित है 30306, और docker डेमॉन के लिए और docker कंटेनर के अंदर, सीमा है 1048576। वर्तमान में चलने वाले थ्रेड्स की संख्या को रनिंग ls -1d /proc/*/task/* | wc -lया रनिंग ps -elfT | wc -l( स्रोत ) से पता लगाया जा सकता है । मेरे सिस्टम पर वे 700और के बीच हैं 800
  5. खुली फ़ाइलों की संख्या पर एक सीमा है, जो कुछ स्रोतों के अनुसार थ्रेड बनाते समय भी प्रासंगिक है। सीमा का उपयोग करके कॉन्फ़िगर किया गया है ulimit -n। मेरे सिस्टम और डॉकटर के अंदर, सीमा निर्धारित है 1048576। ओपन फाइल की संख्या lsof | wc -l( स्रोत ) का उपयोग करके पता लगाया जा सकता है , मेरे सिस्टम के बारे में 30000

ऐसा लगता है कि पिछले रिबूट से पहले मैं कर्नेल 4.2.5-1 चला रहा था, अब मैं 4.3.3-2 चला रहा हूं। डाउनग्रेड करने के लिए 4.2.5-1 सभी समस्याओं को हल करता है। समस्या का उल्लेख अन्य पदों हैं इस और इस । मैंने आर्क लिनक्स के लिए एक बग रिपोर्ट खोली है ।

कर्नेल में क्या बदलाव आया है जो इसका कारण हो सकता है?


यहां कुछ उदाहरण त्रुटि संदेश दिए गए हैं:

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
क्या आपने हाल ही में 4.3 कर्नेल में अपग्रेड किया था?
रौनी चौधरी

यह बहुत अच्छी तरह से संभव है। क्यूं कर?
कपोत

1
कमाल है, मैंने कर्नेल को 4.2.5-1 पर डाउनग्रेड किया और सब कुछ फिर से काम कर रहा है! क्या आपके पास कोई सुराग है कि यह क्या कारण है और इसे 4.3 के साथ कैसे ठीक किया जाए?
कोदूथ

इसका कोई सुराग नहीं है। इसे ठीक करने की मेरी विधि आर्क सोलर फोरम थ्रेड्स के लिए "SOLVED" :-P के रूप में चिह्नित किए जाने वाले विषय पर प्रतीक्षा कर रही है।
रौनी चौधरी

1
+1 एक उत्कृष्ट रूप से पूछे जाने वाले और शोध किए गए प्रश्न के लिए, भले ही मुझे एक ही समस्या हो
रॉय Truelove

जवाबों:


47

समस्या TasksMaxsystemd विशेषता के कारण होती है। इसे सिस्टमड 228 में पेश किया गया था और यह cgroups pid सबसिस्टम का उपयोग करता है, जिसे लिनक्स कर्नेल 4.3 में पेश किया गया था। 512यदि कर्नेल 4.3 या नया चल रहा है, तो सिस्टम की एक कार्य सीमा इस प्रकार सिस्टमड में सक्षम है। सुविधा की घोषणा की है यहाँ और में पेश किया गया था इस पुल अनुरोध और मूलभूत मूल्यों द्वारा स्थापित किए गए इस पुल अनुरोध । मेरे कर्नेल को 4.3 में अपग्रेड करने के बाद, systemctl status dockerएक Tasksलाइन प्रदर्शित करता है :

# 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

समस्या को हल करने TasksMax=infinityके [Service]अनुभाग में सेट करना docker.servicedocker.serviceआमतौर पर इसमें होता है /usr/share/systemd/system, लेकिन इसे /etc/systemd/systemपैकेज मैनेजर द्वारा ओवरराइड होने से बचाने के लिए इसमें कॉपी / कॉपी भी किया जा सकता है ।

Docker उदाहरण systemd फ़ाइलों के लिए एक पुल अनुरोध बढ़ रहा है TasksMax, और एक आर्क लिनक्स बग रिपोर्ट पैकेज के लिए समान हासिल करने की कोशिश कर रही है। आर्क लिनक्स फोरम पर और lxc के बारे में आर्क लिनक्स बग रिपोर्ट में कुछ अतिरिक्त चर्चा चल रही है ।

DefaultTasksMaxके लिए डिफ़ॉल्ट मान को नियंत्रित करने के लिए (या उपयोगकर्ता द्वारा संचालित सेवाओं के लिए) [Manager]अनुभाग में उपयोग किया जा सकता है ।/etc/systemd/system.conf/etc/systemd/user.confTasksMax

Systemd लॉगिन-शेल से चलने वाले प्रोग्रामों के लिए एक सीमा भी लागू करता है। 4096प्रति उपयोगकर्ता ये डिफ़ॉल्ट ( बढ़ाया12288 जाएगा ) और अनुभाग के रूप UserTasksMaxमें कॉन्फ़िगर किए गए हैं ।[Login]/etc/systemd/logind.conf


1
FWIW, सेवा फ़ाइल /lib/systemd/system/docker.serviceमेरे डेबियन परीक्षण में थी।
संकलनकर्ता

2
एफडब्ल्यूआईडब्ल्यू, यह कहते हुए कि systemctl set-property docker.service TasksMax=4096वर्तमान में चल रही सेवा के लिए संपत्ति निर्धारित करेगा और प्रश्न में डॉक स्थापना के लिए सही जगह पर बाद के रिबूट के लिए सेटिंग को बनाए रखेगा।
12

यह एक सामान्य दृष्टिकोण है । लेकिन ध्यान दें कि आपके द्वारा प्रस्तावित डॉकटर परिवर्तन को इस उत्तर को पोस्ट करने के बाद वापस कर दिया गया था, 2016-02-09 पर, इस प्रत्यावर्तन को फिर डॉकियर संस्करण 1.10.1 में दुनिया के लिए जारी किया गया।
जेडीबीपी

आदमी धन्यवाद धन्यवाद! मैं इसके लिए बहुत लंबे समय से देख रहा
हूं

यदि आप कॉन्फ़िगर फ़ाइल में परिवर्तन करते हैं (मेरा /etc/systemd/system/docker.service.d/50-TasksMax.confउबंटू 16 पर था ), तो आपको चलाने की आवश्यकता है systemctl daemon-reload। ऐसा करने से एक sudo service docker restartकार्य नहीं करेगा।
ओसमैन

4

cdauth का उत्तर सही है, लेकिन जोड़ने के लिए एक और विवरण है।

सिस्टम Ubuntu 229 और 4.3 कर्नेल के साथ मेरे उबंटू 16.04 सिस्टम पर, डिफ़ॉल्ट रूप से सत्र स्कोप पर 512 pid की सीमा लागू की गई थी, तब भी जब UserTasksMax को नए पर सेट किया गया था, 12288 की डिफ़ॉल्ट वृद्धि हुई थी। इसलिए किसी भी उपयोगकर्ता सत्र की गुंजाइश 512 थ्रेड तक सीमित थी।

एक ही रास्ता मैं सीमा को निकालना पाया सेट करने के लिए था DefaultTasksMax=unlimitedमें /etc/systemd/system.confऔर systemctl daemon-reexec(या रिबूट)।

आप यह जारी कर सकते हैं कि क्या जारी करने systemctl status, सत्र का दायरा चुनने, और cat /sys/fs/cgroup/pids/user.slice/user-${UID}.slice/session-FOO.scope/pids.max


मैंने /etc/systemd/system.conf में परिवर्तन किया और रिबूट किया। डॉकर अभी भी 512 के रूप में कार्यों की सीमा को सूचीबद्ध करता है। ऊपर से @ Nakedible की टिप्पणी का उपयोग करके उपलब्ध कार्यों को अद्यतन किया गया है।
बेन मैथ्यूज

1
धन्यवाद रयान! @BenMathews शायद यह इसलिए था क्योंकि दोनों Ubuntu 16.04 पर मान्य मुद्दे हैं, आपको चीजों को ठीक से काम करने के लिए उन दोनों को ठीक करने की आवश्यकता है। यह समस्या एक डेमन द्वारा शुरू किए गए कंटेनरों पर लागू होती है, किसी उपयोगकर्ता द्वारा शेल में नहीं। तो सब कुछ ठीक प्रतीत होता है, आप @reboot lxc-autostartअपने कॉट्रैब को बूट पर ऑटोस्टार्ट करने के लिए जोड़ते हैं , और आपको अचानक रिबूट के बाद अपंग कंटेनर मिलते हैं।
qris

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.