কত থ্রেড অনেক বেশি?


312

আমি একটি সার্ভার লিখছি, এবং অনুরোধটি গ্রহণ করার পরে আমি প্রতিটি ক্রিয়া একটি পৃথক থ্রেডে প্রেরণ করি। আমি এটি করি কারণ প্রায় প্রতিটি অনুরোধ ডেটাবেস কোয়েরি করে। আমি থ্রেডপুল লাইব্রেরি ব্যবহার করছি থ্রেডগুলি নির্মাণ / ধ্বংস হ্রাস করতে।

আমার প্রশ্ন: I / O থ্রেডগুলির মতো ভাল কাট অফ পয়েন্টটি কী? আমি জানি এটি কেবল মোটামুটি অনুমান হবে তবে আমরা কি কয়েকশ কথা বলছি? হাজার হাজার মানুষ?

এই কাটঅফটি কী হবে তা আমি কীভাবে খুঁজে বের করব?


সম্পাদনা করুন:

আপনার প্রতিক্রিয়াগুলির জন্য আপনাকে সকলকে ধন্যবাদ, মনে হচ্ছে আমার থ্রেডের গণনা সিলিং সন্ধান করার জন্য আমি কেবল এটি পরীক্ষা করতে যাচ্ছি। প্রশ্নটি যদিও: আমি কীভাবে জানি যে আমি সেই সিলিংটি মারলাম? আমি ঠিক কি পরিমাপ করা উচিত?


1
@ রিয়েগু: এখানে পুরো বিষয়টি হ'ল আপনি যদি থ্রিডপুলে কোনও সর্বাধিক সেট না করে থাকেন তবে যদি কোনও কার্য সম্পাদন সমস্যা না থাকে। কোনও থ্রেডপুলকে 100 ড্রেডের মধ্যে সীমাবদ্ধ করার বেশিরভাগ পরামর্শ হাস্যকর, বেশিরভাগ থ্রেড পুলগুলিতে তার চেয়ে / উপায় / বেশি থ্রেড থাকে এবং কখনও সমস্যা হয় না।
জিওচেট

রাইগুয়ে, নীচে আমার উত্তর ছাড়াও কী পরিমাপ করতে হবে তা দেখুন।
প্যাক্সিডিয়াবল্লো

ভুলে যাবেন না যে পাইথন প্রকৃতির দ্বারা, আসলে বহু-থ্রেড বান্ধব নয়। যে কোনও সময়, একটি একক বাইটকোড অপকোড কার্যকর করা হচ্ছে। কারণ পাইথন গ্লোবাল ইন্টারপ্রেটার লক নিয়োগ করে।
জিজ্ঞাসা

1
@ জে ডি: আমি যখন বলব যে আপনি যখন সিলিংটি ছুঁড়েছেন তখনই আপনার পারফরম্যান্স হ্রাস শুরু হবে।
নিনজালজ

6
@ জিওচেট "পুরো বিষয়টি এখানে আপনি থ্রেডপুলে কোনও সর্বাধিক সেট করা উচিত নয়" উম্মম ... বলুন কি? স্থির আকারের থ্রেড পুলগুলিতে গ্রেফিউল ডিগ্রেশন এবং স্কেলিবিলিটির সুবিধা রয়েছে। উদাহরণস্বরূপ, কোনও নেটওয়ার্ক সেটিংয়ে, আপনি যদি ক্লায়েন্ট সংযোগের ভিত্তিতে নতুন থ্রেড তৈরি করছেন, একটি নির্দিষ্ট পুলের আকার ছাড়াই আপনি আপনার সার্ভারটি কতগুলি থ্রেড পরিচালনা করতে পারবেন এবং প্রতিটি একক সংযুক্ত ক্লায়েন্টকে শেখার খুব প্রকৃত বিপদ ( শক্ত উপায় ) চালাচ্ছেন ভোগ করবে. একটি স্থির আকারের পুলটি আপনার সার্ভারকে চিবানোর চেয়ে বেশি কামড় দেওয়ার চেষ্টা করতে অস্বীকার করে পাইপ ভালভের মতো কাজ করে।
b1nary.atr0phy

উত্তর:


206

কিছু লোক বলে যে দুটি থ্রেড অনেক বেশি - আমি সেই শিবিরে পুরোপুরি নই :-)

এখানে আমার পরামর্শ: পরিমাপ, অনুমান করবেন না। একটি পরামর্শ হ'ল এটিকে কনফিগারযোগ্য করে শুরুতে এটি 100 এ সেট করুন, তারপরে আপনার সফ্টওয়্যারটিকে বন্যের কাছে ছেড়ে দিন এবং কী ঘটে তা পর্যবেক্ষণ করুন।

