แก้ไขการโหลดเริ่มต้นที่ช้าสำหรับ IIS


129

IIS มีคุณลักษณะที่น่ารำคาญสำหรับเว็บไซต์ที่มีการเข้าชมต่ำซึ่งจะรีไซเคิลกระบวนการของผู้ปฏิบัติงานที่ไม่ได้ใช้งานทำให้ผู้ใช้รายแรกเข้ามาที่ไซต์หลังจากเวลาผ่านไประยะหนึ่งจะได้รับความล่าช้าเป็นเวลานานมาก (30+ วินาที)

ฉันกำลังมองหาวิธีแก้ปัญหาและพบวิธีแก้ปัญหาที่เป็นไปได้เหล่านี้

A. ใช้ปลั๊กอินการเริ่มต้นแอปพลิเคชัน

B. ใช้ Auto-Start กับ. NET 4

C. ปิดใช้งานการหมดเวลาว่าง (ภายใต้การรีเซ็ต IIS)

D. คอมไพล์ไซต์ล่วงหน้า

ฉันสงสัยว่าตัวเลือกใดเป็นที่ต้องการและที่สำคัญทำไมจึงมีวิธีแก้ปัญหาเดียวกันมากมาย (ฉันเดาว่าไม่ใช่และฉันก็เข้าใจบางอย่างไม่ถูกต้อง)

แก้ไข

การแสดงCดูเหมือนจะเพียงพอที่จะทำให้ไซต์ของฉันร้อนขึ้น แต่ฉันได้ค้นพบว่ารากที่แท้จริงของความช้าของไซต์ของฉันเกี่ยวข้องกับ Entity Framework ซึ่งฉันไม่สามารถเข้าใจได้ว่าทำไมมันถึงเย็น ดูคำถามนี้ซึ่งน่าเสียดายที่ยังไม่ได้รับคำตอบ!

ในที่สุดฉันก็ต้องสร้างสคริปต์อุ่นเครื่องเพื่อเข้าชมไซต์ของฉันเป็นครั้งคราวเพื่อให้แน่ใจว่ามันยังคงรวดเร็ว


สวัสดีเพื่อนการแสดง C เพียงพอหรือไม่? ทำไม? เราจำเป็นต้องใช้มันเท่านั้นหรือต้องปิดการใช้งานรีไซเคิลด้วย? ฉันมักจะรู้สึกว่าคำขอแรกของวันที่สองช้ามากของ
IIS7.5

คำตอบ:


36

ตัวเลือก A, B และ D ดูเหมือนจะอยู่ในหมวดหมู่เดียวกันเนื่องจากมีผลต่อเวลาเริ่มต้นเท่านั้นพวกเขาจะทำการวอร์มอัพเว็บไซต์เช่นการรวบรวมและการโหลดไลบรารีในหน่วยความจำ

การใช้ C ตั้งค่าการหมดเวลาว่างควรจะเพียงพอเพื่อให้การร้องขอไปยังเซิร์ฟเวอร์ในภายหลังได้รับการตอบสนองอย่างรวดเร็ว (การรีสตาร์ทพูลแอปจะใช้เวลาพอสมควร - ตามลำดับวินาที)

เท่าที่ฉันทราบการหมดเวลามีไว้เพื่อบันทึกหน่วยความจำที่เว็บไซต์อื่น ๆ ที่ทำงานแบบขนานบนเครื่องนั้นอาจต้องการ ราคาที่โหลดช้าครั้งเดียว

นอกเหนือจากข้อเท็จจริงที่ว่าพูลแอปจะปิดตัวลงในกรณีที่ผู้ใช้ไม่มีการใช้งานพูลแอปจะรีไซเคิลตามค่าเริ่มต้นทุกๆ 1740 นาที (29 ชั่วโมง)

จาก technet:

พูลแอปพลิเคชัน Internet Information Services (IIS) สามารถรีไซเคิลได้เป็นระยะเพื่อหลีกเลี่ยงสถานะที่ไม่เสถียรซึ่งอาจทำให้แอปพลิเคชันล่มแฮงค์หรือหน่วยความจำรั่ว

ตราบใดที่การรีไซเคิลพูลแอปยังเหลืออยู่ก็น่าจะเพียงพอแล้ว แต่ถ้าคุณต้องการประสิทธิภาพสูงสุดสำหรับส่วนประกอบส่วนใหญ่คุณควรใช้บางอย่างเช่น Application Initialization Module ที่คุณกล่าวถึง


