2011-06-07 11 views
7

मैं ऐसे परिदृश्य की नकल करने की कोशिश कर रहा हूं जहां 300,000 उपभोक्ता एक सर्वर तक पहुंच रहे हैं। इसलिए मैं समवर्ती धागे से सर्वर से बार-बार पूछताछ करके छद्म क्लाइंट बनाने की कोशिश कर रहा हूं।क्या हम सी # एप्लिकेशन में 300,000 धागे बना सकते हैं और इसे पीसी पर चला सकते हैं?

लेकिन पहली बाधा को मंजूरी देने के लिए, क्या पीसी पर 300,000 धागे चलाने के लिए संभव है? यहाँ एक कोड है जो मैं तो वास्तविक समारोह के साथ परीक्षण समारोह की जगह शुरू में कितने अधिकतम धागे मैं प्राप्त कर सकते हैं देखने के लिए उपयोग कर रहा हूँ, और बाद में है:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 

namespace CheckThread 
{ 
    class Program 
    { 
     static int count; 

     public static void TestThread(int i) 
     { 
      while (true) 
      { 
       Console.Write("\rThread Executing : {0}", i); 
       Thread.Sleep(500); 
      } 
     } 

     static void Main(string[] args) 
     { 
      count = 0; 
      int limit = 0; 
      if (args.Length != 1) 
      { 
       Console.WriteLine("Usage CheckThread <number of threads>"); 
       return; 
      } 
      else 
      { 
       limit = Convert.ToInt32(args[0]); 
      } 
      Console.WriteLine(); 
      while (count < limit) 
      { 
       ThreadStart newThread = new ThreadStart(delegate { TestThread(count); }); 
       Thread mythread = new Thread(newThread); 
       mythread.Start(); 
       Console.WriteLine("Thread # {0}", count++); 
      } 

      while (true) 
      { 
       Thread.Sleep(30*1000); 
      } 
     } // end of main 
    } // end of CheckThread class 
} // end of namespace 

अब क्या मैं अवास्तविक हो सकता है कोशिश कर रहा हूँ, लेकिन अभी भी, अगर ऐसा करने का कोई तरीका है और आप जानते हैं, तो कृपया मेरी मदद करें।

+2

http://stackoverflow.com/questions/145312/maximum-number-of-threads-in-a-net-app – holtavolt

+5

का डुप्लिकेट की तरह लग रहा से यदि आप "रन" मतलब धागे के बीच थ्रैशिंग ... हे –

+0

मुझे खेद है कि मैंने इस उद्देश्य को बहुत स्पष्ट नहीं किया। मेरा सेटअप एक सर्वर-क्लाइंट सेटअप है। मैं क्लाइंट को तनाव देना चाहता हूं, न कि सर्वर पर।सेटअप में, प्रक्रियाएं क्लाइंट प्रक्रिया को चलाने का अनुरोध देती हैं और क्लाइंट प्रक्रिया सर्वर को सेवा के अनुरोध को आगे बढ़ाएगी। लेकिन मुझे वह बिंदु मिल गया है, जिसे हम सभी एक दूसरे पर बना रहे हैं, यह कि एक मशीन पर इन धागे को अवास्तविक बनाना और अनुशंसित नहीं है। इसके अलावा, क्लाइंट पर तनाव पैदा करने का मेरा इरादा इन धागे को कम से कम एक मिनट में निष्पादित करने का इरादा रखता है, हर 1 मिनट में बहुत अधिक लग रहा है! :( –

उत्तर

6

प्रत्येक धागा अपने स्वयं के ढेर और स्थानीय संग्रहण बनाएगा है, तो आप एक 32bit ओएस पर धागा प्रति लगभग 512K ढेर अंतरिक्ष के लिए देख रहे हैं, मुझे लगता है कि स्टैक स्पेस 64 बिट ओएस पर दोगुना हो जाता है। स्प्रेडशीट कैल्क की एक त्वरित पीठ हमें आपके 300k ग्राहकों के लिए 146.484375 स्टैक स्पेस प्रदान करती है।

तो, नहीं, 300k धागे न बनाएं, बल्कि 300k अनुरोधों को अनुकरण करने के लिए थ्रेडपूल का उपयोग करें, हालांकि मुझे लगता है कि आप नेटवर्क सर्वर इंटरफ़ेस के माध्यम से अपने सर्वर को स्पैम करने वाले कई परीक्षण क्लाइंट के साथ बेहतर होंगे।

बहुत सारे वेब लोड-परीक्षण टूल उपलब्ध हैं। अच्छा प्रारंभ बिंदु: http://www.webperformance.com/library/reports/TestingAspDotNet/

4

आप ThreadPool.SetMaxThreads विधि को कॉल करके थ्रेड के अधिकतम ननबर्ग को बदल सकते हैं। 300,000 धागे शायद अपने पीसी * विस्फोट

कर देगा * यह शायद एक अतिशयोक्ति

+0

इस सवाल से कोई लेना देना नहीं है क्योंकि वह थ्रेडपूल का उपयोग नहीं कर रहा है। – Sven

+1

शायद एक असाधारणता, लेकिन उसे स्मृति में कई धागे रखने के लिए 300 गीगा रैम की तरह कुछ चाहिए। –

1

Asnet प्रत्येक clr धागे के लिए संपूर्ण ढेर (1 एमबी) करता है; जैसा कि बेन कहते हैं, आपका पीसी वास्तव में विस्फोट कर सकता है। या संभवतः ओओएम।

3

भाषा-नास्तिक जवाब:

बेहतर तरीका शायद के बारे में इस रिएक्टर पद्धति का उपयोग कर रहा है, 1 या 2 प्रति कोर समवर्ती धागे की एक अधिकतम के साथ जाने के लिए।

+0

यदि आप उपयोग करने जा रहे हैं रिएक्टर पैटर्न यह सहायक हो सकता है: http://www.robertsindall.co.uk/blog/the-reactor-pattern-using-c-sharp/ – Robs

0

ठीक है, 300K धागे बनाने की कोशिश करते समय आपके परीक्षण का नतीजा क्या था? मैं इसे अपने ऊपर करने की कोशिश नहीं कर रहा हूँ!

आप 300K क्लाइंट को एक साथ फिर से कनेक्ट नहीं कर सके क्योंकि एक सर्वर पर पर्याप्त सॉकेट उपलब्ध नहीं हैं, (इसलिए खेती)।

मैंने कुछ सर्वर परीक्षण किए हैं और, अधिक सॉकेट उपलब्ध कराने के लिए रजिस्ट्री को ट्वीव करके, मेरे पास एक सर्वर से जुड़े 24 के सॉकेट हैं, सभी एक बॉक्स। सर्वर < के बाद से कुछ हद तक मैं अपेक्षा कर रहा था> क्लाइंट कनेक्शन को प्रत्येक सिरे पर एक सॉकेट ऑब्जेक्ट की आवश्यकता होती है और केवल 64 के सॉकेट उपलब्ध होते हैं। मैंने अपने परीक्षण के लिए 24 के धागे बनाने का प्रयास नहीं किया, मैंने क्लाइंट थ्रेड क्लास का उपयोग किया जो एक सूची में एकाधिक क्लाइंट सॉकेट ऑब्जेक्ट्स पर खोले/बंद कनेक्शन।

Rgds, मार्टिन

+0

असल में आपको स्पष्ट रूप से बता रहा है .. मैं उस चिह्न के नजदीक कहीं भी नहीं जा सका ! मैंने अंतराल में धागे की संख्या में वृद्धि की .. तो अधिकतम अधिकतम 5k धागे तक पहुंच गया। –

संबंधित मुद्दे