যদি আপনার থ্রেডের ব্যবহার 3 এ পৌঁছায় তবে 100 এর পরিমাণ অনেক বেশি। যদি দিনের বেশিরভাগ সময় এটি 100 এ থেকে যায় তবে 200 এটিকে টুকরো টুকরো করে দেখুন কী ঘটে see

আপনি পারে আসলে আপনার কোড নিজেই ব্যবহার নিরীক্ষণ ও পরবর্তী সময় এটা শুরু হয় কিন্তু যে সম্ভবত Overkill এর জন্য কনফিগারেশন সমন্বয় আছে।


স্পষ্টতা এবং ব্যাখ্যার জন্য:

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

আমি থ্রেড এবং ডাটাবেস সংযোগ পুলিং কোড লিখেছি এবং সেগুলির নিম্নলিখিত বৈশিষ্ট্য রয়েছে (যা আমি বিশ্বাস করি যে সম্পাদনের জন্য প্রয়োজনীয়):

  • সক্রিয় থ্রেডের সর্বনিম্ন সংখ্যা।
  • সর্বাধিক সংখ্যক থ্রেড।
  • থ্রেডগুলি বন্ধ করে দেওয়া হচ্ছে যা কিছুক্ষণ ব্যবহার করা হয়নি।

থ্রেড পুল ক্লায়েন্টের ক্ষেত্রে প্রথমে সর্বনিম্ন পারফরম্যান্সের জন্য একটি বেসলাইন সেট করে (থ্রেডগুলির এই সংখ্যাটি সর্বদা ব্যবহারের জন্য উপলব্ধ)। দ্বিতীয়টি সক্রিয় থ্রেড দ্বারা সংস্থান ব্যবহারের উপর একটি বিধিনিষেধ সেট করে। তৃতীয়টি আপনাকে শান্ত সময়ে বেসলাইনে ফিরিয়ে দেয় যাতে সম্পদের ব্যবহার হ্রাস করতে পারে।

কাজটি (বি) করার জন্য পর্যাপ্ত থ্রেড না থাকার সংস্থান ব্যবহারের বিরুদ্ধে অব্যবহৃত থ্রেড (এ) থাকার সংস্থান ব্যবহারের ভারসাম্য বজায় রাখতে হবে।

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

এজন্য আপনি মাপুন। আপনি যেমন বলেছিলেন, আপনার থ্রেডের সিংহভাগ ডাটাবেস থেকে প্রতিক্রিয়ার জন্য অপেক্ষা করবে যাতে সেগুলি চলবে না। দুটি বিষয় রয়েছে যেগুলি আপনাকে কতগুলি থ্রেডের জন্য অনুমতি দেওয়া উচিত তা প্রভাবিত করে।

প্রথমটি উপলব্ধ ডিবি সংযোগের সংখ্যা। আপনি এটি ডিবিএমএসে বাড়িয়ে না তুললে এটি একটি কঠিন সীমা হতে পারে - আমি ধরে নিচ্ছি যে আপনার ডিবিএমএস এক্ষেত্রে সীমাহীন সংযোগ নিতে পারে (যদিও আপনাকে আদর্শ হিসাবে এটিও পরিমাপ করা উচিত)।

তারপরে, আপনার যে থ্রেড থাকা উচিত তা আপনার historicalতিহাসিক ব্যবহারের উপর নির্ভর করে। আপনার যে ন্যূনতম চলতে হবে তা হ'ল সর্বনিম্ন নম্বরের সাথে আপনার সর্বদা ন্যূনতম নূন্যতম (+ উদাহরণস্বরূপ, এবং এটি এ এর ​​মতো কনফিগারযোগ্য করে তুলুন) 5 রয়েছে running

থ্রেডের সর্বাধিক সংখ্যাটি আপনার maximumতিহাসিক সর্বাধিক + বি% হওয়া উচিত।

আপনার আচরণের পরিবর্তনের জন্যও নজরদারি করা উচিত। যদি কোনও কারণে, আপনার ব্যবহার একটি উল্লেখযোগ্য সময়ের জন্য উপলব্ধ 100% এ যায় (যাতে এটি ক্লায়েন্টদের কার্যকারিতা প্রভাবিত করে), আপনি যতক্ষণ না এটি আবার বি% এর চেয়ে বেশি হন ততক্ষণ পর্যন্ত আপনাকে সর্বোচ্চ অনুমোদিত আপটিকে বাধা দেওয়া উচিত।


"আমি ঠিক কি পরিমাপ করা উচিত?" এর জবাবে প্রশ্ন:

আপনার বিশেষত যা পরিমাপ করা উচিত তা হ'ল বোঝার নিচে সাম্প্রতিক ব্যবহারের সর্বোচ্চ পরিমাণের থ্রেড (যেমন, ডিবি কল থেকে ফেরার অপেক্ষায়)। তারপরে উদাহরণস্বরূপ 10% এর সুরক্ষা ফ্যাক্টর যুক্ত করুন (জোর দেওয়া হয়েছে, যেহেতু অন্যান্য পোস্টারগুলি আমার উদাহরণগুলি নির্দিষ্ট প্রস্তাব হিসাবে বিবেচনা করে)।