ดังนั้นคุณขอแนะนำให้ปิดการใช้งานการหมดเวลาว่างหรือไม่? นั่นจะทำให้เกิดปัญหาตามมา (ฉันเดาว่ามันมีเหตุผล) หรือไม่
Cavyn VonDeylen

3
นี่ไม่ได้ช่วยแก้ปัญหาของฉันได้จริง (ดูการแก้ไขของฉัน) แต่ฉันยอมรับเนื่องจากคุณตอบคำถามเดิมของฉัน
Cavyn VonDeylen

10

ความท้าทายของเว็บโฮสติ้ง

คุณต้องจำไว้ว่าไม่มีตัวเลือกการกำหนดค่าเครื่องใดให้ใช้งานได้หากคุณโฮสต์บนเซิร์ฟเวอร์ที่ใช้ร่วมกันเหมือนกับเราหลายคน (บริษัท ขนาดเล็กและบุคคลทั่วไป)

ASP.NET MVC ค่าใช้จ่าย

ไซต์ของฉันใช้เวลาอย่างน้อย 30 วินาทีหากไม่มีการเข้าชมภายใน 20 นาที (และเว็บแอปหยุดทำงาน) มันเป็นที่น่ากลัว.

อีกวิธีหนึ่งในการทดสอบประสิทธิภาพ

มีอีกวิธีหนึ่งในการทดสอบว่า ASP.NET MVC ของคุณเริ่มต้นขึ้นหรืออย่างอื่น วางหน้า HTML ปกติบนไซต์ของคุณซึ่งคุณสามารถกดได้โดยตรง
หากปัญหาเกี่ยวข้องกับการเริ่มต้น ASP.NET MVC หน้า HTML จะแสดงผลเกือบจะในทันทีแม้ว่าจะยังไม่ได้เริ่มการทำงานของเว็บแอป
นั่นเป็นวิธีแรกที่ฉันรู้ว่าปัญหาอยู่ในการเริ่มต้น ASP.NET MVC ฉันโหลดหน้า HTML เมื่อใดก็ได้และมันจะโหลดเร็วมาก จากนั้นหลังจากกดที่หน้า HTML นั้นฉันจะเข้าสู่หนึ่งใน ASP.NET MVC URL ของฉันและฉันได้รับข้อความ Chrome "กำลังรอ raddev.us ... "

การทดสอบอื่นด้วยสคริปต์ที่เป็นประโยชน์

หลังจากนั้นฉันก็เขียน LINQPad (ดูhttp://linqpad.netสำหรับข้อมูลเพิ่มเติม) สคริปต์ที่จะเข้าสู่เว็บไซต์ของฉันทุก ๆ 8 นาที (น้อยกว่าเวลาที่แอปจะยกเลิกการโหลดซึ่งควรจะเป็น 20 นาที) และฉันก็ปล่อยให้ มันทำงานเป็นชั่วโมง

ในขณะที่สคริปต์กำลังทำงานอยู่ฉันเข้าชมเว็บไซต์ของฉันและทุกครั้งที่ไซต์ของฉันปรากฏขึ้นอย่างรวดเร็ว สิ่งนี้ทำให้ฉันมีความคิดที่ดีว่าความช้าส่วนใหญ่ที่ฉันประสบนั้นเป็นเพราะเวลาเริ่มต้น ASP.NET MVC

รับ LinqPad และคุณสามารถเรียกใช้สคริปต์ต่อไปนี้ - เพียงแค่เปลี่ยน URL เป็นของคุณเองและปล่อยให้มันทำงานและคุณสามารถทดสอบได้อย่างง่ายดาย โชคดี.

หมายเหตุ : ใน LinqPad คุณจะต้องกดF4และเพิ่มการอ้างอิงไปยัง System.Net เพื่อเพิ่มไลบรารีซึ่งจะดึงข้อมูลเพจของคุณ

นอกจากนี้ : ตรวจสอบให้แน่ใจว่าคุณได้เปลี่ยนตัวแปร 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";
    }
}

3

การเขียนบริการ / สคริปต์ ping เพื่อเข้าสู่เว็บไซต์ที่ไม่ได้ใช้งานของคุณเป็นวิธีที่ดีที่สุดเพราะคุณจะสามารถควบคุมได้อย่างสมบูรณ์ ตัวเลือกอื่น ๆ ที่คุณกล่าวถึงจะมีให้หากคุณเช่ากล่องโฮสติ้งโดยเฉพาะ

