it-swarm.asia

تحديد التحميل الأولي البطيء لـ IIS

لدى IIS ميزة مزعجة لمواقع الويب ذات معدل المرور المنخفض حيث يعيد تدوير عمليات العامل غير المستخدمة ، مما يتسبب في حصول المستخدم الأول على الموقع بعد مرور بعض الوقت للحصول على تأخير طويل للغاية (30+ ثانية).

لقد كنت أبحث عن حل للمشكلة ولقد وجدت هذه الحلول المحتملة.

A. استخدام البرنامج المساعد لتهيئة التطبيق

B. استخدام بدء تلقائي مع .NET 4

C. تعطيل مهلة الخمول (ضمن IIS إعادة التعيين) }

D. (Precompile the site)

أنا أتساءل أي من هذه الأشياء مفضلة ، والأهم من ذلك ، لماذا توجد الكثير من الحلول لنفس المشكلة؟ (أظن أنها ليست كذلك ، وأنا لا أفهم شيئًا صحيحًا).

تحرير

الأداءCيبدو كافيًا للحفاظ على تحسّن موقعي ، لكنني اكتشفت أن السبب الحقيقي لبطء موقعي يتعلق بـ Entity Framework ، والذي لا يبدو لي أنه قادر على اكتشافه لماذا الجو بارد. انظر هذا السؤال الذي لسوء الحظ لم تتم الإجابة بعد تم الرد!

