2015-12-10 8 views
11

मैं निम्नलिखित कोड है कि JMeter साथ मैं बेंचमार्क और मेरे स्थानीय होस्ट मशीन पर प्रति सेकंड 3000 के बारे में अनुरोध प्राप्त (await जानबूझकर गायब है तुल्यकालिक चलाने के लिए) है:बेंचमार्किंग ASP.NET समवर्ती अनुरोध खराब परिणाम

public async Task<HttpResponseMessage> Get() 
{ 
    var resp = new HttpResponseMessage(HttpStatusCode.OK); 
    resp.Content = new StringContent(Thread.CurrentThread.ManagedThreadId.ToString(), Encoding.UTF8, "text/plain"); 
    return resp; 
} 

समस्या यह है कि जब मैं एक सेकंड नीचे की तरह के लिए अनुरोध रोकते हैं, किसी कारण से प्रवाह क्षमता प्रत्येक w3wp.exe प्रक्रिया के लिए प्रति सेकंड 10 अनुरोध करने के लिए नीचे (फिर await जानबूझकर गायब है तुल्यकालिक चलाने के लिए) है:

public async Task<HttpResponseMessage> Get() 
    { 
     Task.Delay(1000).Wait(); 
     var resp = new HttpResponseMessage(HttpStatusCode.OK); 
     resp.Content = new StringContent(Thread.CurrentThread.ManagedThreadId.ToString(), Encoding.UTF8, "text/plain"); 
     return resp; 
    } 

यहां तक ​​कि जब मैं await प्रयोग करते हैं कोई फर्क नहीं है और प्रति सेकंड 10 अनुरोधों बिल्कुल सुधार नहीं होता:

public async Task<HttpResponseMessage> Get() 
{ 
    await Task.Delay(1000); 
    var resp = new HttpResponseMessage(HttpStatusCode.OK); 
    resp.Content = new StringContent(Thread.CurrentThread.ManagedThreadId.ToString(), Encoding.UTF8, "text/plain"); 
    return resp; 
} 

मैं सभी config सेटिंग्स की कोशिश की और कुछ भी नहीं सब पर किसी भी परिवर्तन बनाता है: `

web.config

<system.net> 
    <connectionManagement> 
     <add address="*" maxconnection="65400" /> 
    </connectionManagement> 
    </system.net> 

aspnet.co nfig

<system.web> 
    <applicationPool 
     maxConcurrentThreadsPerCPU="100" /> 
    </system.web> 

machine.config

<processModel 
autoConfig="false" 
memoryLimit="70" 
maxWorkerThreads="100" 
maxIoThreads="100" /> 

कॉन्फ़िगरेशन दोनों x86 और x64 के लिए सेट कर रहे हैं

मैं मेम के 32 gigs और 4 शारीरिक कोर, Windows 10

सीपीयू 10% से अधिक भार नहीं जाता है प्रति सेकंड 10 अनुरोध बेंचिंग।

उपरोक्त कोड WEB API का उपयोग करता है, लेकिन निश्चित रूप से मैं एक HTTP हैंडलर का उपयोग करके एक ही परिणाम पुन: पेश करता हूं।

+3

एक भी सामान्य प्रयोजन वेबसर्वर एक अच्छी तरह से डिजाइन ASP.NET अनुप्रयोग लगभग 300 अनुरोध/वास्तविक उपयोगकर्ता बातचीत की रों कार्रवाई करेंगे का उपयोग करना। खराब आर्किटेक्टेड सिस्टम उन शून्यों को गायब होने लगते हैं। एक विंडोज सर्वर पर थ्रूपुट बढ़ाने के लिए आप "वेब बागान" का उपयोग करना चाहते हैं। आम तौर पर आपकी बाधा आपके वेबसर्वर नहीं है लेकिन आपकी साझा स्थिति (जैसे आपका डेटाबेस)। –

+0

@ChrisMarisic मैं एक वेब बाग का उपयोग करता हूं – realPro

+1

10 req/s एक अनुरोध निष्पादन अवधि के लिए 1 सेकंड किसी भी तकनीक के साथ सामान्य लगता है। और यह भी सामान्य है कि सीपीयू का उपयोग नहीं किया जाता है (अनुरोध किसी भी प्रोसेसिंग के बिना बस प्रतीक्षा करें)। आप क्या उम्मीद करते हैं? –

उत्तर

2

यहां एक संभावित समझ है। वैसे भी जांच करने के लिए एक।

कार्य। डेले() एक नया कार्य बनाता है, जिसका काम रोकना है। अगर मैं सही समझता हूं, तो कार्य अक्सर नेट वर्कर पूल को भेज दिया जाता है, जिसमें सीमित आकार होता है। (आप ThreadPool.GetMaxThreads के साथ जांच सकते हैं) जब आप बहुत अधिक डालने का प्रयास करते हैं, तो कोड 'बैक अप' होगा क्योंकि यह थ्रेड पूल के लिए स्पेस रखने की प्रतीक्षा करता है।

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

आम तौर पर, काम करने के लिए प्रतीक्षा करते समय महंगी आईओ डेटाबेस क्वेरी या फ़ाइल आईओ उपज नियंत्रण जैसे कार्य करते हैं। मुझे आश्चर्य है कि क्या कार्य। डेले अधिक 'चिपचिपा' है।

सिस्टम के लिए टास्क। डेले() को स्वैप करने का प्रयास करें। थ्रेडिंग। पढ़ना। सो जाओ() और देखें कि क्या कुछ भी बदलता है या नहीं।

+0

सिस्टम का उपयोग करना। थ्रेडिंग। थ्रेड। नींद() प्रति सेकेंड अनुरोधों को प्रति सेकंड 8 अनुरोधों तक और भी छोड़ देता है। – realPro

1

मुझे विंडोज 8 के लिए पता है कि सर्वर वर्कलोड चलाने के लिए उपभोक्ता ओएस का उपयोग करने की कोशिश करने वाले लोगों को रोकने के लिए 10 की अधिकतम समवर्ती कनेक्शन सीमा है। मुझे कोई कारण नहीं दिखता कि विंडोज 10 अलग क्यों होगा।

http://blogs.iis.net/owscott/windows-8-iis-8-concurrent-requests-limit

+0

हां, मैंने इस पोस्ट को भी देखा और परीक्षण चलाने के लिए सर्वर 2016 स्थापित किया, लेकिन व्यवहार किसी भी तरह से नहीं बदला। – realPro

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