ในพื้นที่โฮสต์ที่ใช้ร่วมกันสคริปต์การวอร์มอัพเป็นการป้องกันระดับแรกที่ดีที่สุด (การช่วยตัวเองเป็นวิธีที่ดีที่สุด) นี่คือบทความที่หุ้นเป็นนักคิดที่เกี่ยวกับวิธีการทำมันได้จากแอพลิเคชันเว็บของคุณเอง


เพิ่งอัปเดตกระทู้เก่านี้เผื่อว่ามีคนค้นหาเหมือนกัน
David Chelliah

2

ฉันจะใช้Bเพราะการรีไซเคิลตามกระบวนการของคนงานหมายความว่าจะมีความล่าช้าในขณะที่รีไซเคิลเท่านั้น วิธีนี้จะหลีกเลี่ยงความล่าช้าตามปกติที่เกี่ยวข้องกับการเริ่มต้นเพื่อตอบสนองคำขอแรกหลังจากไม่ได้ใช้งาน คุณยังได้รับประโยชน์จากการรีไซเคิล


2

ตัวเลือกที่ดีในการส่ง Ping ไปยังไซต์ตามกำหนดเวลาคือการใช้ Microsoft Flow ซึ่งฟรีสำหรับการ "รัน" สูงสุด 750 ครั้งต่อเดือน เป็นเรื่องง่ายมากที่จะสร้างกระแสที่เข้าชมไซต์ของคุณทุก ๆ ชั่วโมงเพื่อให้กระแสความอบอุ่น คุณยังสามารถหลีกเลี่ยงขีด จำกัด ที่ 750 ได้ด้วยการสร้างขั้นตอนเดียวโดยมีความล่าช้าในการแยก Hit หลายรายการในไซต์ของคุณ

https://flow.microsoft.com


1

ดูบทความนี้สำหรับเคล็ดลับในการช่วยเหลือปัญหาด้านประสิทธิภาพ ซึ่งรวมถึงปัญหาด้านประสิทธิภาพที่เกี่ยวข้องกับการเริ่มต้นระบบในส่วน "การเริ่มเย็น" สิ่งนี้ส่วนใหญ่ไม่ว่าคุณจะใช้เซิร์ฟเวอร์ประเภทใดในประเทศหรือในการผลิต

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

หากแอปพลิเคชัน deserializes สิ่งใด ๆ จาก XML (และรวมถึงบริการบนเว็บ ... ) ตรวจสอบให้แน่ใจว่า SGEN ทำงานกับไบนารีทั้งหมดที่เกี่ยวข้องกับ deseriaization และวาง DLL ที่เป็นผลลัพธ์ไว้ใน Global Assembly Cache (GAC) สิ่งนี้จะคอมไพล์ออบเจ็กต์การทำให้เป็นอนุกรมทั้งหมดที่ใช้โดยแอสเซมบลี SGEN ถูกรันและแคชไว้ใน DLL ที่เป็นผลลัพธ์ สิ่งนี้สามารถช่วยประหยัดเวลาได้อย่างมากในการ deserialization (การโหลด) ครั้งแรกของไฟล์ config จากดิสก์และการเรียกครั้งแรกไปยังบริการเว็บ http://msdn.microsoft.com/en-us/library/bk3w6240(VS.80).aspx

หากเซิร์ฟเวอร์ IIS ใดไม่มีการเข้าถึงอินเทอร์เน็ตขาออกให้ปิด Certificate Revocation List (CRL) การตรวจสอบไบนารี Authenticode โดยการเพิ่ม 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


0

ฉันได้รับความล่าช้าอย่างสม่ำเสมอ 15 วินาทีในคำขอแรกหลังจากไม่มีการใช้งาน 4 นาที ปัญหาของฉันคือแอปของฉันใช้ Windows Integrated Authentication กับ SQL Server และโปรไฟล์บริการอยู่ในโดเมนอื่นที่ไม่ใช่เซิร์ฟเวอร์ สิ่งนี้ทำให้เกิดการรับรองความถูกต้องข้ามโดเมนจาก IIS เป็น SQL เมื่อเริ่มต้นแอป - และนี่คือสาเหตุที่แท้จริงของความล่าช้าของฉัน ฉันเปลี่ยนไปใช้การเข้าสู่ระบบ SQL แทนการรับรองความถูกต้องของ windows ความล่าช้าก็หมดไปทันที ฉันยังคงมีการตั้งค่าการเริ่มต้นแอปทั้งหมดเพื่อช่วยปรับปรุงประสิทธิภาพ แต่อาจไม่จำเป็นเลยในกรณีของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.