উপরন্তু, এটি সুরক্ষা জন্য উত্পাদন পরিবেশে করা উচিত। আগে থেকে অনুমান করা ঠিক আছে তবে আপনি কখনই জানেন না কোন উত্পাদনটি আপনার পথে ফেলে দেবে (যার কারণে রানটাইম এ এই সমস্ত জিনিস কনফিগারযোগ্য হওয়া উচিত)। এটি ক্লায়েন্টের কলগুলিতে অপ্রত্যাশিত দ্বিগুণ হওয়ার মতো পরিস্থিতি ধরা।


যদি আগত অনুরোধগুলিতে থ্রেড তৈরি হয় তবে থ্রেড-ব্যবহার অরক্ষিত অনুরোধগুলির সংখ্যা মিরর করবে। এ থেকে "অনুকূল" নম্বর নির্ধারণের কোনও উপায় নেই। প্রকৃতপক্ষে আপনি আরও থ্রেডগুলি আরও সংস্থান ত্যাগের কারণ খুঁজে পাবেন এবং এইভাবে সক্রিয় থ্রেডগুলির সংখ্যা বাড়বে।
অ্যান্ড্রু গ্রান্ট

@ অ্যান্ড্রু, থ্রেড তৈরি করতে সময় লাগে এবং আপনি historicalতিহাসিক ডেটা [+ N%] এর উপর ভিত্তি করে অনুকূল সংখ্যা নির্ধারণ করতে পারেন (অতএব পরিমাপ করুন, অনুমান করবেন না)। এছাড়াও, আরও থ্রেড কেবলমাত্র যখন তারা কাজ করছে তখনই সংস্থান / সেমোফোরের জন্য অপেক্ষা না করে কেবলমাত্র সংস্থান বিষয়বস্তু তৈরি করে।
প্যাক্সিডিয়াবলো

থ্রেড পুল ব্যবহার করার সময় 'থ্রেড তৈরি' এর এই ডেটাটি পারফরম্যান্সে সমস্যা সৃষ্টি করে? একটি ভাল থ্রেড পুল কাজগুলির মধ্যে থ্রেড তৈরি এবং ধ্বংস করে না।
জিওচেট

@ প্যাক্স আপনার সমস্ত থ্রেড যদি ডিবি ক্যোয়ারী চালানোর জন্য একই বীজতলাতে অপেক্ষা করে থাকে তবে এটি বিতর্কটির খুব সংজ্ঞা। থ্রেডগুলি কোনও সেমফোরের জন্য অপেক্ষা করা থাকলে থ্রেডগুলির জন্য কোনও মূল্য হয় না তা বলাও ঠিক নয়।
অ্যান্ড্রু গ্রান্ট

1
@ অ্যান্ড্রু, আমি দেখতে পাচ্ছি না যে আপনি কেন ডিবি ক্যোয়ারীগুলি সেমফোর-ব্লক করতে চান, যে কোনও শালীন ডিবি প্রতিক্রিয়ার অপেক্ষায় অনেক থ্রেড সহ একযোগে অ্যাক্সেসের অনুমতি দেবে। এবং সেমফোর-ব্লক করার সময় থ্রেডগুলির কোনও প্রয়োগের সময় ব্যয় করা উচিত নয় , সেমফোরটি প্রকাশ না হওয়া পর্যন্ত তাদের অবরুদ্ধ সারিতে বসে থাকা উচিত।
প্যাক্সিডিয়াবলো

36

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

  1. থ্রেড স্ট্যাকের আকার: লিনাক্সে ডিফল্ট থ্রেড স্ট্যাকের আকার 8MB হয় (এটি খুঁজে বের করতে আপনি ইউলিমিট -a ব্যবহার করতে পারেন)।
  2. প্রদত্ত ওএস রূপটি সমর্থন করে এমন সর্বোচ্চ ভার্চুয়াল মেমরি। লিনাক্স কার্নেল ২.৪ 2 গিগাবাইটের একটি মেমরি ঠিকানা স্থান সমর্থন করে। কার্নেল ২.6 সহ, আমি কিছুটা বড় (3 গিগাবাইট)
  3. [1] প্রদত্ত সর্বোচ্চ ভিএম সমর্থিত প্রতি সর্বাধিক সংখ্যক থ্রেডের গণনা দেখায়। 2.4 এর জন্য এটি প্রায় 255 থ্রেডে পরিণত হয়েছে। ২.6 এর জন্য সংখ্যাটি কিছুটা বড়।
  4. আপনার কাছে কি কিমান্ডা কার্নেল শিডিয়ুলার। লিনাক্স ২.৪ কার্নেল শিডিয়ুলারের সাথে ২.6 এর তুলনা করে পরবর্তীতে আপনাকে একটি ও (1) সময়সূচী দেয় যা সিস্টেমে বিদ্যমান কাজগুলির সংখ্যার উপর নির্ভরশীলতা নেই, যখন প্রথমটি কোনও ও (এন) এর বেশি হয়। তেমনি কার্নেলের সময়সূচীর এসএমপি সক্ষমতাও সিস্টেমে সর্বাধিক সংখ্যক টেকসই থ্রেডগুলিতে ভাল ভূমিকা পালন করে।

