উত্তর:
এটি একটি জটিল প্রশ্ন যা আপনি জিজ্ঞাসা করছেন। আপনার থ্রেডগুলির প্রকৃতি সম্পর্কে আরও না জেনে বলা মুশকিল। সিস্টেমের কার্যকারিতা নির্ণয়ের সময় কিছু বিষয় বিবেচনা করতে হবে:
প্রক্রিয়া / থ্রেড হয়
এই তিনটি সংস্থানই সীমাবদ্ধ এবং যে কোনও একটি সিস্টেমের কার্যকারিতা সীমাবদ্ধ করতে পারে। আপনার নির্দিষ্ট পরিস্থিতি গ্রাস করছে কোনটি (আপনার পক্ষে 2 বা 3 একসাথে হতে পারে) তা দেখতে হবে।
আপনি কী এবং যা চলছে তা নির্ধারণ করতে ntop
এবং ব্যবহার করতে পারেন ।iostat
vmstat
"কেন এমন হয়?" উত্তর এক ধরণের সহজ। ভাবুন আপনার একটি করিডোর রয়েছে যা আপনি পাশাপাশি চারজনকে ফিট করতে পারবেন। আপনি সমস্ত আবর্জনা এক প্রান্তে, অন্য প্রান্তে সরাতে চান। সবচেয়ে দক্ষ লোক হ'ল ৪ জন।
আপনার যদি 1-3 জন থাকে তবে আপনি কিছু করিডোর স্পেস ব্যবহার করতে ব্যর্থ হচ্ছেন। আপনার যদি 5 বা ততোধিক লোক থাকে, তবে সেই লোকগুলির মধ্যে অন্তত একটিতে পুরো সময় অন্য ব্যক্তির পিছনে সারি আটকে থাকে। আরও বেশি সংখ্যক লোক যুক্ত করা কেবল করিডোরটি বন্ধ করে দেয়, এটি আকর্ষণের গতি বাড়ায় না।
সুতরাং আপনি কোনও সারি তৈরির কারণ ছাড়াই আপনার যতটা লোক ফিট হতে পারেন তা রাখতে চান। আপনার সারি কেন (বা বাধা) স্ল্যামের উত্তরের প্রশ্নের উপর নির্ভর করে।
4
তবে সেরা নম্বরটি।
একটি সাধারণ সুপারিশ হ'ল এন + 1 থ্রেড, সিপিইউ কোরগুলির সংখ্যা উপলব্ধ। এইভাবে এন থ্রেডগুলি সিপিইউতে কাজ করতে পারে যখন 1 থ্রেড ডিস্ক I / O এর জন্য অপেক্ষা করছে। কম থ্রেড থাকা সিপিইউ রিসোর্সকে পুরোপুরি কাজে লাগায় না (এক পর্যায়ে সর্বদা আমি / ও অপেক্ষা করতে থাকব), আরও থ্রেড থাকা সিপিইউ রিসোর্সের উপর থ্রেডের লড়াইয়ের কারণ হতে পারে।
থ্রেডগুলি নিখরচায় আসে না, তবে প্রসঙ্গের স্যুইচের মতো ওভারহেড সহ, এবং - যদি সাধারণত থ্রেডগুলির মধ্যে ডেটা আদান-প্রদান করতে হয় - যা বিভিন্ন লকিংয়ের প্রক্রিয়া। কোডটি চালানোর জন্য আপনার যদি আরও ডেডিকেটেড সিপিইউ কোর থাকে কেবল তখনই এটি ব্যয় করতে পারে। একটি একক কোর সিপিইউতে একটি একক প্রক্রিয়া (কোনও আলাদা থ্রেড নেই) সাধারণত যে কোনও থ্রেডিংয়ের চেয়ে দ্রুত হয়। থ্রেডগুলি আপনার সিপিইউটিকে যাদুতে আরও দ্রুততর করে না, এর অর্থ অতিরিক্ত কাজ।
অন্যরা যেমন নির্দেশ করেছে ( স্ল্যাম উত্তর , আইটবিটটনি উত্তর ) এটি একটি জটিল প্রশ্ন এবং আরও অনেক কিছু যেহেতু আপনি কী কী ছড়িয়ে দিয়েছিলেন এবং কীভাবে তারা তা করে তা আপনি বর্ণনা করেন না।
তবে স্পষ্টতই আরও থ্রেড নিক্ষেপ করলে বিষয়গুলি আরও খারাপ হতে পারে।
সমান্তরাল কম্পিউটিংয়ের ক্ষেত্রে আমদাহলের আইন রয়েছে যা প্রযোজ্য (বা নাও পারে তবে আপনি নিজের সমস্যার বিবরণ বর্ণনা করতে পারেন না, তাই ....) এবং এই শ্রেণীর সমস্যার সম্পর্কে কিছু সাধারণ অন্তর্দৃষ্টি দিতে পারেন।
Amdahl আইন বিন্দু কোনও প্রোগ্রাম (যে কোন অ্যালগোরিদমের মধ্যে) এ সবসময় শতকরা যে যে করা যাবে না সমান্তরাল চালানো ( অনুক্রমিক অংশ ) এবং সেখানে অন্য একটি শতকরা হারের যে যাবে সমান্তরাল চালানো ( সমান্তরাল অংশ ) [একথাও ঠিক যে এই দুটি অংশ 100% পর্যন্ত যোগ করে]
এই অংশগুলি কার্যকর করার সময়ের শতাংশ হিসাবে প্রকাশ করা যেতে পারে। উদাহরণস্বরূপ, কঠোরভাবে ক্রমক্রমিক ক্রিয়াকলাপগুলিতে 25% সময় ব্যয় করা যেতে পারে এবং অবশিষ্ট 75% সময় অপারেশনে ব্যয় হয় যা সমান্তরালভাবে কার্যকর করা যায়।
( উইকিপিডিয়া থেকে চিত্র )
আমদাহের আইন পূর্বাভাস দিয়েছে যে কোনও প্রোগ্রামের প্রতিটি প্রদত্ত সমান্তরাল অংশের (উদাহরণস্বরূপ 75%) আপনি কেবলমাত্র এ পর্যন্ত কার্যকরকরণের গতি বাড়িয়ে দিতে পারবেন (উদাহরণস্বরূপ সর্বাধিক 4 বার) এমনকি আপনি কাজটি করার জন্য আরও বেশি প্রসেসর ব্যবহার করেন।
থাম্বের নিয়ম হিসাবে, আপনারা যত বেশি প্রোগ্রাম করেন যে আপনি সমান্তরাল সম্পাদনকে রূপান্তর করতে পারবেন না, তত বেশি এক্সিকিউশন ইউনিট (প্রসেসর) ব্যবহার করে আপনি যত কম অর্জন করতে পারবেন।
প্রদত্ত যে আপনি থ্রেড ব্যবহার করছেন (এবং শারীরিক প্রসেসর নয়) পরিস্থিতি এর চেয়ে আরও খারাপ হতে পারে। মনে রাখবেন যে থ্রেডগুলি প্রক্রিয়া করা যেতে পারে (বাস্তবায়নের এবং হার্ডওয়্যার উপলভ্য, যেমন সিপিইউ / কোরগুলির উপর নির্ভর করে) একই শারীরিক প্রসেসর / কোর ভাগ করে নেওয়ার (এটি অন্য একটি উত্তর হিসাবে নির্দেশিত হিসাবে মাল্টিটাস্কিংয়ের একটি রূপ)।
এই তাত্ত্বিক ভবিষ্যদ্বাণী (প্রায় সিপিইউ সময়) অন্যকে ব্যবহারিক বাধা হিসাবে বিবেচনা করে না
এটি ব্যবহারিক প্রয়োগগুলির ক্ষেত্রে সীমাবদ্ধ ফ্যাক্টর হতে পারে।
এখানে অপরাধী হওয়া উচিত "কন্টেন্ট স্যুইচিং"। এটি অন্য থ্রেড চালানো শুরু করার জন্য বর্তমান থ্রেডের অবস্থা সংরক্ষণের প্রক্রিয়া। যদি বেশ কয়েকটি থ্রেডকে একই অগ্রাধিকার দেওয়া হয় তবে কার্যকর করা শেষ না হওয়া পর্যন্ত এগুলি ঘুরিয়ে দেওয়া দরকার।
আপনার ক্ষেত্রে, যখন 50 টি থ্রেড রয়েছে কেবল 10 টি থ্রেডের সাথে তুলনা করা হলে প্রচুর প্রসঙ্গের স্যুইচিং হয়।
প্রসঙ্গের স্যুইচিংয়ের কারণে এবার ওভারহেডটি প্রবর্তিত কারণ এটিই আপনার প্রোগ্রামকে ধীরগতিতে চালিত করে
ps ax | wc -l
225 টি প্রক্রিয়া রিপোর্ট করে এবং এটি কোনওভাবেই ভারী বোঝা হয় না)। আমি @ আটবিটটোনির অনুমানের সাথে যেতে আগ্রহী; ক্যাশে অবৈধতা সম্ভবত একটি বড় ইস্যু, কারণ প্রত্যেক সময় আপনি কি ক্যাশে ফ্লাশ তবে CPU অপেক্ষা করতে হয়েছে eons র্যাম থেকে কোড এবং তথ্য জন্য।
আটবিটটোনির রূপক ঠিক করতে:
"কেন এমন হয়?" উত্তর এক ধরণের সহজ। ভাবুন আপনার কাছে দুটি সুইমিং পুল রয়েছে, একটি পূর্ণ এবং একটি খালি। আপনি সমস্ত জল এক থেকে অন্যটিতে সরিয়ে নিতে চান এবং আপনার কাছে 4 টি বালতি রয়েছে । সবচেয়ে দক্ষ লোক হ'ল ৪ জন।
আপনার যদি 1-3 জন থাকে তবে আপনি কিছু বালতি ব্যবহার করে নিখোঁজ রয়েছেন । আপনার যদি 5 বা ততোধিক লোক থাকে, তবে সেই লোকদের মধ্যে অন্তত একটি বালতির জন্য অপেক্ষা করতে আটকে আছে । আরও বেশি সংখ্যক লোক যুক্ত করা ... ক্রিয়াকলাপটিকে গতি দেয় না।
সুতরাং আপনি একই সাথে কিছু লোক (বালতি ব্যবহার) করতে পারেন এমন অনেক লোককে রাখতে চান ।
এখানে একজন ব্যক্তি একটি থ্রেড, এবং একটি বালতি যেকোন এক্সিকিউশন রিসোর্স হ'ল বাধা represents আরও কিছু থ্রেড যুক্ত করা যদি তারা কিছু না করতে পারে তবে তাতে কোনও লাভ হয় না। উপরন্তু, আমরা জোর উচিত যে অন্য এক ব্যক্তি থেকে একটি বালতি ক্ষণস্থায়ী সাধারণত শুধু বালতি একই দূরত্ব বহনকারী একটি একক ব্যক্তি তুলনায় ধীর হয়। অর্থাত্ একটি মূলকে ঘুরিয়ে দুটি থ্রেড সাধারণত দ্বিগুণ দীর্ঘ চলমান এক থ্রেডের চেয়ে কম কাজ সম্পাদন করে: এটি দুটি থ্রেডের মধ্যে স্যুইচ করার জন্য অতিরিক্ত কাজ করার কারণে।
সীমিতকরণ কার্যকরকরণ সংস্থান (বালতি) কোনও সিপিইউ, বা একটি কোর, বা আপনার উদ্দেশ্যগুলির জন্য একটি হাইপার-থ্রেডেড নির্দেশিকা পাইপলাইন নির্ভর করে আর্কিটেকচারের কোন অংশটি আপনার সীমিত ফ্যাক্টরের উপর নির্ভর করে। নোট এছাড়াও আমরা ধরে নিচ্ছি থ্রেডগুলি সম্পূর্ণ স্বতন্ত্র। এটি কেবলমাত্র যদি তারা কোনও ডেটা ভাগ না করে (এবং কোনও ক্যাশের সংঘর্ষ এড়ায়)।
যেহেতু কয়েকজন লোক পরামর্শ দিয়েছেন, আই / ও-র জন্য সীমাবদ্ধ সংস্থানটি কার্যকরভাবে সন্ধানযোগ্য I / O ক্রিয়াকলাপের সংখ্যা হতে পারে: এটি সম্পূর্ণ হোস্টওয়ার ও কার্নেল ফ্যাক্টরের উপর নির্ভর করে, তবে সহজে সংখ্যার চেয়ে অনেক বড় হতে পারে কোর। এখানে কনটেক্সট স্যুইচ যা এক্সিকিউট-বাউন্ড কোডের সাথে তুলনামূলকভাবে ব্যয়বহুল, I / O বাউন্ড কোডের তুলনায় বেশ সস্তা। দুঃখের সাথে আমি মনে করি আমি বালতি দিয়ে এটিকে ন্যায়সঙ্গত করার চেষ্টা করলে রূপকটি পুরোপুরি নিয়ন্ত্রণের বাইরে চলে যাবে।
নোট করুন যে I / O বাউন্ড কোডের সাথে সর্বোত্তম আচরণটি এখনও পাইপলাইন / কোর / সিপিইউতে প্রতি সর্বাধিক এক থ্রেড থাকে। তবে আপনাকে অ্যাসিনক্রোনাস বা সিঙ্ক্রোনাস / নন-ব্লকিং I / O কোড লিখতে হবে এবং তুলনামূলকভাবে ছোট পারফরম্যান্সের উন্নতি সর্বদা অতিরিক্ত জটিলতার ন্যায্যতা দেয় না।
গীত। মূল করিডোর রূপকটির সাথে আমার সমস্যাটি দৃ strongly়ভাবে প্রস্তাব দেয় যে আপনার 4 জন সারি থাকতে হবে, 2 টি সারি আবর্জনা বহন করতে হবে এবং 2 আরও সংগ্রহ করতে ফিরে আসবে। তারপর আপনি দালান যেমন প্রায় যতদিন প্রতিটি কিউ করতে পারেন, এবং যোগ করার মানুষ করেনি অ্যালগরিদম গতি বাড়াতে (আপনি মূলত একটি পরিবাহক বেল্ট মধ্যে পুরো বারান্দা পরিণত)।
প্রকৃতপক্ষে এই দৃশ্যটি টিসিপি নেটওয়ার্কিংয়ে ল্যাটেন্সি এবং উইন্ডো আকারের মধ্যে সম্পর্কের মানক বর্ণনার সাথে খুব মিল, যার কারণে এটি আমার দিকে ঝাঁপিয়ে পড়ে।
এটি বেশ সোজা এবং বুঝতে সহজ। আপনার সিপিইউ যা আপনাকে সমর্থন করে তার চেয়ে বেশি থ্রেড থাকা আসলে সিরিয়ালাইজ করা হয় এবং সমান্তরাল হয় না। আপনার সিস্টেম যত ধীরে ধীরে ধীরে ধীরে থাকবে। আপনার ফলাফলগুলি আসলে এই ঘটনার প্রমাণ।