سؤال

أدعو 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.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top