এখন আপনি আরও স্ট্রেড সংযুক্ত করতে আপনার স্ট্যাকের আকার টিউন করতে পারেন তবে তারপরে আপনাকে থ্রেড ম্যানেজমেন্টের ওভারহেডগুলি বিবেচনা করতে হবে (সৃষ্টি / ধ্বংস এবং সময়সূচী)। আপনি সিপিইউগুলির মধ্যে থ্রেড মাইগ্রেশন ওভারহেডগুলি এড়াতে এবং ঠান্ডা নগদ সমস্যাগুলি এড়াতে নির্দিষ্ট প্রদত্ত প্রসেসের পাশাপাশি একটি নির্দিষ্ট থ্রেডে সিপিইউ অ্যাফিনিটি প্রয়োগ করতে পারেন।

মনে রাখবেন যে কেউ তার নিজের ইচ্ছায় হাজার হাজার থ্রেড তৈরি করতে পারে তবে লিনাক্স ভিএম থেকে বের হয়ে গেলে এটি এলোমেলোভাবে হত্যা প্রক্রিয়া শুরু করে (এভাবে থ্রেড)। এটি হ'ল ইউটিলিটি প্রোফাইলটি সর্বোচ্চ না বাড়ানো থেকে রক্ষা করা। (ইউটিলিটি ফাংশনটি প্রদত্ত পরিমাণ সংস্থানগুলির জন্য সিস্টেম ওয়াইড ইউটিলিটি সম্পর্কে বলে।

আমি নিশ্চিত যে উইন্ডোজ কার্নেল শিডিয়ুলার রিসোর্সের অতিরিক্ত ব্যবহারের সাথে মোকাবিলা করতে এই ধরণের কিছু করে does

[1] http://adywicaksono.wordpress.com/2007/07/10/i-can-not-create-more-than-255-threads-on-linux- কি-is-the-solutions/


17

যদি আপনার থ্রেডগুলি কোনও ধরণের রিসোর্স-নিবিড় কাজ (সিপিইউ / ডিস্ক) সম্পাদন করে থাকে তবে আপনি খুব কমই এক বা দু'টিরও বেশি উপকার পাবেন এবং খুব বেশি লোকেরা খুব দ্রুত পারফরম্যান্সকে মেরে ফেলবে।

'সেরা-কেস' হ'ল আপনার পরবর্তী থ্রেডগুলি প্রথমটি সম্পূর্ণ হওয়ার সময় স্টল হবে বা কারও কারও কাছে কম বিতর্কযুক্ত সংস্থানগুলিতে লো-ওভারহেড ব্লক থাকবে। সবচেয়ে খারাপ ক্ষেত্রে হ'ল আপনি ক্যাশে / ডিস্ক / নেটওয়ার্ককে ছোঁড়া শুরু করেন এবং মেঝেতে আপনার সামগ্রিক থ্রুপুট ড্রপ হয়।

একটি ভাল সমাধান হ'ল একটি পুলটিতে অনুরোধগুলি স্থান দেওয়া যা থ্রেড-পুল থেকে কর্মী থ্রেডগুলিতে প্রেরণ করা হয় (এবং হ্যাঁ, ক্রমাগত থ্রেড তৈরি / ধ্বংস এড়ানো একটি দুর্দান্ত প্রথম পদক্ষেপ)।

আপনার প্রোফাইলিং, আপনি যে হার্ডওয়্যারটি চালাচ্ছেন এবং মেশিনে সংঘটিত হতে পারে এমন অন্যান্য বিষয়ের উপর ভিত্তি করে এই পুলটিতে সক্রিয় থ্রেডের সংখ্যাটি তারপরে চিহ্নিত করা যায় এবং মাপানো যায়।


হ্যাঁ, এবং এটি একটি সারি বা অনুরোধের পুলের সাথে ব্যবহার করা উচিত।
অ্যান্ড্রু গ্রান্ট

