6

का उपयोग करके लोड टेस्ट मैं एक कंसोल प्रोग्राम बना रहा हूं, जो एकाधिक क्लाइंट को अनुकरण करके कैश को पढ़ने/लिखने का परीक्षण कर सकता है, और निम्नलिखित कोड लिखा है। कृपया मेरी मदद को समझने:सी # Async Await

  • यह बहु ग्राहक अनुकरण
  • मैं और अधिक क्या कर सकते हैं यह एक वास्तविक लोड परीक्षण
बनाने के लिए प्राप्त करने के लिए सही तरीका है
void Main() 
{ 

    List<Task<long>> taskList = new List<Task<long>>(); 

    for (int i = 0; i < 500; i++) 
    { 
     taskList.Add(TestAsync()); 
    } 

    Task.WaitAll(taskList.ToArray()); 

    long averageTime = taskList.Average(t => t.Result); 

} 

public static async Task<long> TestAsync() 
{ 
    // Returns the total time taken using Stop Watch in the same module 
    return await Task.Factory.StartNew(() => // Call Cache Read/Write); 
} 
+1

ठीक लगता है, बस उल्लेख करने के लिए, डब्ल्यूसीएफ और कई अन्य सेवा होस्ट एक प्रेषक से अधिक भार को रोक देंगे, इसलिए यदि आप एक ही कंप्यूटर से अपनी सेवा पर हमला करते हैं, तो अन्य आसानी से आपकी सेवा तक पहुंच सकते हैं। –

+1

शायद कुछ कार्य 'फैक्ट्री.स्टार्टन्यू' के साथ निर्धारित हो सकते हैं और उनके निष्पादन में बड़ी संख्या में एक साथ कार्य करने में देरी होगी। – cassandrad

उत्तर

2

अपने कोड समायोजित थोड़ा सा यह देखने के लिए कि हमारे पास किसी विशेष समय पर कितने धागे हैं।

static volatile int currentExecutionCount = 0; 

static void Main(string[] args) 
{ 
    List<Task<long>> taskList = new List<Task<long>>(); 
    var timer = new Timer(Print, null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1)); 

    for (int i = 0; i < 1000; i++) 
    { 
     taskList.Add(DoMagic()); 
    } 

    Task.WaitAll(taskList.ToArray()); 

    timer.Change(Timeout.Infinite, Timeout.Infinite); 
    timer = null; 

    //to check that we have all the threads executed 
    Console.WriteLine("Done " + taskList.Sum(t => t.Result)); 
    Console.ReadLine(); 
} 

static void Print(object state) 
{ 
    Console.WriteLine(currentExecutionCount); 
} 

static async Task<long> DoMagic() 
{ 
    return await Task.Factory.StartNew(() => 
    { 
     Interlocked.Increment(ref currentExecutionCount); 
     //place your code here 
     Thread.Sleep(TimeSpan.FromMilliseconds(1000)); 
     Interlocked.Decrement(ref currentExecutionCount); 
     return 4; 
    } 
    //this thing should give a hint to scheduller to use new threads and not scheduled 
    , TaskCreationOptions.LongRunning 
    ); 
} 

परिणाम है: एक आभासी मशीन मैं 2 से 10 एक साथ चल अगर मैं संकेत का उपयोग नहीं करते धागे से है अंदर। इशारा के साथ - 100 तक। और असली मशीन पर मैं एक बार में 1000 धागे देख सकता हूं। प्रक्रिया एक्सप्लोरर इसकी पुष्टि करता है। hint पर कुछ विवरण उपयोगी होंगे।

+0

विशेष रूप से संकेत के बारे में जानकारी के एक दिलचस्प टुकड़े प्रदान करने के लिए बहुत धन्यवाद, यह निर्धारित करने के लिए कि प्रत्येक थ्रेड अलग-अलग क्लाइंट पर आवेदक है, निर्धारित समय के लिए –

2

यदि यह बहुत व्यस्त है, तो स्पष्ट रूप से आपके ग्राहकों को उनके अनुरोधों की सेवा करने से पहले कुछ देर इंतजार करना होगा। आपका प्रोग्राम इसका आकलन नहीं करता है, क्योंकि सेवा अनुरोध शुरू होने पर आपका स्टॉपवॉच चलना शुरू हो जाता है।

यदि आप यह भी मापना चाहते हैं कि अनुरोध समाप्त होने से पहले औसत समय के साथ क्या होता है, तो अनुरोध कब किया जाता है, जब अनुरोध किया जाता है, तो आपको अपना स्टॉपवॉच शुरू करना चाहिए।

आपका प्रोग्राम थ्रेड पूल से केवल थ्रेड लेता है। यदि आप अधिक कार्य शुरू करते हैं तो वहां धागे हैं, कुछ कार्यों को TestAsync चलने से पहले प्रतीक्षा करना होगा। यदि आपको समय कार्य याद है तो यह प्रतीक्षा समय मापा जाएगा। रुन कहा जाता है।

समय माप में दोष के अलावा, आप एक साथ कितने सेवा अनुरोध की अपेक्षा करते हैं? क्या आपके थ्रेड पूल में इसे अनुकरण करने के लिए पर्याप्त मुफ्त धागे हैं? यदि आप एक ही समय में लगभग 50 सेवा अनुरोधों की अपेक्षा करते हैं, और आपके थ्रेड पूल का आकार केवल 20 धागे है, तो आप एक ही समय में 50 सेवा अनुरोध कभी नहीं चलाएंगे। इसके विपरीत: यदि आपका थ्रेड पूल आपके अपेक्षित सेवा अनुरोधों की संख्या से बड़ा है, तो आप वास्तविक मामले की तुलना में अधिक समय मापेंगे।

अपने थ्रेड पूल में धागे की संख्या बदलने पर विचार करें, और सुनिश्चित करें कि कोई भी पूल के किसी भी थ्रेड का उपयोग नहीं करता है।

+0

अच्छे विवरण के लिए धन्यवाद, उनमें से भिन्न होंगे –

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