كيفية تشخيص "لقد انتهت مهلة العملية" httpException
-
19-09-2019 - |
سؤال
أدعو 5 خوادم خارجية لاسترداد البيانات المستندة إلى XML لكل طلب للحصول على صفحة ويب معينة على خادم IIS 6. بلغ حجم الوقت بين 3-5 طلبات واردة في الثانية الواحدة، وهذا يعني 15-20 طلبات صادرة في الثانية الواحدة.
99٪ من الطلبات الصادرة من الخادم الخاص بي (العميل) إلى الخوادم الخارجية (الخادم) تعمل بشكل جيد ولكن حوالي 100-200 في نهاية اليوم في نهاية اليوم مع "انتهت مهلة العملية".
هذا يشير إلى أن لدي مشكلة في الموارد على الخادم الخاص بي - بعض النقص في مآخذ المنافذ أو المنافذ وغيرها أو قفل الخيط ولكن المشكلة في هذه النظرية هي أن الفشل عشوائي تماما - لا يوجد عدد من الطلبات في صف فشل كل شيء - واثنين من الخوادم الخارجية لحساب غالبية الإخفاقات.
سؤالي هو كيف يمكنني مزيد من تشخيص هذه الاستثناءات لتحديد ما إذا كانت المشكلة موجودة في طرفي (العميل) أو في الطرف الآخر (الخوادم)؟
حجم الطلبات يمنع وضع محلل على السلك - سيكون من الصعب للغاية التقاط هذه الاستثناءات القليلة. لدي إعادة ضبط الاتصالات والخيوط في جهاز My Machine.config والرمز الأساسي يشبه:
Dim hRequest As HttpWebRequest
Dim responseTime As String
Dim objWatch As New Stopwatch
Try
' calculate time it takes to process transaction
objWatch.Start()
hRequest = System.Net.WebRequest.Create(url)
' set some defaults
hRequest.Timeout = 5000
hRequest.ReadWriteTimeout = 10000
hRequest.KeepAlive = False ' to prevent open HTTP connection leak
hRequest.SendChunked = False
hRequest.AllowAutoRedirect = True
hRequest.MaximumAutomaticRedirections = 3
hRequest.Accept = "text/xml"
hRequest.Proxy = Nothing 'do not waste time searching for a proxy
hRequest.ServicePoint.Expect100Continue = False
Dim feed As New XDocument()
' use *Using* to auto close connections
Using hResponse As HttpWebResponse = DirectCast(hRequest.GetResponse(), HttpWebResponse)
Using reader As XmlReader = XmlReader.Create(hResponse.GetResponseStream())
feed = XDocument.Load(reader)
reader.Close()
End Using
hResponse.Close()
End Using
objWatch.Stop()
' Work here with returned contents in "feed" document
Return XXX' some results here
Catch ex As Exception
objWatch.Stop()
hRequest.Abort()
Return Nothing
End Try
أي اقتراحات؟
المحلول
قلت أنك تفعل 5 طلب صادر لكل طلب وارد إلى صفحة ASP. هل هذا خوادم مختلفة، أو نفس الخادم؟
هل تنتظر طلب الطلب السابق، قبل إصداره التالي؟ هل تحدث المهلة أثناء انتظار اتصال، أو أثناء الطلب / الاستجابة؟
إذا حدث المهلة أثناء الطلب / الاستجابة، فهذا يعني أن الخادم الهدف قيد الضغط. الطريقة الوحيدة لمعرفة معرفة ما إذا كانت هذه هي الحالة، هي تشغيل Wireshark / Netmon على إحدى الأجهزة، وإلقاء نظرة على تتبع الشبكة لمعرفة ما إذا كان الطلب من التطبيق هو حتى يبذل من خلال الخادم، وإذا كان ذلك هو، ما إذا كان الخادم الهدف يستجيب في مهلة المعينة.
إذا كانت هذه مشكلة مجاعة الخيط، فستكون واحدة من طرق تشخيصها هي إرفاق مصحح الأخطاء Windbg.exe لعملية W3WP.exe، عند البدء في الحصول على مهلة. ثم قم بتحميل ملحق تصحيح الأخطاء SOS.DLL. وتشغيل الأمر! مؤشر الترابط، يليه الأمر! سيوضح لك عدد مؤشرات ترابط العمال واستخدام المواضيع الميناء / المتبقية. إذا كانت مؤشرات ترابط #completionPort أو خيوط العامل منخفضة، فستساهم في المهلة.
بدلا من ذلك، يمكنك مراقبة عدادات Perf ASP.NET و SYSTEM.NET. معرفة ما إذا كانت قائمة انتظار طلب ASP.NET تتزايد رتيبا - قد يشير ذلك إلى أن طلباتك الصادرة ليست ملائمة بسرعة كافية.
آسف، لا توجد إجابات سهلة هنا. هناك الكثير من الطرق التي ستحتاج إليها لاستكشافها. إذا كنت أنت كنت، فسأبدأ بإعطاف Windbg.exe على W3WP عند البدء في الحصول على مهاجلا وفعل ما وصفته مسبقا.
نصائح أخرى
بشكل افتراضي، يحدك httpWebRequest إلى 2 اتصالات لكل خادم HTTP / 1.1. لذلك، إذا كانت طلباتك تستغرق وقتا طويلا لإكمالها، ولديك طلبات طابور واردة في قائمة الانتظار على الخادم، فسوف تنفد من الاتصال وبالتالي احصل على مهلات.
يجب عليك تغيير اتصالات الأقراص الصادرة على ServicePointManager.
ServicePointManager.DefaultConnectionLimit = 20 // or some big value.