2
@ অ্যান্ড্রু: কেন? প্রতিটি বার অনুরোধ পেলে থ্রেড পুলে এটি কোনও কাজ যুক্ত করা উচিত। যখন কোনও থ্রি উপলব্ধ থাকে তখন থ্রেড বরাদ্দ করা থ্রেড পুলের উপরে।
জিওচেট

সুতরাং যখন আপনার কাছে শত অনুরোধগুলি আসবে এবং থ্রেডের বাইরে থাকবে তখন আপনি কী করবেন? আরও তৈরি? অবরোধ করবেন? একটি ত্রুটি ফিরে? আপনার অনুরোধগুলি এমন একটি পুলে রাখুন যা প্রয়োজনের তুলনায় বৃহত্তর হতে পারে এবং থ্রেডগুলি নিখরচায় হয়ে যাওয়ার পরে এই সারিযুক্ত অনুরোধগুলি আপনার থ্রেড পুলে ফিড করুন।
অ্যান্ড্রু গ্রান্ট

1
@ অ্যান্ড্রু: আবারও আপনার থ্রেড পুলটি এটি পরিচালনা করছে।
জিওচেট

"বেশ কয়েকটি থ্রেড বেশ কয়েকটি কার্য সম্পাদন করার জন্য তৈরি করা হয়, যা সাধারণত একটি সারিতে সজ্জিত থাকে Typ সাধারণত, থ্রেডের চেয়ে অনেক বেশি কাজ রয়েছে a থ্রেডটি তার কাজটি শেষ করার সাথে সাথে এটি পরবর্তী কাজটি সারি থেকে অনুরোধ করবে যতক্ষণ না সমস্ত কাজ শেষ হয়ে যায় "
জিওচেট

10

একটি জিনিস আপনার মনে রাখা উচিত তা হল পাইথন (কমপক্ষে সি ভিত্তিক সংস্করণ) এমন এক বিশ্বব্যাপী ইন্টারপ্রেটার লক বলে যা ব্যবহার করে মাল্ট-কোর মেশিনগুলির পারফরম্যান্সে বিশাল প্রভাব ফেলতে পারে।

আপনার যদি সত্যিই মাল্টিথ্রেডেড অজগর থেকে সর্বাধিক প্রয়োজন হয় তবে আপনি জাইথন ​​বা কিছু ব্যবহার করার বিষয়টি বিবেচনা করতে পারেন।


4
এটি পড়ার পরে, আমি তিনটি থ্রেডে ইরোটোস্টিনিস কার্যগুলির চালনী চালানোর চেষ্টা করেছি। নিশ্চিতভাবেই, এটি একটি থ্রেডে একই কাজগুলি চালানোর চেয়ে 50% ধীর ছিল। সতর্ক থাকুন জন্য ধন্যবাদ। আমি একটি ভার্চুয়াল মেশিনে এক্লিপ্স পাইদেব চালাচ্ছিলাম যা দুটি সিপিইউ বরাদ্দ করা হয়েছিল। এরপরে, আমি এমন একটি দৃশ্যের চেষ্টা করব যাতে কিছু ডাটাবেস কল জড়িত।
ডন কার্কবি

3
দুটি (কমপক্ষে) ধরণের কাজ রয়েছে: সিপিইউ বাউন্ড (উদাহরণস্বরূপ চিত্র প্রক্রিয়াকরণ) এবং I / O আবদ্ধ (যেমন নেটওয়ার্ক থেকে ডাউনলোড করা)। স্পষ্টতই, জিআইএল "সমস্যা" আই / ও বাউন্ড কার্যগুলিকে খুব বেশি প্রভাবিত করবে না। যদি আপনার কাজগুলি সিপিইউ বাউন্ড হয় তবে আপনি মাল্টিথ্রেডিংয়ের পরিবর্তে মাল্টিপ্রসেসিং বিবেচনা করা উচিত।
iutinvg

1
হ্যাঁ, আপনার কাছে যদি প্রচুর নেটওয়ার্ক থাকে তবে পাইথন থ্রেডটি উন্নত হয়েছে I আমি এটিকে থ্রেডে পরিবর্তন করেছি এবং সাধারণ কোডের চেয়ে 10 * দ্রুত পেয়েছি ...
tyan

8

প্যাক্স যেমন ঠিক বলেছেন, মাপুন, অনুমান করবেন না । আমি ডিএনএসওয়ানির জন্য যা করেছি এবং ফলাফলগুলি অবাক করে দিয়েছে: দ্রুত ফল পেতে 15,000 থ্রেডের মতো কিছু থ্রেডের আদর্শ সংখ্যা আমার ধারণা থেকে অনেক বেশি ছিল।

অবশ্যই এটি অনেক কিছুর উপর নির্ভর করে, এজন্য আপনাকে অবশ্যই নিজেকে মাপতে হবে।

কম্বিয়েন ডি ফাইলস ডি'এক্সসিউশনে সম্পূর্ণ পদক্ষেপগুলি (কেবল ফরাসি ভাষায়) ?


