লিনাক্সে প্রতিটি প্রক্রিয়া অনুযায়ী সর্বাধিক সংখ্যক থ্রেড?


245

লিনাক্সের অধীনে কোন প্রক্রিয়া দ্বারা সর্বাধিক সংখ্যক থ্রেড তৈরি করা যায়?

কীভাবে (সম্ভব হলে) এই মানটি সংশোধন করা যায়?

উত্তর:


247

লিনাক্সের প্রতিটি প্রক্রিয়া সীমাতে পৃথক থ্রেড থাকে না, সিস্টেমে মোট প্রক্রিয়া সংখ্যার উপর একটি সীমা থাকে (থ্রেডগুলি মূলত লিনাক্সের একটি অংশীদারি ঠিকানা সহ প্রসেস হয়) যা আপনি এটি দেখতে পারেন:

cat /proc/sys/kernel/threads-max

ডিফল্টটি মেমরি পৃষ্ঠাগুলির সংখ্যা / 4। আপনি এটিকে বাড়াতে পারেন:

echo 100000 > /proc/sys/kernel/threads-max

প্রক্রিয়া সংখ্যার উপরও একটি সীমা রয়েছে (এবং তাই থ্রেড) যা কোনও একক ব্যবহারকারী তৈরি করতে পারে, ulimit/getrlimitএই সীমাগুলির বিষয়ে বিশদ জানতে দেখুন ।


3
/ Proc / sys / vm / max_map_count এর সীমাটি থ্রেডের সংখ্যাও সীমাবদ্ধ করতে পারে। আপনি যদি আঘাত করেন তবে এই সীমাটি অনেক বাড়ানো নিরাপদ হওয়া উচিত।
মিক্কো রেন্টালাইনেন

1
রবার্ট: লিনাক্স পরোক্ষভাবে প্রতিটি প্রক্রিয়া সীমা বাস্তবায়ন করে। বিশদ জন্য আমার উত্তর চেক করুন;)
codersofthedark

আমি আমার ওবুন্টু 12.04 এ এটি পরিবর্তন করার চেষ্টা করছি এবং এটি আপনার আদেশের সাথে পরিবর্তন হচ্ছে না। আমি এটি পরিবর্তন করার জন্যও ভিআই চেষ্টা করেছিলাম, তবে আমি E667: Fsync failedযখন vi এ সঞ্চয় করার চেষ্টা করি তখন পাই।
সিদ্ধার্থ

4
@ ডিগ্রোগোসারুপিকুল সর্বাধিক থ্রেড মোট ভার্চুয়াল মেমরি ব্যবহার করে গণনা করা হয়
c4f4t0r

1
থ্রেডে স্ট্যাক আকারের পরিমাণ (আপনার সিস্টেমে ডিফল্ট) অন্য যে কোনও কিছুর চেয়ে সীমা হওয়ার সম্ভাবনা বেশি। প্রতি থ্রেড স্ট্যাকের আকার হ্রাস মোট থ্রেডের সংখ্যা বাড়ানোর একটি উপায় (যদিও এটি খুব কমই ভাল ধারণা)।
রেন্ডি হাওয়ার্ড

67

লিনাক্সের প্রক্রিয়া সীমা অনুযায়ী পৃথক থ্রেড নেই এমনটি বলা ভুল।

লিনাক্স পরোক্ষভাবে প্রতিটি প্রক্রিয়াতে সর্বোচ্চ সংখ্যক থ্রেড প্রয়োগ করে !!

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/


11
3 সামান্য বিশদ বিবরণ ব্যতীত: 1. লিনাক্স এটি করে না, স্ট্যাকের উপস্থিতি এবং মেমরি এবং ঠিকানার স্থান সীমাবদ্ধ আকারের এটির কোনও সম্পর্ক নেই। ২. কোনও থ্রেড তৈরি করার সময় আপনাকে এটি নির্দিষ্ট করতে হবে, এটি নির্বিশেষে ulimit -s। যতটা সম্ভব থ্রেড আইডি রয়েছে তত বেশি থ্রেড তৈরি করা খুব ভাল (বুদ্ধিমান নয়, তবে সম্ভব) is Bit৪ বিট লিনাক্সের অধীনে, থ্রেড আইডি রয়েছে তার চেয়ে বেশি থ্রেড তৈরি করা এমনকি সহজেই "সম্ভব" is (অবশ্যই এটি সম্ভব নয়, তবে স্ট্যাক যতদূর যায়, এটি)। ৩. স্ট্যাক রিজার্ভ, কমিট এবং ভিএম ভিন্ন জিনিস, ওসির সাথে যুক্ত।
দামন

