أخطاء IIS 7.0 503 مع المعالج العام (.ashx) الذي يقوم بتطبيق IHttpAsyncHandler

StackOverflow https://stackoverflow.com/questions/612242

سؤال

أواجه بعض مشكلات الأداء باستخدام معالج عام يقوم بتنفيذ IHttpAsyncHandler.في أبسط حالاته، يتلقى المعالج طلب GET، وبعد 20 ثانية ينهي الاستجابة بعد كتابة "< timeout / >" للاستجابة.

عند إرسال .ashx مع 10000-20000 طلب متزامن، فإنه يفشل مع عدم توفر خادم 503 بعد 5000 طلب بالضبط.عند التبديل إلى الوضع المتزامن، وإنهاء الطلب على الفور، تختفي المشكلة.

لقد عدلت عددًا من الإعدادات، ولكن الشيء الوحيد الذي تمكنت من تحقيقه هو خفض حد الطلب الذي يحدث عنده هذا الخطأ.

فيما يلي ملخص للإعدادات التي تعاملت معها:

تكوين الآلة:

<configuration>
    ...
    <system.web>
        ...
        <processModel enable="true" requestQueueLimit="10000"/>
        ...

تكوين الويب:

<configuration>
    ...
    <system.web>
        ...
        <httpRuntime enable="true" appRequestQueueLimit="10000"/>
        ...

مدير IIS > تجمعات التطبيقات > الإعدادات المتقدمة

Queue Length : 65535

على الرغم من أنني لست متأكدًا، يبدو أن هذه الإعدادات تعمل بشكل جيد وجيد إذا كانت الطلبات متزامنة، ولكن عندما تكون غير متزامنة، لا يبدو أنني أستطيع تجاوز 5000 طلب بالضبط قبل أن يبدأ الخادم بإخباري بالرحيل.إذا قمت بضبط الأشياء على مستوى أقل (لا أستطيع أن أتذكر بالضبط الإعداد الذي سيكون من ما ورد أعلاه، لكنني جربتها جميعًا)، فسيرتفع عدد 503 وفقًا لذلك، لكن لا يمكنني أبدًا إيقاف حدوث ذلك بعد 5000 عندما تكون تحت ضغط خطير .

يبدو أن هناك عددًا من الإعدادات المنتشرة في عدد لا يحصى من الأماكن التي قد تؤثر على هذا، ولكن يبدو أن الرقم 5000 محدد تمامًا.أرى هنا لا يمكن أن يتجاوز هذا appRequestQueueLimit 5000، ولكن لا يمكنه العثور على معلومات إضافية حول هذا الأمر، ويتساءل عما إذا كانت هذه معلومات خاطئة.

هل هناك أي نوع من إعدادات "التحكم في الفيضان" في IIS والتي قد تقصر مضيفًا واحدًا على ما لا يزيد عن 5000 طلب؟كيف يمكنني جعل IIS يتعامل مع أكثر من 5000 طلب متزامن غير متزامن؟

تحرير 2:هل هناك أي عدادات أو مؤشرات أخرى قد يتم تجاوز الحد فيها، وكيف يمكنني إجراء مزيد من التحقيق؟

يحرر:إليك رمز مولد التحميل:

using System;
using System.Net;
using System.Threading;

namespace HammerTime
{
    class Program
    {
        private static int counter = 0;
        static void Main(string[] args)
        {
            var limit = 5000;
            ServicePointManager.DefaultConnectionLimit=limit;
            for (int i = 0; i < limit;++i )
            {
                StartWebRequest(i.ToString());

            }
            Console.ReadLine();
        }

        private static void StartWebRequest(string channelId)
        {
            string uri = "http://spender2008/test/Test.ashx?channel="+channelId;
            HttpWebRequest request = (HttpWebRequest) WebRequest.Create(uri);
            request.BeginGetResponse(responseHandler, request);
        }

        private static void responseHandler(IAsyncResult ar)
        {
            try
            {
                HttpWebRequest state = (HttpWebRequest)ar.AsyncState;
                HttpWebResponse response = (HttpWebResponse)state.EndGetResponse(ar);

            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                Console.WriteLine(Interlocked.Increment(ref counter));
            }

        }
    }
}
هل كانت مفيدة؟

المحلول

نعم.مُثَبَّت...شكرا جزيلا ل هذا آخر لتوضيح بعض التفاصيل.

للتخلص من الأخطاء 503، يلزم إجراء 3 تغييرات مختلفة في التكوين:

تكوين الآلة:

<configuration>
    ...
    <system.web>
        ...
        <processModel enable="true" requestQueueLimit="100000"/>

مدير IIS > تجمعات التطبيقات > الإعدادات المتقدمة

Queue Length : 65535

وأخيرًا (القطعة المفقودة من اللغز)، سطر الأوامر:

appcmd.exe set config /section:serverRuntime /appConcurrentRequestLimit:100000

كان إعداد web.config المذكور في المنشور الرئيسي غير ذي صلة.

10000 اتصال متزامن، لا توجد مشاكل.شكرا للمساعدة!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top