1
15,000? এটি আমার প্রত্যাশার চেয়েও বেশি বাচ্চা। তবুও, যদি আপনি যা পেতেন, তবে আপনি যা পেয়েছিলেন তা নিয়ে আমি তর্ক করতে পারি না।
paxdiablo

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

18
আমি মনে করি যে যদি আপনার 15000 থ্রেড থাকে যা কিছু বাহ্যিক I / O- এ ব্লক করে চলেছে তবে এর থেকে আরও ভাল সমাধান ব্যাপকভাবে কম থ্রেড হবে তবে একটি অ্যাসিনক্রোনাস মডেল সহ। আমি এখানে অভিজ্ঞতা থেকে কথা বলা।
স্টিভ

5

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

আলাদাভাবে বলুন, একবার আপনি কিছুটা বাধা অতিক্রম করলে তা সিপিইউ, ডাটাবেস থ্রুপুট, ডিস্ক থ্রুপুট ইত্যাদি হয়ে যায়, আরও থ্রেড যুক্ত করা সামগ্রিক কর্মক্ষমতা বাড়িয়ে তুলবে না। তবে আপনি এই পয়েন্টটি আঘাত না করা পর্যন্ত আরও থ্রেড যুক্ত করুন!

নোট করুন যে এটি অনুমান করা সিস্টেম (গুলি) আপনার অ্যাপ্লিকেশনটির জন্য উত্সর্গীকৃত, এবং আপনাকে অন্যান্য অ্যাপ্লিকেশনগুলি সুন্দরভাবে খেলতে হবে না (অনাহার এড়ানো উচিত নয়)।


1
থ্রেড কাউন্টের জন্য আপনি যে কয়েকটি নম্বর দেখেছেন তার কয়েকটি উল্লেখ করতে পারেন? এটির একটি ধারণা পেতে এটি সহায়ক হবে। ধন্যবাদ।
কোভাক

3

"বড় আয়রন" উত্তরটি সাধারণত সীমিত সংস্থান প্রতি এক থ্রেড হয় - প্রসেসর (সিপিইউ বাউন্ড), আর্ম (আই / ও বাউন্ড), ইত্যাদি - তবে কেবলমাত্র যদি আপনি কাজটিকে সঠিক থ্রেডে রিসোর্সে স্থানান্তর করতে পারেন তবে এটি কার্যকর হয় অ্যাক্সেস করা।

যেখানে এটি সম্ভব নয়, বিবেচনা করুন যে আপনার কাছে ছত্রাকযোগ্য সংস্থান (সিপিইউ) এবং অ-ছত্রাকযোগ্য সম্পদ (অস্ত্র) রয়েছে। সিপিইউগুলির জন্য প্রতিটি থ্রেড নির্দিষ্ট সিপিইউতে নির্ধারিত করা সমীচীন নয় (যদিও এটি ক্যাশে পরিচালনার ক্ষেত্রে সহায়তা করে), তবে বাহুগুলির জন্য, আপনি যদি বাহুতে কোনও থ্রেড বরাদ্দ করতে না পারেন, আপনি কুইউনিং তত্ত্বে যান এবং অস্ত্র রাখার জন্য সর্বোত্তম সংখ্যাটি কী ব্যস্ত. সাধারণত আমি ভাবছি যে আপনি যদি ব্যবহৃত হাতের ভিত্তিতে অনুরোধগুলি রুট করতে না পারেন, তবে প্রতি বাহুতে 2-3 থ্রেড থাকা সঠিক হতে চলেছে।

থ্রেডে পাস করা ইউনিট কাজের যুক্তিযুক্ত পারমাণবিক ইউনিটটি সম্পাদন করে না তখন একটি জটিলতা দেখা দেয়। উদাহরণস্বরূপ, আপনার এক পর্যায়ে থ্রেডটি ডিস্ক অ্যাক্সেস করতে পারে, অন্য সময়ে নেটওয়ার্কে অপেক্ষা করুন on এটি "ফাটলগুলির" সংখ্যা বাড়ায় যেখানে অতিরিক্ত থ্রেডগুলি প্রবেশ করতে পারে এবং দরকারী কাজ করতে পারে, তবে এটি অতিরিক্ত থ্রেডগুলির একে অপরের ক্যাশে ইত্যাদিকে দূষিত করার এবং সিস্টেমটিকে হ্রাস করার সুযোগকে বাড়িয়ে তোলে।

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

আমি অনুশীলনে যা দেখেছি তা হ'ল খুব সূক্ষ্ম পার্থক্য কতটা থ্রেড অনুকূল হয় তার মধ্যে বিশাল পার্থক্য করতে পারে। বিশেষত, ক্যাশে সমস্যা এবং লক বিরোধগুলি ব্যবহারিক সম্মিলনের পরিমাণকে সীমাবদ্ধ করতে পারে।