হ্যাঁ, থ্রেড নম্বর বাড়ানোর জন্য আপনার ভার্চুয়াল মেমরি বাড়াতে হবে বা স্ট্যাকের আকার হ্রাস করতে হবে। রাস্পবেরি পাইতে আমি ভার্চুয়াল মেমোরি বাড়ানোর কোনও উপায় খুঁজে পাইনি, যদি ডিফল্ট 8 এমবি থেকে 1 এমবি স্ট্যাকের আকার হ্রাস পায় তবে এটি সম্ভবত প্রতি প্রক্রিয়াতে 1000 টিরও বেশি থ্রেড পাবে তবে "উলিমিট-এস" কমান্ডের সাহায্যে স্ট্যাকের আকার হ্রাস করবে এটি সমস্ত থ্রেডের জন্য তৈরি করুন। সুতরাং, আমার সমাধানটি "pthread_t" উদাহরণটি "থ্রেড ক্লাস" ব্যবহার করছিল কারণ pthread_t আমাকে প্রতিটি থ্রেডের জন্য স্ট্যাকের আকার সেট করতে দেয়। অবশেষে, আমি রাস্পবেরি পাইতে প্রতিটি প্রক্রিয়াতে 1000 টিরও বেশি থ্রেড সংরক্ষণাগারটিতে উপলব্ধ 1MB স্ট্যাকের সাথে
রেখেছি

43

ব্যবহারিক ক্ষেত্রে, সীমাটি সাধারণত স্ট্যাক স্পেস দ্বারা নির্ধারিত হয়। যদি প্রতিটি থ্রেড একটি 1 এমবি স্ট্যাক পায় (লিনাক্সে এটি ডিফল্ট কিনা তা আমি মনে করতে পারি না), তবে আপনি একটি 32-বিট সিস্টেম 3000 থ্রেডের পরে ঠিকানা স্থানের বাইরে চলে যাবে (ধরে নিবেন যে শেষ জিবি কার্নেলের কাছে সংরক্ষিত আছে) ।

তবে আপনি কয়েক ডজনের বেশি থ্রেড ব্যবহার করলে আপনি সম্ভবত ভয়াবহ পারফরম্যান্সের অভিজ্ঞতা অর্জন করতে পারেন। যত তাড়াতাড়ি বা পরে, আপনি অত্যধিক প্রসঙ্গ-স্যুইচিং ওভারহেড পাবেন, শিডিয়ুলারে খুব বেশি ওভারহেড পাবেন। (প্রচুর স্মৃতি খাওয়ার চেয়ে প্রচুর পরিমাণে থ্রেড তৈরি করা কিছুটা বেশি। তবে আসল সহ প্রচুর থ্রেড রয়েছে কাজ করতে প্রাপ্তিসাধ্য CPU- র সময়ের জন্য তারা হিসাবে আপনি মন্দীভূত করতে চলেছেন যুদ্ধ যাচ্ছে)

এই সীমাটি এমনকি প্রাসঙ্গিক যেখানে আপনি কী করছেন?


3
স্ট্যাকের জন্য প্রতি থ্রেডে 1 এমবি বেশ বেশি, অনেকগুলি প্রোগ্রামের এত বেশি স্ট্যাক জায়গার কাছে কোথাও প্রয়োজন হয় না। পারফরম্যান্স চলমানযোগ্য প্রক্রিয়াগুলির সংখ্যার ভিত্তিতে হতে চলেছে , বিদ্যমান থ্রেডের সংখ্যার ভিত্তিতে নয়। আমার এখন 0.00 এর লোড সহ 1200+ থ্রেড সহ একটি মেশিন চলছে।
রবার্ট গাম্বল

13
কর্মক্ষমতা থ্রেডগুলি কী করছে তার উপর নির্ভর করে। যদি তারা কিছু না করে এবং তাই কম প্রসঙ্গ-স্যুইচিং করে তবে আপনি কয়েক ডজনের চেয়ে অনেক বেশি যেতে পারেন।
কোরি গোল্ডবার্গ

স্ট্যাক গতিশীলভাবে বৃদ্ধি পাচ্ছে, কেবল প্রাথমিক পৃষ্ঠাটি ব্যাট-অফ-ব্যাট থেকে বরাদ্দ করা হয়েছে
মাইকেল পানকভ

28

লিনাক্সে সঠিক 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

4
আপনাকে ধন্যবাদ, অবশেষে এটি আমাকে 32 কে জাভা থ্রেড গণনা ভেঙে অনুমতি দিয়েছে।
বেরেজোভস্কিই

