हमारे पास एक आवेदन है जिसमें IIS7 पर WCF सेवा (* .svc) चल रही है और विभिन्न ग्राहक सेवा को क्वेरी कर रहे हैं। सर्वर Win 2008 सर्वर चला रहा है। क्लाइंट या तो विंडोज 2008 सर्वर या विंडोज 2003 सर्वर चला रहे हैं। मुझे निम्नलिखित अपवाद मिल रहे हैं, जो मैंने देखा है कि वास्तव में बड़ी संख्या में संभावित डब्ल्यूसीएफ मुद्दों से संबंधित हो सकता है।
System.TimeoutException: The request channel timed out while waiting for a reply after 00:00:59.9320000. Increase the timeout value passed to the call to Request or increase the SendTimeout value on the Binding. The time allotted to this operation may have been a portion of a longer timeout. ---> System.TimeoutException: The HTTP request to 'http://www.domain.com/WebServices/myservice.svc/gzip' has exceeded the allotted timeout of 00:01:00. The time allotted to this operation may have been a portion of a longer timeout.
मैंने समय सीमा बढ़ाकर 30 मिनट कर दी है और त्रुटि अभी भी हुई है। यह मुझे बताता है कि कुछ और खेल में है, क्योंकि डेटा की मात्रा कभी भी अपलोड या डाउनलोड करने के लिए 30 मिनट नहीं ले सकती है।
त्रुटि आती है और जाती है। फिलहाल, यह अधिक लगातार है। इस बात से कोई फर्क नहीं पड़ता कि मेरे 3 ग्राहक एक साथ चल रहे हैं या 100, यह अभी भी एक बार में होता है। ज्यादातर समय, कोई टाइमआउट नहीं होता है लेकिन मुझे अभी भी प्रति घंटे कुछ मिलता है। त्रुटि किसी भी विधि से आती है जिसे लागू किया जाता है। इन विधियों में से एक में पैरामीटर नहीं है और थोड़ा सा डेटा लौटाता है। एक और पैरामीटर के रूप में बहुत सारे डेटा लेता है लेकिन एसिंक्रोनस रूप से निष्पादित करता है। त्रुटियां हमेशा क्लाइंट से उत्पन्न होती हैं और स्टैक ट्रेस में सर्वर पर किसी भी कोड को संदर्भित नहीं करती हैं। यह हमेशा समाप्त होता है:
at System.Net.HttpWebRequest.GetResponse()
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
सर्वर पर: मैंने कोशिश की है (और वर्तमान में) निम्नलिखित बाध्यकारी सेटिंग्स हैं:
maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647"
इसका असर नहीं दिख रहा है।
मैंने कोशिश की है (और वर्तमान में) निम्न थ्रॉटलिंग सेटिंग्स:
<serviceThrottling maxConcurrentCalls="1500" maxConcurrentInstances="1500" maxConcurrentSessions="1500"/>
इसका असर नहीं दिख रहा है।
वर्तमान में मेरे पास WCF सेवा के लिए निम्नलिखित सेटिंग्स हैं।
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]
मैं ConcurrencyMode.Multiple
थोड़ी देर तक साथ रहा , और फिर भी त्रुटि हुई।
मैंने IIS को पुनरारंभ करने का प्रयास किया है, मेरे अंतर्निहित SQL सर्वर को पुनरारंभ करके, मशीन को पुनरारंभ करना। इन सबका असर नहीं दिख रहा है।
मैंने Windows फ़ायरवॉल को अक्षम करने का प्रयास किया है। इसका असर नहीं दिख रहा है।
क्लाइंट पर, मेरे पास ये सेटिंग्स हैं:
maxReceivedMessageSize="2147483647"
<system.net>
<connectionManagement>
<add address="*" maxconnection="16"/>
</connectionManagement>
</system.net>
मेरा ग्राहक अपने कनेक्शन बंद कर देता है:
var client = new MyClient();
try
{
return client.GetConfigurationOptions();
}
finally
{
client.Close();
}
मैंने अधिक आउटगोइंग कनेक्शन की अनुमति देने के लिए रजिस्ट्री सेटिंग्स बदल दी हैं:
MaxConnectionsPerServer=24, MaxConnectionsPer1_0Server=32.
मैंने अभी हाल ही में SvcTraceViewer.exe की कोशिश की है। मैं ग्राहक अंत पर एक अपवाद को पकड़ने में कामयाब रहा। मैं देखता हूं कि इसकी अवधि 1 मिनट है। सर्वर साइड ट्रेस को देखते हुए, मैं देख सकता हूं कि सर्वर को इस अपवाद के बारे में पता नहीं है। मैं देख सकता हूं कि अधिकतम अवधि 10 सेकंड है।
मैंने exec sp_who
सर्वर पर सक्रिय डेटाबेस कनेक्शन को देखा है। मेरे पास केवल कुछ (2-3) हैं। मैंने TCPview का उपयोग करते हुए एक क्लाइंट से TCP कनेक्शन देखा है। यह आमतौर पर 2-3 के आसपास होता है और मैंने 5 या 6 तक देखा है।
सीधे शब्दों में कहूं तो मैं स्टम्प्ड हूं। मैंने वह सब कुछ करने की कोशिश की है जो मुझे मिल सकता है, और बहुत सरल कुछ याद आ रहा है जिसे डब्ल्यूसीएफ विशेषज्ञ देख पाएंगे। यह मेरे पेट की भावना है कि कुछ मेरे ग्राहकों को निम्न-स्तर (टीसीपी) पर रोक रहा है, इससे पहले कि सर्वर वास्तव में संदेश प्राप्त करता है और / या कुछ सर्वर के स्तर पर संदेशों को कतारबद्ध कर रहा है और उन्हें कभी भी प्रक्रिया नहीं करने देता है।
यदि आपके पास कोई प्रदर्शन काउंटर है जिसे मुझे देखना चाहिए, तो कृपया मुझे बताएं। (कृपया बताएं कि क्या मूल्य खराब हैं, क्योंकि इनमें से कुछ काउंटरों को डिक्रिप्ट करना मुश्किल है)। इसके अलावा, मैं WCF संदेश आकार कैसे लॉग कर सकता हूं? अंत में, क्या हमारे कोई उपकरण हैं जो मुझे यह परखने की अनुमति देंगे कि मैं अपने क्लाइंट और सर्वर के बीच कितने कनेक्शन स्थापित कर सकता हूं (स्वतंत्र रूप से मेरे आवेदन से)
आपके समय के लिए धन्यवाद!
अतिरिक्त जानकारी 20 जून को जोड़ी गई:
मेरा WCF एप्लिकेशन निम्नलिखित के समान कुछ करता है।
while (true)
{
Step1GetConfigurationSettingsFromServerViaWCF(); // can change between calls
Step2GetWorkUnitFromServerViaWCF();
DoWorkLocally(); // takes 5-15minutes.
Step3SendBackResultsToServerViaWCF();
}
वायरशर्क का उपयोग करते हुए, मैंने देखा कि जब त्रुटि होती है, तो मेरे पास बाद में एक टीसीपी रीसेट के बाद एक पांच टीसीपी प्रतिक्रांति होती है। मेरा अनुमान है कि RST WCF से कनेक्शन को मार रहा है। मुझे जो अपवाद रिपोर्ट मिलती है वह स्टेप 3 टाइमिंग आउट की है।
मैंने इसे tcp स्ट्रीम "tcp.stream eq 192" को देखकर खोजा। मैंने तब अपने फ़िल्टर को "tcp.stream eq 192 और http.request.method eq POST" में विस्तारित किया और इस स्ट्रीम के दौरान 6 POST देखे। यह अजीब लग रहा था, इसलिए मैंने एक और स्ट्रीम जैसे tcp.stream eq 100 के साथ जांच की। मेरे पास तीन POST थे, जो थोड़ा अधिक सामान्य लगता है क्योंकि मैं तीन कॉल कर रहा हूं। हालाँकि, मैं हर WCF कॉल के बाद अपना कनेक्शन बंद कर देता हूं, इसलिए मुझे प्रति स्ट्रीम एक कॉल की उम्मीद होती (लेकिन मुझे टीसीपी के बारे में ज्यादा जानकारी नहीं है)।
थोड़ी और जांच करते हुए, मैंने इन छह कॉलों को देखने के लिए http पैकेट लोड को डिस्क में डंप कर दिया।
1) Step3
2) Step1
3) Step2
4) Step3 - corrupted
5) Step1
6) Step2
मेरा अनुमान है कि दो समवर्ती ग्राहक एक ही कनेक्शन का उपयोग कर रहे हैं, यही कारण है कि मैंने डुप्लिकेट देखा। हालाँकि, मेरे पास अभी भी कुछ और मुद्दे हैं जिन्हें मैं समझ नहीं सकता:
क) पैकेट क्यों दूषित है? यादृच्छिक नेटवर्क अस्थायी - शायद? इस सैंपल कोड का उपयोग करके लोड को रोक दिया गया है: http://msdn.microsoft.com/en-us/library/ms751458.aspx - क्या समवर्ती रूप से उपयोग किए जाने पर कोड एक बार में छोटी हो सकता है? मुझे gzip लाइब्रेरी के बिना परीक्षण करना चाहिए।
ख) मैं दूषित संचालन के समय के बाद चरण 1 और चरण 2 क्यों देखूंगा? मुझे ऐसा लगता है जैसे ये ऑपरेशन नहीं होने चाहिए थे। हो सकता है कि मैं सही स्ट्रीम नहीं देख रहा हूं क्योंकि टीसीपी की मेरी समझ त्रुटिपूर्ण है। मेरे पास अन्य धाराएं हैं जो एक ही समय में होती हैं। मुझे अन्य धाराओं की जांच करनी चाहिए - 190-194 की धाराओं पर एक त्वरित नज़र बताती है कि Step3 POST में उचित पेलोड डेटा है (भ्रष्ट नहीं है)। मुझे फिर से गज़िप लाइब्रेरी देखने के लिए धक्का दे दिया।