2

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


2
ওম, না থ্রেডগুলির পুরো বিন্দুটি ছিল (মাল্টিকোর এবং একাধিক প্রসেসর প্রচলিত হওয়ার আগে) কেবলমাত্র একটি মেশিনে একাধিক প্রসেসর রাখার নকল করতে সক্ষম হবেন। এভাবেই আপনি প্রতিক্রিয়াশীল ব্যবহারকারী ইন্টারফেসগুলি পাবেন - একটি প্রধান থ্রেড এবং আনুষাঙ্গিক থ্রেড।
এমএমআর

1
@ মিমর: উম নং থ্রেডগুলির ধারণাটি হ'ল I / O এবং অন্যান্য কাজগুলিকে ব্লক করার অনুমতি দেয়।
জিওচেট

4
আমি যে বিবৃতি দিয়েছি তা হ'ল যে কোনও মেশিনে কোরগুলির সংখ্যা একটি নির্দিষ্ট সময়ে কাজ করতে পারে এমন থ্রেডের সংখ্যার উপর একটি কঠোর সীমাবদ্ধতা উপস্থাপন করে, যা সত্য। অবশ্যই অন্যান্য থ্রেডগুলি I / O অপারেশনগুলি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করতে পারে এবং এই প্রশ্নের জন্য এটি একটি গুরুত্বপূর্ণ বিবেচনা।
নিউডায়ারিসিং

1
যাইহোক - পাইথনে আপনার জিআইএল রয়েছে, যা থ্রেডগুলিকে কেবল তাত্ত্বিকভাবে সমান্তরাল করে তোলে। একাধিক থ্রেড একসাথে চলতে পারে না, সুতরাং এটি কেবল প্রতিক্রিয়াশীলতা এবং অবরুদ্ধ অপারেশনগুলির জন্য গুরুত্বপূর্ণ।
Abgan

2
+1 প্রকৃতপক্ষে কম্পিউটারগুলি কীভাবে কাজ করে তা বোঝার জন্য। @ মিমার: আপনার একাধিক প্রসেসর রয়েছে বলে মনে হয় এবং এর মধ্যে একাধিক প্রসেসর রয়েছে তার মধ্যে পার্থক্য বুঝতে হবে। @ রিচ বি: থ্রেডের একটি সংগ্রহ পরিচালনা করার জন্য একটি থ্রেড পুল হ'ল উপায়গুলির মধ্যে একটি। এটি একটি ভাল, তবে অবশ্যই একমাত্র নয়।
শোক করুন

2

আমি মনে করি এটি আপনার প্রশ্নের কাছে কিছুটা ফাঁস, তবে কেন এগুলি প্রক্রিয়াগুলিতে কাঁটাচামচ করবেন না? নেটওয়ার্কিং সম্পর্কে আমার বোঝাপড়া (ইওর এর বেহাল দিনগুলি থেকে, আমি আসলে নেটওয়ার্কগুলি কোড করি না) হ'ল প্রতিটি আগত সংযোগটি একটি পৃথক প্রক্রিয়া হিসাবে পরিচালনা করা যেতে পারে, কারণ যদি কেউ আপনার প্রক্রিয়ায় খারাপ কিছু করে তবে তা হয় না পুরো প্রোগ্রাম nuke।


1
পাইথনের ক্ষেত্রে এটি বিশেষত সত্য, কারণ একাধিক প্রক্রিয়া সমান্তরালে চলতে পারে, যখন একাধিক থ্রেড থাকে না - না। খরচ অবশ্য বেশ বেশি। আপনাকে প্রতিবার নতুন পাইথন ইন্টারপ্রেটার শুরু করতে হবে এবং প্রতিটি প্রক্রিয়াটির সাথে ডিবিতে সংযুক্ত করতে হবে (বা কিছু পাইপ পুনঃনির্দেশ ব্যবহার করুন, তবে এটি একটি দামেও আসে)।
অবগান

প্রক্রিয়াগুলির মধ্যে স্যুইচিং হ'ল - বেশিরভাগ সময় - থ্রেডগুলির মধ্যে স্যুইচিংয়ের চেয়ে বেশি ব্যয়বহুল (কিছু রেজিস্টারের পরিবর্তে পুরো প্রসঙ্গের স্যুইচ)। শেষে এটি আপনার থ্রেডিং-লিবের উপর খুব বেশি নির্ভর করে। প্রশ্নগুলি থ্রেডিংয়ের চারদিকে ঘোরে যাওয়ার সাথে সাথে আমি ধরে নিয়েছি যে প্রক্রিয়াগুলি ইতিমধ্যে প্রশ্নের বাইরে রয়েছে।
লিওনিডাস