1
আমার জন্য কাজ করে না: lim ulimit -s 100000 $ ulimit -i 63645 $ বিড়াল / proc / sys / কার্নেল / থ্রেড-সর্বাধিক 127626 $ বিড়াল / proc / sys / vm / max_map_count 600000 $ বিড়াল / proc / sys / কার্নেল / pid_max 200000 ava java -Xmx4G -Xss256k -cp। থ্রেডক্রিয়েশন ... 11542 11543 java.lang.OutOfMemoryError: java.lang.Thread.start0 (নেটিভ মেথড) এ জাভা.লাং.ট্রেড.স্টার্টে (থ্রেড.জাভা:717) নতুন থ্রেড তৈরি করতে অক্ষম ThreadCreation.java15)
মার্টিন

@ মার্টিনভিজনি ইউলিমিট-এস = কেবিতে থ্রেডের আকার। সুতরাং আপনি 100 এমবি থ্রেড স্ট্যাক আকারের সাথে থ্রেড তৈরি করার চেষ্টা করছেন।
ভ্লাদিমির কুনসাইকভ ২

@ থমাস, যাচাই না করেই আপনার পরামর্শ যুক্ত করেছেন, যাইহোক প্রতিক্রিয়াটির জন্য ধন্যবাদ।
ভ্লাদিমির কুনশিকভভ

2
@ ভ্লাদিমিরকুনসাইকিকভ ধন্যবাদ বন্ধু, আপনার সমাধানটি সত্যই কার্যকর হয়েছে এবং থমাসকে ধন্যবাদ জানিয়েছে যে অতিরিক্ত লাইনটি যুক্ত করার জন্য, আমি নিশ্চিত করতে পারি যে এটি সেই লাইনটি দিয়ে কাজ করবে না।
বিলহু

14

@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 টিবি পেয়েছি, এটি সোলারিসে ঘটে, আপনি যদি ভার্চুয়াল মেমরিটি বাড়িয়ে নিতে চান তবে আপনাকে অদলবদল স্পেস যুক্ত করতে হবে।


11

এটি পুনরুদ্ধার করতে:

cat /proc/sys/kernel/threads-max

এটি সেট করতে:

echo 123456789 > /proc/sys/kernel/threads-max

123456789 = # থ্রেড


মূল লেখার চেষ্টা করার সময় আমি অনুমতি অস্বীকার করি।
কিম 21

ঠিক আছে, এটি পোস্ট হওয়ার পরে প্রায় এক দশক হয়ে গেছে। আমি বর্তমান পরিস্থিতি সম্পর্কে আপ টু ডেট নই, তবে অনেক কিছু বদলে যেতে পারে (এবং সম্ভবত রয়েছে) ...
ভিনসেন্ট ভ্যান ডেন বার্গে

পারম-অস্বীকারের সাথে সমস্যাটি সংযোজন হতে পারে ( >) অংশটি sudoecho 12345678 | sudo tee -a /proc/sys/kernel/threads-max
হারাতে পারে

10

থ্রেড গণনা সীমা:

$ 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 টি থ্রেড বহন করতে পারে?


5

যে কেউ এখন এটি দেখার জন্য, সিস্টেমেড সিস্টেমে (আমার ক্ষেত্রে, বিশেষত উবুন্টু ১ 16.০৪) সিগ্রুপ পিডস.ম্যাক্স পরামিতি দ্বারা আরোপিত আরও একটি সীমা রয়েছে।

এটি ডিফল্টরূপে 12,288 এ সেট করা আছে এবং /etc/systemd/logind.conf এ ওভাররাইড করা যায়

পিডস_ম্যাক্স, থ্রেডস-ম্যাক্স, ম্যাক্স_ম্যাপস_কাউন্ট, ইউলিমিট ইত্যাদি সহ অন্যান্য পরামর্শ এখনও প্রযোজ্য


5

আমার ক্ষেত্রে থ্রেড প্রতি স্ট্রিমের আকারটি ulimit সহ পরীক্ষা করুন, আমার ক্ষেত্রে রেডহ্যাট লিনাক্স ২.6:

    ulimit -a
...
    stack size              (kbytes, -s) 10240

আপনার প্রতিটি থ্রেড এটির স্ট্যাকের জন্য বরাদ্দকৃত এই পরিমাণ মেমরি (10 এমবি) পাবে। একটি 32 বিট প্রোগ্রাম এবং সর্বাধিক 4 জিবি ঠিকানার স্পেস সহ, এটি কেবলমাত্র সর্বোচ্চ 4096 এমবি / 10 এমবি = 409 থ্রেড !!! মাইনাস প্রোগ্রাম কোড, বিয়োগের হিপ-স্পেস সম্ভবত একটি পর্যবেক্ষণ করা সর্বাধিক দিকে নিয়ে যাবে। 300 থ্রেডের।