في النهاية ، كان لا بد لي من إعداد { نص الاحماء للوصول إلى موقعي أحيانًا للتأكد من بقائه سريعًا.

118
Cavyn VonDeylen

يبدو أن الخيارات A و B و D في نفس الفئة لأنها تؤثر فقط على وقت البدء الأولي ، كما أنها تعمل على تهيئة الموقع مثل تجميع وتحميل المكتبات في الذاكرة.

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

بقدر ما أعرف ، يوجد مهلة لحفظ الذاكرة التي قد تحتاجها مواقع الويب الأخرى التي تعمل بالتوازي على هذا الجهاز. السعر هو أن وقت التحميل بطيئة مرة واحدة.

إلى جانب حقيقة أن تجمع التطبيقات يحصل على إيقاف التشغيل في حالة عدم نشاط المستخدم ، سيتم أيضًا إعادة تدوير تجمع التطبيقات بشكل افتراضي كل 1740 دقيقة (29 ساعة).

من تكنيت:

يمكن إعادة تدوير تجمعات تطبيقات خدمات معلومات الإنترنت (IIS) بشكل دوري لتجنب الحالات غير المستقرة التي قد تؤدي إلى تعطل التطبيق أو حدوث تعليق أو تسرب للذاكرة.

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

32
Răzvan Flavius Panda

تحدي استضافة المواقع

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

ASP.NET MVC Overhead

يستغرق موقعي 30 ثانية على الأقل عندما لم يصل إلى أكثر من 20 دقيقة (وتم إيقاف تطبيق الويب). إنه لأمر فظيع.

طريقة أخرى لاختبار الأداء

هناك طريقة أخرى لاختبار ما إذا كان لديك ASP.NET MVC بدء التشغيل أو أي شيء آخر. أسقط صفحة HTML عادية على موقعك حيث يمكنك النقر عليها مباشرةً.
إذا كانت المشكلة متعلقة ببدء تشغيل ASP.NET MVC ، فستظهر صفحة HTML على الفور تقريبًا حتى عند عدم بدء تشغيل تطبيق الويب.
هكذا أدركت أولاً أن المشكلة كانت في بدء تشغيل ASP.NET MVC. لقد قمت بتحميل صفحة HTML في أي وقت ، وسوف يتم تحميلها بسرعة فائقة. بعد ذلك ، بعد النقر على صفحة HTML هذه ، قمت بالضغط على أحد عناوين URL الخاصة بـ ASP.NET MVC ، وقد تلقيت رسالة Chrome "في انتظار raddev.us ..."

اختبار آخر مع برنامج نصي مفيد

بعد ذلك كتبت برنامج نصي LINQPad (راجع http://linqpad.net للمزيد) من شأنه أن يضرب موقع الويب الخاص بي كل 8 دقائق (أقل من الوقت اللازم لتفريغ التطبيق - والذي يجب أن يكون 20 دقيقة ) وأدعها تعمل لساعات.

أثناء تشغيل البرنامج النصي ، قمت بالوصول إلى موقع الويب الخاص بي وفي كل مرة يتم فيها تشغيل موقعي بسرعة فائقة. هذا يعطيني فكرة جيدة أن الأرجح أن البطء الذي كنت أواجهه كان بسبب أوقات بدء تشغيل ASP.NET MVC.

احصل على LinqPad ويمكنك تشغيل البرنامج النصي التالي - ما عليك سوى تغيير عنوان URL الخاص بك والسماح له بتشغيله ويمكنك اختبار ذلك بسهولة. حظا سعيدا.

NOTE: في LinqPad ستحتاج إلى الضغط على F4 وإضافة مرجع إلى System.Net لإضافة المكتبة التي ستسترجع صفحتك.

ALSO: تأكد من تغيير متغير String URL للإشارة إلى عنوان URL الذي سيقوم بتحميل مسار من موقع ASP.NET MVC الخاص بك حتى يتم تشغيل المحرك.

System.Timers.Timer webKeepAlive = new System.Timers.Timer();
Int64 counter = 0;
void Main()
{
    webKeepAlive.Interval = 5000;
    webKeepAlive.Elapsed += WebKeepAlive_Elapsed;
    webKeepAlive.Start();
}

private void WebKeepAlive_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    webKeepAlive.Stop();
    try
    {
        // ONLY the first time it retrieves the content it will print the string
        String finalHtml = GetWebContent();
        if (counter < 1)
        {
            Console.WriteLine(finalHtml);
        }
        counter++;
    }
    finally
    {
        webKeepAlive.Interval = 480000; // every 8 minutes
        webKeepAlive.Start();
    }
}

public String GetWebContent()
{
    try
    {
    String URL = "http://YOURURL.COM";
    WebRequest request = WebRequest.Create(URL);
    WebResponse response = request.GetResponse();
    Stream data = response.GetResponseStream();
    string html = String.Empty;
    using (StreamReader sr = new StreamReader(data))
    {
        html = sr.ReadToEnd();
    }
    Console.WriteLine (String.Format("{0} : success",DateTime.Now));
    return html;
    }
    catch (Exception ex)
    {
        Console.WriteLine (String.Format("{0} -- GetWebContent() : {1}",DateTime.Now,ex.Message));
        return "fail";
    }
}
8
raddevus

تعد كتابة خدمة/نص برمجي للوصول إلى موقع الويب الخاص بك في وضع الخمول أفضل طريقة للذهاب لأنه سيكون لديك تحكم كامل. ستكون الخيارات الأخرى التي ذكرتها متاحة إذا قمت بتأجير مربع استضافة مخصص.

في مساحة الاستضافة المشتركة ، تعد البرامج النصية للإعداد أفضل دفاع من المستوى الأول (المساعدة الذاتية هي أفضل مساعدة). إليك مقال يشارك فكرة عن كيفية القيام بذلك من تطبيق الويب الخاص بك .

3
David Chelliah

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

2
CRAGIN

من الخيارات الجيدة لاختبار اتصال الموقع وفقًا لجدول زمني استخدام Microsoft Flow ، وهو مجاني لما يصل إلى 750 "تشغيل" شهريًا. من السهل جدًا إنشاء تدفق يتصفح موقعك كل ساعة لإبقائه دافئًا. يمكنك حتى العمل حول الحد الأقصى البالغ 750 وهو إنشاء تدفق واحد مع تأخيرات تفصل بين الزيارات المتعددة لموقعك.

https://flow.Microsoft.com

2
LMK

انظر هذه المقالة للحصول على نصائح حول كيفية المساعدة في مشاكل الأداء. يتضمن ذلك كل من مشكلات الأداء المتعلقة بالبدء ، ضمن قسم "البداية الباردة". معظم هذا يهم بغض النظر عن نوع الخادم الذي تستخدمه ، محليًا أو قيد الإنتاج.

http://blogs.msdn.com/b/mcsuksoldev/archive/2011/01/19/common-performance-issues-on-asp-net-web-sites.aspx

إذا كان التطبيق يلغي تسلسل أي شيء من XML (والذي يتضمن خدمات الويب ...) ، فتأكد من تشغيل SGEN ضد جميع الثنائيات المشاركة في إلغاء التسلية ووضع ملفات DLL الناتجة في ذاكرة التخزين المؤقتة للتجميع العمومي (GAC). هذا precompiles كافة الكائنات التسلسل المستخدمة من قبل التجميعات تم تشغيل SGEN مقابل وتخزينها مؤقتاً في DLL الناتج. يمكن أن يوفر هذا توفيرًا كبيرًا للوقت عند إلغاء التسلسل الأول (تحميل) لملفات التكوين من القرص والمكالمات الأولية إلى خدمات الويب. http://msdn.Microsoft.com/en-us/library/bk3w6240(VS.80).aspx

إذا لم يكن لدى خوادم IIS وصول صادر إلى الإنترنت ، فقم بإيقاف تشغيل قائمة إبطال الشهادات (CRL) للتحقق من ثنائيات المصادقة عن طريق إضافة createPublisherEvidence = "false" في machine.config. بخلاف ذلك ، يمكن أن تتوقف كل العمليات المنفذة لأكثر من 20 ثانية أثناء بدء التشغيل بينما تنقضي مهلة محاولة الاتصال بالإنترنت للحصول على قائمة CRL. http://blogs.msdn.com/amolravande/archive/2008/07/20/startup-performance-disable-the-generatepublisherevidence-property.aspx

http://msdn.Microsoft.com/en-us/library/bb629393.aspx

النظر في استخدام NGEN على جميع الجمعيات. لكن بدون استخدام دقيق ، لا يعطي هذا الكثير من مكاسب الأداء. وذلك لأن عناوين التحميل الأساسية لجميع الثنائيات التي يتم تحميلها بواسطة كل عملية يجب أن يتم ضبطها بعناية في وقت البناء حتى لا تتداخل. إذا كان من الضروري إعادة تقييم الثنائيات عند تحميلها بسبب اشتباكات العناوين ، فستفقد جميع مكاسب الأداء باستخدام NGEN تقريبًا. http://msdn.Microsoft.com/en-us/magazine/cc163610.aspx

1
nuzzolilo