লিনাক্সের অধীনে কোন প্রক্রিয়া দ্বারা সর্বাধিক সংখ্যক থ্রেড তৈরি করা যায়?
কীভাবে (সম্ভব হলে) এই মানটি সংশোধন করা যায়?
লিনাক্সের অধীনে কোন প্রক্রিয়া দ্বারা সর্বাধিক সংখ্যক থ্রেড তৈরি করা যায়?
কীভাবে (সম্ভব হলে) এই মানটি সংশোধন করা যায়?
উত্তর:
লিনাক্সের প্রতিটি প্রক্রিয়া সীমাতে পৃথক থ্রেড থাকে না, সিস্টেমে মোট প্রক্রিয়া সংখ্যার উপর একটি সীমা থাকে (থ্রেডগুলি মূলত লিনাক্সের একটি অংশীদারি ঠিকানা সহ প্রসেস হয়) যা আপনি এটি দেখতে পারেন:
cat /proc/sys/kernel/threads-max
ডিফল্টটি মেমরি পৃষ্ঠাগুলির সংখ্যা / 4। আপনি এটিকে বাড়াতে পারেন:
echo 100000 > /proc/sys/kernel/threads-max
প্রক্রিয়া সংখ্যার উপরও একটি সীমা রয়েছে (এবং তাই থ্রেড) যা কোনও একক ব্যবহারকারী তৈরি করতে পারে, ulimit/getrlimit
এই সীমাগুলির বিষয়ে বিশদ জানতে দেখুন ।
E667: Fsync failed
যখন vi এ সঞ্চয় করার চেষ্টা করি তখন পাই।
লিনাক্সের প্রক্রিয়া সীমা অনুযায়ী পৃথক থ্রেড নেই এমনটি বলা ভুল।
লিনাক্স পরোক্ষভাবে প্রতিটি প্রক্রিয়াতে সর্বোচ্চ সংখ্যক থ্রেড প্রয়োগ করে !!
number of threads = total virtual memory / (stack size*1024*1024)
সুতরাং, মোট ভার্চুয়াল মেমরি বা স্ট্যাকের আকার হ্রাস করে প্রক্রিয়া অনুযায়ী থ্রেডের সংখ্যা বাড়ানো যেতে পারে। তবে, স্ট্যাকের আকার খুব বেশি হ্রাস করা স্ট্যাক ওভারফ্লোর কারণে কোড ব্যর্থতার দিকে নিয়ে যেতে পারে যখন সর্বাধিক ভার্চুয়াল মেমরিটি সোয়াপ মেমরির সমান।
আপনি পরীক্ষা মেশিন:
মোট ভার্চুয়াল মেমরি: ulimit -v
(ডিফল্টটি সীমাহীন, সুতরাং এটি বাড়ানোর জন্য আপনার অদলবদল মেমরি বাড়ানো দরকার)
মোট স্ট্যাকের আকার: ulimit -s
(ডিফল্টটি 8 এমবি)
এই মানগুলি বাড়ানোর আদেশ:
ulimit -s newvalue
ulimit -v newvalue
* সীমা হিসাবে আপনি যে মানটি রাখতে চান তার সাথে নতুন মান প্রতিস্থাপন করুন।
তথ্যসূত্র:
http://dustycodes.wordpress.com/2012/02/09/increasing-number-of-threads-per-process/
ulimit -s
। যতটা সম্ভব থ্রেড আইডি রয়েছে তত বেশি থ্রেড তৈরি করা খুব ভাল (বুদ্ধিমান নয়, তবে সম্ভব) is Bit৪ বিট লিনাক্সের অধীনে, থ্রেড আইডি রয়েছে তার চেয়ে বেশি থ্রেড তৈরি করা এমনকি সহজেই "সম্ভব" is (অবশ্যই এটি সম্ভব নয়, তবে স্ট্যাক যতদূর যায়, এটি)। ৩. স্ট্যাক রিজার্ভ, কমিট এবং ভিএম ভিন্ন জিনিস, ওসির সাথে যুক্ত।
ব্যবহারিক ক্ষেত্রে, সীমাটি সাধারণত স্ট্যাক স্পেস দ্বারা নির্ধারিত হয়। যদি প্রতিটি থ্রেড একটি 1 এমবি স্ট্যাক পায় (লিনাক্সে এটি ডিফল্ট কিনা তা আমি মনে করতে পারি না), তবে আপনি একটি 32-বিট সিস্টেম 3000 থ্রেডের পরে ঠিকানা স্থানের বাইরে চলে যাবে (ধরে নিবেন যে শেষ জিবি কার্নেলের কাছে সংরক্ষিত আছে) ।
তবে আপনি কয়েক ডজনের বেশি থ্রেড ব্যবহার করলে আপনি সম্ভবত ভয়াবহ পারফরম্যান্সের অভিজ্ঞতা অর্জন করতে পারেন। যত তাড়াতাড়ি বা পরে, আপনি অত্যধিক প্রসঙ্গ-স্যুইচিং ওভারহেড পাবেন, শিডিয়ুলারে খুব বেশি ওভারহেড পাবেন। (প্রচুর স্মৃতি খাওয়ার চেয়ে প্রচুর পরিমাণে থ্রেড তৈরি করা কিছুটা বেশি। তবে আসল সহ প্রচুর থ্রেড রয়েছে কাজ করতে প্রাপ্তিসাধ্য CPU- র সময়ের জন্য তারা হিসাবে আপনি মন্দীভূত করতে চলেছেন যুদ্ধ যাচ্ছে)
এই সীমাটি এমনকি প্রাসঙ্গিক যেখানে আপনি কী করছেন?
লিনাক্সে সঠিক 100k থ্রেড:
ulimit -s 256
ulimit -i 120000
echo 120000 > /proc/sys/kernel/threads-max
echo 600000 > /proc/sys/vm/max_map_count
echo 200000 > /proc/sys/kernel/pid_max
./100k-pthread-create-app
সিস্টেমড সিস্টেমে @ থমাস থেকে 2018 আপডেট:
/etc/systemd/logind.conf: UserTasksMax=100000
@dragosrsupercool
লিনাক্স সর্বাধিক থ্রেড গণনা করতে ভার্চুয়াল মেমরি ব্যবহার করে না, তবে সিস্টেমে প্রকৃত র্যাম ইনস্টল করা আছে
max_threads = totalram_pages / (8 * 8192 / 4096);
http://kavassalis.com/2011/03/linux-and-the-maximum-number-of-processes-threads/
কার্নেল / fork.c
/* The default maximum number of threads is set to a safe
* value: the thread structures can take up at most half
* of memory.
*/
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
সুতরাং থ্রেড ম্যাক্স প্রতিটি সিস্টেমের মধ্যে পৃথক, কারণ ইনস্টল করা র্যাম বিভিন্ন আকারের হতে পারে, আমি জানি লিনাক্সের ভার্চুয়াল মেমরিটি বাড়ানোর দরকার নেই, কারণ 32 বিটের উপর আমরা ব্যবহারকারীর স্পেসের জন্য 3 জিবি এবং কার্নেলের জন্য 1 জিবি পেয়েছি, bit৪ বিটের মধ্যে আমরা ভার্চুয়াল মেমরির 128 টিবি পেয়েছি, এটি সোলারিসে ঘটে, আপনি যদি ভার্চুয়াল মেমরিটি বাড়িয়ে নিতে চান তবে আপনাকে অদলবদল স্পেস যুক্ত করতে হবে।
এটি পুনরুদ্ধার করতে:
cat /proc/sys/kernel/threads-max
এটি সেট করতে:
echo 123456789 > /proc/sys/kernel/threads-max
123456789 = # থ্রেড
>
) অংশটি sudo
echo 12345678 | sudo tee -a /proc/sys/kernel/threads-max
থ্রেড গণনা সীমা:
$ cat /proc/sys/kernel/threads-max
এটি কীভাবে গণনা করা হয়:
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
এবং: x86_64 পৃষ্ঠার আকার (PAGE_SIZE) 4K; অন্যান্য সমস্ত স্থাপত্যের মতো, x86_64 প্রতিটি সক্রিয় থ্রেডের জন্য কার্নেল স্ট্যাক রয়েছে। এই থ্রেড স্ট্যাকগুলি THREAD_SIZE (2 * PAGE_SIZE) বড়;
মেম্পেজগুলির জন্য:
cat /proc/zoneinfo | grep spanned | awk '{totalpages=totalpages+$2} END {print totalpages}';
সুতরাং প্রকৃতপক্ষে সংখ্যাটি থ্রেড মেমরি স্ট্যাকের আকারের সীমাবদ্ধতার সাথে সম্পর্কিত নয় ulimit -s
।
PS: থ্রেড মেমরি স্ট্যাকের সীমাবদ্ধতা আমার রেল ভিএম-তে 10M, এবং 1.5G মেমরির জন্য, এই ভিএমটি কেবল 150 টি থ্রেড বহন করতে পারে?
যে কেউ এখন এটি দেখার জন্য, সিস্টেমেড সিস্টেমে (আমার ক্ষেত্রে, বিশেষত উবুন্টু ১ 16.০৪) সিগ্রুপ পিডস.ম্যাক্স পরামিতি দ্বারা আরোপিত আরও একটি সীমা রয়েছে।
এটি ডিফল্টরূপে 12,288 এ সেট করা আছে এবং /etc/systemd/logind.conf এ ওভাররাইড করা যায়
পিডস_ম্যাক্স, থ্রেডস-ম্যাক্স, ম্যাক্স_ম্যাপস_কাউন্ট, ইউলিমিট ইত্যাদি সহ অন্যান্য পরামর্শ এখনও প্রযোজ্য
আমার ক্ষেত্রে থ্রেড প্রতি স্ট্রিমের আকারটি ulimit সহ পরীক্ষা করুন, আমার ক্ষেত্রে রেডহ্যাট লিনাক্স ২.6:
ulimit -a
...
stack size (kbytes, -s) 10240
আপনার প্রতিটি থ্রেড এটির স্ট্যাকের জন্য বরাদ্দকৃত এই পরিমাণ মেমরি (10 এমবি) পাবে। একটি 32 বিট প্রোগ্রাম এবং সর্বাধিক 4 জিবি ঠিকানার স্পেস সহ, এটি কেবলমাত্র সর্বোচ্চ 4096 এমবি / 10 এমবি = 409 থ্রেড !!! মাইনাস প্রোগ্রাম কোড, বিয়োগের হিপ-স্পেস সম্ভবত একটি পর্যবেক্ষণ করা সর্বাধিক দিকে নিয়ে যাবে। 300 থ্রেডের।
আপনি এটি 64 বিবিটের উপর সংকলন করে এবং চালনা বা উলিমিট -8 8192 বা এমনকি ইউলিমিট-এস 4096 সেট করে উত্থাপন করতে সক্ষম হবেন But তবে এটি যদি পরামর্শ দেওয়া হয় তবে অন্য আলোচনা ...
এটা সম্ভবত কোন ব্যাপার না। একটি নির্দিষ্ট সংখ্যক থ্রেড (উদাহরণস্বরূপ, আপনার 4 বা 8 প্রসেসর থাকলে 4 বা 8) ব্যবহার করতে আপনি আপনার অ্যালগরিদম ডিজাইনের চেয়ে আরও ভাল পারফরম্যান্স পেতে চলেছেন। আপনি কাজের সারি, অ্যাসিঙ্ক্রোনাস আইও বা মুক্তির মতো কিছু দিয়ে এটি করতে পারেন।
আপনার সিস্টেমে নির্ভর করে, কেবলমাত্র [একটি লুপে প্রক্রিয়া তৈরি করে] একটি নমুনা প্রোগ্রাম লিখুন এবং পিএস অ্যাকো পিড, পিপিড, আরএসএস, ভার্জ, এনএলডব্লু, সেন্টিমিডি ব্যবহার করে পরীক্ষা করুন। যখন এটি আর থ্রেড তৈরি করতে পারে না এনএলডব্লু গণনা চেক [এনএলডব্লু সংখ্যাটি থ্রেড] ভোইলা আপনি বইয়ের মধ্য দিয়ে যাওয়ার পরিবর্তে আপনার বোকা প্রমাণ পেয়েছেন
স্থায়ীভাবে সেট করতে,
vim /etc/sysctl.conf
এবং যোগ করুন
kernel.threads-max = "value"
আমরা নিম্নলিখিত ফাইলটিতে লিনাক্সে সংজ্ঞায়িত সর্বাধিক সংখ্যক থ্রেড দেখতে পারি
বিড়াল / proc / sys / কার্নেল / থ্রেড-সর্বাধিক
(বা)
sysctl -a | গ্রেপ থ্রেড-সর্বাধিক
আপনি নিম্নলিখিত কমান্ডের মাধ্যমে বর্তমান মানটি দেখতে পারেন- cat / proc / sys / kernel / सूत्र-সর্বোচ্চ max
আপনি মানটিও সেট করতে পারেন
প্রতিধ্বনি 100500> / proc / sys / কার্নেল / থ্রেড-সর্বাধিক
আপনার নির্ধারিত মানটি উপলব্ধ র্যাম পৃষ্ঠাগুলির বিপরীতে পরীক্ষা করা হবে। যদি থ্রেড স্ট্রাকচারগুলি উপলব্ধ র্যাম পৃষ্ঠাগুলির 1/8 তমরও বেশি জায়গা দখল করে, তবে থ্রেড-সর্বাধিক হ্রাস করা হবে।
হ্যাঁ, থ্রেড নম্বর বাড়ানোর জন্য আপনার ভার্চুয়াল মেমরি বাড়াতে হবে বা স্ট্যাকের আকার হ্রাস করতে হবে। রাস্পবেরি পাইতে আমি ভার্চুয়াল মেমোরি বাড়ানোর কোনও উপায় খুঁজে পাইনি, যদি ডিফল্ট 8 এমবি থেকে 1 এমবি স্ট্যাকের আকার হ্রাস পায় তবে এটি সম্ভবত প্রতি প্রক্রিয়াতে 1000 টিরও বেশি থ্রেড পাবে তবে "উলিমিট-এস" কমান্ডের সাহায্যে স্ট্যাকের আকার হ্রাস করবে এটি সমস্ত থ্রেডের জন্য তৈরি করুন। সুতরাং, আমার সমাধানটি "pthread_t" উদাহরণটি "থ্রেড ক্লাস" ব্যবহার করছিল কারণ pthread_t আমাকে প্রতিটি থ্রেডের জন্য স্ট্যাকের আকার সেট করতে দেয়। অবশেষে, আমি রাস্পবেরি পাইতে প্রতিটি এমবি স্ট্যাকের 1 টির মধ্যে 1000 টিরও বেশি প্রসেস আর্কাইভ করার জন্য উপলব্ধ।