আপনি এটি 64 বিবিটের উপর সংকলন করে এবং চালনা বা উলিমিট -8 8192 বা এমনকি ইউলিমিট-এস 4096 সেট করে উত্থাপন করতে সক্ষম হবেন But তবে এটি যদি পরামর্শ দেওয়া হয় তবে অন্য আলোচনা ...


4

এটা সম্ভবত কোন ব্যাপার না। একটি নির্দিষ্ট সংখ্যক থ্রেড (উদাহরণস্বরূপ, আপনার 4 বা 8 প্রসেসর থাকলে 4 বা 8) ব্যবহার করতে আপনি আপনার অ্যালগরিদম ডিজাইনের চেয়ে আরও ভাল পারফরম্যান্স পেতে চলেছেন। আপনি কাজের সারি, অ্যাসিঙ্ক্রোনাস আইও বা মুক্তির মতো কিছু দিয়ে এটি করতে পারেন।


3
মাল্টিথ্রেডিংয়ের উদ্দেশ্য কেবল পারফরম্যান্সই নয়। উদাহরণস্বরূপ আপনি 4 কোর প্রসেসরে একটি ব্লকিং সিস্টেম সহ 10 পোর্ট শুনছেন। এই উদাহরণে 4 এর কোনও অর্থ নেই
ওবায়হান

3

ব্যবহার করুন nbio অ ব্লক I / O লাইব্রেরি বা যাই হোক না কেন, যদি আপনি ইনপুট / আউটপুট কল ব্লক করছেন জন্য আরো থ্রেড প্রয়োজন


2

আপনার সিস্টেমে নির্ভর করে, কেবলমাত্র [একটি লুপে প্রক্রিয়া তৈরি করে] একটি নমুনা প্রোগ্রাম লিখুন এবং পিএস অ্যাকো পিড, পিপিড, আরএসএস, ভার্জ, এনএলডব্লু, সেন্টিমিডি ব্যবহার করে পরীক্ষা করুন। যখন এটি আর থ্রেড তৈরি করতে পারে না এনএলডব্লু গণনা চেক [এনএলডব্লু সংখ্যাটি থ্রেড] ভোইলা আপনি বইয়ের মধ্য দিয়ে যাওয়ার পরিবর্তে আপনার বোকা প্রমাণ পেয়েছেন



0

আমরা নিম্নলিখিত ফাইলটিতে লিনাক্সে সংজ্ঞায়িত সর্বাধিক সংখ্যক থ্রেড দেখতে পারি

বিড়াল / proc / sys / কার্নেল / থ্রেড-সর্বাধিক

(বা)

sysctl -a | গ্রেপ থ্রেড-সর্বাধিক


0

আপনি নিম্নলিখিত কমান্ডের মাধ্যমে বর্তমান মানটি দেখতে পারেন- cat / proc / sys / kernel / सूत्र-সর্বোচ্চ max

আপনি মানটিও সেট করতে পারেন

প্রতিধ্বনি 100500> / proc / sys / কার্নেল / থ্রেড-সর্বাধিক

আপনার নির্ধারিত মানটি উপলব্ধ র্যাম পৃষ্ঠাগুলির বিপরীতে পরীক্ষা করা হবে। যদি থ্রেড স্ট্রাকচারগুলি উপলব্ধ র‍্যাম পৃষ্ঠাগুলির 1/8 তমরও বেশি জায়গা দখল করে, তবে থ্রেড-সর্বাধিক হ্রাস করা হবে।


0

হ্যাঁ, থ্রেড নম্বর বাড়ানোর জন্য আপনার ভার্চুয়াল মেমরি বাড়াতে হবে বা স্ট্যাকের আকার হ্রাস করতে হবে। রাস্পবেরি পাইতে আমি ভার্চুয়াল মেমোরি বাড়ানোর কোনও উপায় খুঁজে পাইনি, যদি ডিফল্ট 8 এমবি থেকে 1 এমবি স্ট্যাকের আকার হ্রাস পায় তবে এটি সম্ভবত প্রতি প্রক্রিয়াতে 1000 টিরও বেশি থ্রেড পাবে তবে "উলিমিট-এস" কমান্ডের সাহায্যে স্ট্যাকের আকার হ্রাস করবে এটি সমস্ত থ্রেডের জন্য তৈরি করুন। সুতরাং, আমার সমাধানটি "pthread_t" উদাহরণটি "থ্রেড ক্লাস" ব্যবহার করছিল কারণ pthread_t আমাকে প্রতিটি থ্রেডের জন্য স্ট্যাকের আকার সেট করতে দেয়। অবশেষে, আমি রাস্পবেরি পাইতে প্রতিটি এমবি স্ট্যাকের 1 টির মধ্যে 1000 টিরও বেশি প্রসেস আর্কাইভ করার জন্য উপলব্ধ।

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