4.3 কার্নেল সহ "রিসোর্স অস্থায়ীভাবে উপলভ্য নয়" দিয়ে থ্রেড তৈরি করা ব্যর্থ


39

আমি বেশ কয়েকটি ধারক সহ আর্চ লিনাক্স (কার্নেল ৪.৩.৩-২) এ একটি ডকার সার্ভার চালাচ্ছি। আমার শেষ পুনরায় বুট হওয়ার পরে, ধারকগুলির মধ্যে ডকার সার্ভার এবং এলোমেলো প্রোগ্রাম উভয়ই একটি থ্রেড তৈরি করতে না পারার বার্তা সহ বা ক্র্যাক করার জন্য (কম প্রায়ই) ক্র্যাশ। প্রোগ্রামের উপর নির্ভর করে নির্দিষ্ট ত্রুটি বার্তাটি ভিন্ন, তবে তাদের বেশিরভাগই নির্দিষ্ট ত্রুটির উল্লেখ করেছেন বলে মনে হয় 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। আমিও নির্বাণ দ্বারা Docker প্রক্রিয়ার জন্য এটা বেড়ে গেছে LimitSTACK=33554432মধ্যে /etc/systemd/system/docker.service( উৎস , এবং আমি যাচাই যে সীমা মধ্যে খুঁজছেন দ্বারা প্রযোজ্য /proc/<pid of docker>/limitsএবং চলমান দ্বারা ulimit -sএকটি Docker ধারক ভিতরে।
  3. প্রতিটি থ্রেড কিছু স্মৃতি লাগে। একটি ভার্চুয়াল মেমরি সীমা ব্যবহার করে কনফিগার করা হয়েছে ulimit -v। আমার সিস্টেমে এটি সেট করা আছে unlimitedএবং আমার 3 জিবি মেমরির 80% বিনামূল্যে।
  4. ব্যবহার প্রক্রিয়া সংখ্যার একটি সীমা আছে ulimit -u। এই ক্ষেত্রে প্রক্রিয়া হিসাবে উত্স গণনা ( উত্স )। আমার সিস্টেমে সীমাটি সেট করা আছে 30306এবং ডকার ডিমন এবং ডকার পাত্রগুলির ভিতরে সীমাটি 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 এ ডাউনগ্রেডিং সমস্ত সমস্যার সমাধান করে। সমস্যা উল্লেখ অন্যান্য পোস্ট আছে এই এবং এই । আমি আর্চ লিনাক্সের জন্য একটি বাগ রিপোর্ট খুলেছি ।

কার্নেলের মধ্যে কী এমন পরিবর্তন হয়েছে যা এর কারণ হতে পারে?


এখানে কয়েকটি উদাহরণ ত্রুটি বার্তা রয়েছে:

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 দিয়ে ঠিক করবেন?
সিডিউথ

কোন কারণ নেই এর কারণ কি। আমার এটি ঠিক করার পদ্ধতিটি বিষয়টিতে আর্ক লিনাক ফোরামের থ্রেডগুলির জন্য অপেক্ষা করা হচ্ছে "সলভড" :- পি চিহ্নিত করা হবে।
রনি চৌধুরী

1
+1 টি একটি চমৎকারভাবে জিজ্ঞাসা এবং গবেষণা প্রশ্ন হচ্ছে, এমনকি যদি আমি করা হয়নি একই সমস্যা আছে
রায় প্রকৃত প্রেমিক

উত্তর:


47

সমস্যাটি TasksMaxসিস্টেমযুক্ত বৈশিষ্ট্য দ্বারা সৃষ্ট । এটি systemd 228-এ প্রবর্তিত হয়েছিল এবং cgroups pid সাবসিস্টেম ব্যবহার করে, যা লিনাক্স কার্নেল ৪.৩-এ প্রবর্তিত হয়েছিল। 512কার্নেল ৪.৩ বা আরও নতুন চলমান থাকলে একটি কার্য সীমাটি সিস্টেমডে সক্ষম করা হয়। বৈশিষ্ট্য ঘোষণা করা হয় এখানে এবং চালু হয় এই টান অনুরোধ এবং ডিফল্ট মান দ্বারা সেট হয়েছিল এই টান অনুরোধ । আমার কার্নেলটি 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

ডকার উদাহরণ সিস্টেমড ফাইলগুলির জন্য একটি টান অনুরোধ বাড়ছে TasksMax, এবং একটি আর্চ লিনাক্স বাগ রিপোর্ট প্যাকেজটির জন্য এটি অর্জন করার চেষ্টা করছে। আর্ক লিনাক্স ফোরাম এবং lxc সম্পর্কিত একটি আর্চ লিনাক্স বাগ রিপোর্টে কিছু অতিরিক্ত আলোচনা চলছে ।

DefaultTasksMaxএর ডিফল্ট মান নিয়ন্ত্রণ করতে (বা ব্যবহারকারী দ্বারা চালিত পরিষেবার জন্য) [Manager]বিভাগে ব্যবহার করা যেতে পারে ।/etc/systemd/system.conf/etc/systemd/user.confTasksMax

লগ-ইন শেল থেকে চালিত প্রোগ্রামগুলির সীমাবদ্ধতা প্রয়োগ করে সিস্টেমড। 4096ব্যবহারকারীদের প্রতি এই ডিফল্ট (এতে বাড়ানো হবে12288 ) এবং বিভাগের মতো কনফিগার করা UserTasksMaxহয়েছে ।[Login]/etc/systemd/logind.conf


1
FWIW, পরিষেবা ফাইলটি /lib/systemd/system/docker.serviceআমার ডেবিয়ান পরীক্ষায় ছিল।
কম্পাইলার

2
এফডব্লিউআইডাব্লু বলছে, systemctl set-property docker.service TasksMax=4096বর্তমানে চলমান পরিষেবার জন্য সম্পত্তি সেট করবে এবং প্রশ্নোত্তর ডকার স্থাপনের জন্য যথাযথ স্থানে পরবর্তী রিবুটগুলির জন্য সেটিংসটি বহাল থাকবে।
নেকেডেবল

এটি একটি সাধারণ পদ্ধতি । তবে মনে রাখবেন যে আপনি যে ডকার পরিবর্তনটি প্রস্তাব করেছিলেন সেটি আপনি এই উত্তরটি পোস্ট করার পরে, ২০১০-০২-০৯ তারিখে, আবার এই ডਵਰার সংস্করণ ১.১০.১ সংস্করণে প্রকাশিত হয়েছিল।
জেডিবিপি 12'16

মানুষ ধন্যবাদ ধন্যবাদ ধন্যবাদ! আমি এটির জন্য খুব দীর্ঘদিন ধরে খুঁজছি
অচাবহ

আপনি যদি কনফিগারেশন ফাইলটিতে পরিবর্তন করেন (আমার /etc/systemd/system/docker.service.d/50-TasksMax.confউবুন্টু 16 তে ছিল ), আপনাকে চালানো দরকার systemctl daemon-reload। একটি করা sudo service docker restartকাজ করবে না।
ওসমান

4

সিডিউথের উত্তরটি সঠিক, তবে যুক্ত করার জন্য আরও একটি বিশদ রয়েছে।

সিস্টেমেড 229 এবং একটি 4.3 কার্নেল সহ আমার উবুন্টু 16.04 সিস্টেমে, ইউজারটাস্কম্যাক্স 12288-এর নতুন, বর্ধিত ডিফল্টে সেট করা থাকলেও ডিফল্টরূপে সেশন স্কোপে একটি 512 পিড সীমা প্রয়োগ করা হয়েছিল So সুতরাং কোনও ব্যবহারকারীর সেশনের সুযোগ 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 হিসাবে তালিকাবদ্ধ করে above
বেন ম্যাথিউস 21

1
ধন্যবাদ রায়ান! @ বেনম্যাথিউস সম্ভবত এটি কারণ হ'ল উবুন্টু ১.0.০৪- তে উভয়ই বৈধ সমস্যা, জিনিসগুলি সঠিকভাবে কাজ করার জন্য আপনাকে উভয়ই ঠিক করতে হবে । এই সমস্যাটি কোনও শেল ব্যবহারকারীর দ্বারা নয়, ডেমন দ্বারা শুরু করা পাত্রে প্রযোজ্য বলে মনে হয়। সুতরাং সবকিছু ঠিক আছে, আপনি @reboot lxc-autostartবুট-এ সেগুলি চালু করতে আপনার ক্রোনট্যাব যুক্ত করুন এবং হঠাৎ রিবুট হওয়ার পরে পঙ্গু পাত্রে পেলেন।
qris

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.