Tôi đang chạy một máy chủ docker trên Arch Linux (kernel 4.3.3-2) với một số container. Kể từ lần khởi động lại cuối cùng của tôi, cả máy chủ docker và các chương trình ngẫu nhiên trong vùng chứa đều gặp sự cố với thông báo về việc không thể tạo luồng hoặc (ít thường xuyên hơn) để rẽ nhánh. Thông báo lỗi cụ thể là khác nhau tùy thuộc vào chương trình, nhưng hầu hết trong số họ dường như đề cập đến lỗi cụ thể Resource temporarily unavailable
. Xem ở cuối bài này cho một số thông báo lỗi ví dụ.
Bây giờ có rất nhiều người đã có thông báo lỗi này và rất nhiều phản hồi cho họ. Điều thực sự gây thất vọng là mọi người dường như đang suy đoán vấn đề có thể được giải quyết như thế nào, nhưng dường như không ai chỉ ra cách xác định nguyên nhân nào trong số nhiều nguyên nhân có thể gây ra sự cố.
Tôi đã thu thập 5 nguyên nhân có thể gây ra lỗi này và cách xác minh rằng chúng không có trên hệ thống của tôi:
- Có giới hạn trên toàn hệ thống về số lượng luồng được cấu hình trong
/proc/sys/kernel/threads-max
( nguồn ). Trong trường hợp của tôi, điều này được đặt thành60613
. - Mỗi chủ đề có một số không gian trong ngăn xếp. Giới hạn kích thước ngăn xếp được cấu hình bằng cách sử dụng
ulimit -s
( nguồn ). Giới hạn cho vỏ của tôi đã từng8192
, nhưng tôi đã tăng nó bằng cách đưa* soft stack 32768
vào/etc/security/limits.conf
, vì vậyulimit -s
bây giờ nó trở lại32768
. Tôi cũng đã tăng nó cho quy trình docker bằng cách đưaLimitSTACK=33554432
vào/etc/systemd/system/docker.service
( nguồn và tôi đã xác minh rằng giới hạn áp dụng bằng cách xem xét/proc/<pid of docker>/limits
và chạyulimit -s
bên trong một container docker. - Mỗi chủ đề mất một số bộ nhớ. Giới hạn bộ nhớ ảo được cấu hình bằng
ulimit -v
. Trên hệ thống của tôi, nó được đặt thànhunlimited
và 80% bộ nhớ 3 GB của tôi là miễn phí. - Có giới hạn về số lượng quy trình sử dụng
ulimit -u
. Chủ đề được tính là quá trình trong trường hợp này ( nguồn ). Trên hệ thống của tôi, giới hạn được đặt thành30306
và đối với daemon docker và bên trong các container docker, giới hạn là1048576
. Số lượng chủ đề hiện đang chạy có thể được tìm thấy bằng cách chạyls -1d /proc/*/task/* | wc -l
hoặc bằng cách chạyps -elfT | wc -l
( nguồn ). Trên hệ thống của tôi, chúng nằm giữa700
và800
. - Có giới hạn về số lượng tệp đang mở, theo một số nguồn cũng có liên quan khi tạo chủ đề. Giới hạn được cấu hình bằng cách sử dụng
ulimit -n
. Trên hệ thống của tôi và bên trong docker, giới hạn được đặt thành1048576
. Số lượng tệp đang mở có thể được tìm thấy bằng cách sử dụnglsof | wc -l
( nguồn ), trên hệ thống của tôi30000
.
Có vẻ như trước lần khởi động lại cuối cùng tôi đã chạy kernel 4.2.5-1, bây giờ tôi đang chạy 4.3.3-2. Hạ cấp xuống 4.2.5-1 khắc phục tất cả các vấn đề. Các bài viết khác đề cập đến vấn đề này và điều này . Tôi đã mở một báo cáo lỗi cho Arch Linux .
Điều gì đã thay đổi trong kernel có thể gây ra điều này?
Dưới đây là một số thông báo lỗi ví dụ:
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