ฉันกำลังเรียกใช้เซิร์ฟเวอร์นักเทียบท่าบน Arch Linux (เคอร์เนล 4.3.3-2) พร้อมคอนเทนเนอร์หลายตัว ตั้งแต่รีบูตครั้งล่าสุดของฉันทั้งเซิร์ฟเวอร์นักเทียบท่าและโปรแกรมแบบสุ่มภายในคอนเทนเนอร์เกิดข้อผิดพลาดพร้อมกับข้อความว่าไม่สามารถสร้างเธรดหรือ (บ่อยกว่า) เพื่อแยก ข้อผิดพลาดที่เฉพาะเจาะจงจะแตกต่างกันขึ้นอยู่กับโปรแกรม Resource temporarily unavailable
แต่ส่วนใหญ่ของพวกเขาดูเหมือนจะพูดถึงข้อผิดพลาดที่เฉพาะเจาะจง ดูที่ส่วนท้ายของโพสต์นี้เพื่อดูข้อความแสดงข้อผิดพลาด
ขณะนี้มีคนจำนวนมากที่ได้รับข้อความแสดงข้อผิดพลาดนี้และมีคำตอบมากมาย สิ่งที่น่าผิดหวังจริงๆคือทุกคนดูเหมือนจะคาดเดาว่าปัญหาจะสามารถแก้ไขได้อย่างไร แต่ดูเหมือนว่าไม่มีใครที่จะชี้ให้เห็นว่าจะระบุสาเหตุของปัญหาที่อาจเกิดขึ้นได้บ้าง
ฉันได้รวบรวมสาเหตุที่เป็นไปได้ 5 ข้อสำหรับข้อผิดพลาดและวิธีการตรวจสอบว่าไม่มีอยู่ในระบบของฉัน:
- มีข้อ จำกัด ทั้งระบบเกี่ยวกับจำนวนเธรดที่กำหนดค่าใน
/proc/sys/kernel/threads-max
( ซอร์ส )60613
ในกรณีของฉันนี้ถูกตั้งค่า - ทุกเธรดใช้พื้นที่บางส่วนในสแต็ก ขีด จำกัด ขนาดสแต็กถูกกำหนดค่าโดยใช้
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
ภายในคอนเทนเนอร์นักเทียบท่า - ทุกเธรดใช้หน่วยความจำบางส่วน
ulimit -v
วงเงินหน่วยความจำเสมือนมีการกำหนดค่าการใช้ ในระบบของฉันมีการตั้งค่าunlimited
และ 80% ของหน่วยความจำ 3 GB ของฉันว่าง - มีการ จำกัด
ulimit -u
จำนวนของกระบวนการที่ใช้คือ หัวข้อนับเป็นกระบวนการในกรณีนี้ (ที่มา ) ในระบบของฉัน จำกัด การตั้งค่าไป30306
และสำหรับภูตนักเทียบท่าและภาชนะบรรจุนักเทียบท่าอยู่ภายในขีด จำกัด1048576
คือ จำนวนเธรดที่รันอยู่ในปัจจุบันสามารถพบได้โดยการรันls -1d /proc/*/task/* | wc -l
หรือโดยการรันps -elfT | wc -l
( ซอร์ส ) ในระบบของฉันที่พวกเขาอยู่ระหว่างและ700
800
- มีข้อ จำกัด เกี่ยวกับจำนวนไฟล์ที่เปิดซึ่งตามแหล่งที่มาบางส่วนก็มีความเกี่ยวข้องเมื่อสร้างเธรด ขีด จำกัด
ulimit -n
การกำหนดค่าการใช้ ในระบบและนักเทียบท่าภายในของฉัน จำกัด1048576
การตั้งค่าไป จำนวนไฟล์ที่เปิดที่สามารถพบได้ออกมาใช้lsof | wc -l
( แหล่งที่มา )30000
ในระบบของฉันมันเป็นเรื่องเกี่ยวกับ
ดูเหมือนว่าก่อนที่จะรีบูตครั้งล่าสุดที่ฉันใช้เคอร์เนล 4.2.5-1 ตอนนี้ฉันกำลังใช้ 4.3.3-2 การลดระดับเป็น 4.2.5-1 ช่วยแก้ไขปัญหาทั้งหมด โพสต์อื่น ๆ กล่าวขวัญปัญหาอยู่นี้และนี้ ผมได้เปิดรายงานข้อผิดพลาดสำหรับ Arch ลินุกซ์
มีการเปลี่ยนแปลงอะไรในเคอร์เนลที่อาจทำให้เกิดปัญหานี้?
นี่คือตัวอย่างข้อความผิดพลาด:
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