যথেষ্ট ফর্সা। আমি নিশ্চিত না কেন সে কারণেই আমি স্কোরটিতে একটি -2 ডিং পাচ্ছি, যদিও লোকেরা সত্যিই থ্রেড-কেবলমাত্র উত্তরগুলি দেখতে চায় না, যদি না অন্য কাজগুলি উত্তরগুলি যুক্ত করে।
এমএমআর

@ মিমি: প্রশ্নটি / থ্রেড / পুল সম্পর্কে ছিল, হ্যাঁ, আমি মনে করি লোকেরা থ্রেড সম্পর্কে একটি উত্তর আশা করা উচিত।
জিওচেট

প্রক্রিয়া তৈরি একবার স্টার্টআপে করা যেতে পারে (যেমন, থ্রেড পুলের পরিবর্তে একটি প্রক্রিয়া পুল)। অ্যাপ্লিকেশন সময়কালে Amorised, এটি ছোট হতে পারে। তারা সহজেই তথ্য ভাগ করতে পারে না তবে এটি তাদের মাল্টি-সিপিইউগুলিতে চালনার সম্ভাবনা কিনে যাতে এই উত্তরটি কার্যকর। +1 টি।
প্যাক্সিডিয়াবলো

1

রাইগ্যু, আমি বর্তমানে একটি অনুরূপ অ্যাপ্লিকেশন বিকাশ করছি এবং আমার থ্রেড নম্বর 15 এ সেট করা হয়েছে Unfortunately দুর্ভাগ্যক্রমে আমি যদি এটি 20 এ বাড়িয়ে দিই, এটি ক্র্যাশ হয়ে যায়। সুতরাং, হ্যাঁ, আমি মনে করি এটি পরিচালনা করার সর্বোত্তম উপায় হ'ল আপনার বর্তমান কনফিগারেশনটি একাধিক থ্রেডের কম-বেশি অনুমতি দেয় কিনা তা মাপানো।


5
আপনার থ্রেড কাউন্টে যুক্ত করা এলোমেলোভাবে আপনার অ্যাপ্লিকেশনটিকে ক্রাশ করা উচিত নয়। কিছু কারণ আছে। আপনি কারণটি নির্ধারণ করতে ভাল করবেন কারণ এটি আপনাকে কিছু পরিস্থিতিতে কম থ্রেড সহ প্রভাবিত করতে পারে, কে জানে।
ম্যাথু লন্ড

-6

বেশিরভাগ ক্ষেত্রে আপনার থ্রেড পুলটিকে এটি পরিচালনা করতে দেওয়া উচিত। আপনি যদি কিছু কোড পোস্ট করেন বা আরও বিশদ বিবরণ দেন তবে থ্রেড পুলের ডিফল্ট আচরণটি সর্বোত্তম না হওয়ার কারণ রয়েছে কিনা তা দেখতে সহজ হতে পারে।

এটি কীভাবে কাজ করবে সে সম্পর্কে আপনি আরও তথ্য পেতে পারেন: http://en.wikedia.org/wiki/Thread_pool_ Pattern


1
@ প্যাক্স: এই প্রথম সংখ্যাগরিষ্ঠ মানুষ হাতের কাছে প্রশ্নের উত্তর দিতে (বা এটি বুঝতে) চান না। আমি চিন্তিত নই.
জিওচেট

-10

সিপিইউ কোর হিসাবে যতগুলি থ্রেড আমি তা প্রায়শই শুনেছি।


1
এটা অত্যন্ত ভুল।
জিওচেট

5
@ রিচ, কমপক্ষে ব্যাখ্যা করুন কেন :-)। এই থিমটি শুধুমাত্র তখনই প্রযোজ্য যখন সমস্ত থ্রেড সিপিইউ-আবদ্ধ থাকে; তারা প্রতিটি একটি 'সিপিইউ' পেতে। যখন অনেকগুলি থ্রেড আই / ও বাউন্ডেড থাকে, সাধারণত 'সিপিইউ'র চেয়ে অনেক বেশি থ্রেড থাকা ভাল (সিপিইউ উদ্ধৃত হয় যেহেতু এটি বাস্তবায়নের শারীরিক থ্রেডগুলিতে প্রযোজ্য, যেমন কোর)।
paxdiablo

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

1
@ রিচ: যখন (আসল) থ্রেডিং হচ্ছে, তখন সিপিইউ গণনা বহন করে যেহেতু আপনি একাধিক অ-অপেক্ষমান থ্রেডগুলি সহসাথে চালাতে পারেন। একটি সিপিইউ দিয়ে, কেবল একটি রান করে এবং অন্যান্য বহু থ্রেড নন-সিপিইউ সংস্থার জন্য অপেক্ষা করা থেকে সুবিধা উপার্জন করে।
paxdiablo

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