ฉันมีแอปบริการ WCF ที่โฮสต์ใน IIS เมื่อเริ่มต้นระบบจะดึงทรัพยากรที่มีราคาแพงมาก (ในแง่ของเวลาและ cpu) เพื่อใช้เป็นแคชในเครื่อง

น่าเสียดายที่ IIS ดูเหมือนจะรีไซเคิลกระบวนการนี้เป็นประจำ ดังนั้นฉันจึงพยายามเปลี่ยนการตั้งค่าใน Application Pool เพื่อให้แน่ใจว่า IIS จะไม่รีไซเคิลแอปพลิเคชัน จนถึงตอนนี้ ฉันได้เปลี่ยนแปลงสิ่งต่อไปนี้:

  • จำกัด ช่วงเวลาภายใต้ CPU จาก 5 ถึง 0
  • หมดเวลาใช้งานภายใต้โมเดลกระบวนการตั้งแต่ 20 ถึง 0
  • ช่วงเวลาปกติภายใต้การรีไซเคิลจาก 1740 เป็น 0

เท่านี้จะพอหรือ? และฉันมีคำถามเฉพาะเกี่ยวกับสินค้าที่ฉันเปลี่ยน:

  1. การตั้งค่า Limit Interval ภายใต้ CPU หมายถึงอะไรโดยเฉพาะ หมายความว่าหากใช้งาน CPU เกินจำนวนหนึ่ง กลุ่มแอปพลิเคชันจะถูกรีไซเคิลหรือไม่
  2. "รีไซเคิล" หมายถึงอะไรกันแน่? แอปพลิเคชันถูกดึงออกอย่างสมบูรณ์และเริ่มต้นใหม่อีกครั้งหรือไม่?
  3. อะไรคือความแตกต่างระหว่าง "การปิดกระบวนการของผู้ปฏิบัติงาน" และ "การรีไซเคิลกลุ่มแอปพลิเคชัน" เอกสารประกอบสำหรับ Idle Time-out ภายใต้ Process Model พูดถึงการปิดกระบวนการของผู้ปฏิบัติงาน ในขณะที่เอกสารสำหรับช่วงเวลาปกติภายใต้การรีไซเคิลพูดถึงการรีไซเคิลกลุ่มแอปพลิเคชัน ฉันไม่ค่อยเข้าใจความแตกต่างระหว่างคนทั้งสอง ฉันคิดว่า w3wp.exe เป็นกระบวนการของผู้ปฏิบัติงานที่เรียกใช้กลุ่มแอปพลิเคชัน ใครช่วยอธิบายความแตกต่างของแอปพลิเคชันระหว่างทั้งสองได้ไหม

เหตุผลที่ต้องมีแท็ก IIS7 และ IIS7.5 เป็นเพราะแอปจะทำงานทั้งสองอย่าง และหวังว่าคำตอบจะเหมือนกันระหว่างเวอร์ชันต่างๆ

รูปภาพสำหรับอ้างอิง: ใส่คำอธิบายภาพที่นี่

answer

รีไซเคิล

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

*- โดยปกติ: ดูการตั้งค่า DisallowOverlappingRotation / "ปิดใช้งานการรีไซเคิลที่ทับซ้อนกัน"

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

แต่โดยค่าเริ่มต้นจะทับซ้อนกัน - หมายความว่าระยะเวลาของการหยุดทำงานจะลดลงเนื่องจากกระบวนการใหม่เริ่มต้นและเชื่อมต่อกับคิวคำขอ ก่อนที่ระบบจะแจ้งว่า "คุณมี [ShutdownTimeLimit] วินาทีที่จะหายไป โปรดปฏิบัติตาม"

การตั้งค่า

สำหรับคำถามของคุณ: การตั้งค่าทั้งหมดในหน้านั้นควบคุมการรีไซเคิลในทางใดทางหนึ่ง "การปิดระบบ" อาจอธิบายได้ว่าเป็น "การรีไซเคิลเชิงรุก" ซึ่งกระบวนการตัดสินใจเองว่าถึงเวลาต้องไปแล้ว และออกจากระบบอย่างมีระเบียบ

การรีไซเคิลเชิงปฏิกิริยาเป็นที่ที่ WAS ตรวจพบปัญหาและยิงกระบวนการ (หลังจากสร้าง W3WP ทดแทนที่เหมาะสมแล้ว)

ต่อไปนี้คือสิ่งที่อาจทำให้เกิดการรีไซเคิลรูปแบบใดรูปแบบหนึ่ง:

  • ISAPI ตัดสินใจว่ามันไม่ดีต่อสุขภาพ
  • โมดูลใด ๆ ที่ขัดข้อง
  • หมดเวลาที่ไม่ได้ใช้งาน
  • การจำกัดซีพียู
  • การปรับคุณสมบัติของพูลแอป
    • อย่างที่คุณแม่ของคุณอาจเคยกรีดร้องเมื่อถึงจุดหนึ่ง: "หยุดหยิบมันเสีย มิฉะนั้นมันจะไม่ดีขึ้น!"
  • ความล้มเหลว "ping" * ไม่ได้ส่ง ping ต่อ se จริง ๆ เพราะมันใช้ไพพ์ที่มีชื่อ - "การตรวจจับชีวิต" มากกว่า
  • การตั้งค่าทั้งหมดในภาพหน้าจอด้านบน

สิ่งที่ต้องทำ:

โดยทั่วไป:

  • ปิดการใช้งานหมดเวลาไม่ได้ใช้งาน ไม่มีการใช้งาน 20 นาที = บูม! กระบวนการใหม่ในคำขอที่เข้ามาครั้งต่อไป ตั้งค่าให้เป็นศูนย์

  • ปิดการใช้งานช่วงเวลาปกติ - ค่าเริ่มต้น 29 ชั่วโมงได้รับการอธิบายว่า "บ้า", "น่ารำคาญ" และ "ฉลาด" โดยฝ่ายต่างๆ อันที่จริงมีเพียงสองสิ่งเท่านั้นที่เป็นความจริง

  • ทางเลือกเปิดDisallowRotationOnConfigChange (ด้านบนปิดการใช้งาน Reycling สำหรับการเปลี่ยนแปลงการกำหนดค่า ) หากคุณไม่สามารถหยุดเล่นกับมันได้ - สิ่งนี้ทำให้คุณสามารถเปลี่ยนการตั้งค่ากลุ่มแอพโดยไม่ต้องส่งสัญญาณไปยังกระบวนการของผู้ปฏิบัติงานทันทีที่จำเป็นต้องฆ่า คุณต้องรีไซเคิล App Pool ด้วยตนเองเพื่อให้การตั้งค่ามีผล ซึ่งช่วยให้คุณตั้งค่าล่วงหน้าได้ จากนั้นใช้หน้าต่างการเปลี่ยนแปลงเพื่อปรับใช้ผ่านกระบวนการรีไซเคิลของคุณ

  • ในฐานะที่เป็นหลักการทั่วไป, ลากระตุกเปิดใช้งานนั่นคือเครือข่ายความปลอดภัยของคุณ ฉันเคยเห็นคนปิดการทำงาน และบางครั้งเว็บไซต์ก็หยุดทำงานอย่างไม่มีกำหนด ทำให้เกิดความตื่นตระหนก... ดังนั้น หากการตั้งค่ารุนแรงเกินไปสำหรับแอปที่ตอบสนองช้ามาก ให้ลดระดับลงเล็กน้อย และดูว่าคุณได้รับอะไรมากกว่าที่จะปิด (ยกเว้นกรณีที่คุณได้ตั้งค่าดัมพ์โหมดหยุดทำงานอัตโนมัติสำหรับ W3WP ที่หยุดทำงานผ่านกระบวนการตรวจสอบของคุณเอง)

นั่นก็เพียงพอแล้วที่จะทำให้กระบวนการประพฤติดีดำรงอยู่ตลอดไป ถ้ามันตายก็จะถูกแทนที่ ถ้ามันแฮงค์กระตุกควรเลือกที่ขึ้นและใหม่ควรจะเริ่มต้นภายใน 2 นาที (โดยค่าเริ่มต้นที่เลวร้ายที่สุดกรณี Calc ควรจะได้ถึงping ความถี่ + ปิงหมดเวลา + กำหนดเวลาเริ่มต้นก่อนที่จะร้องขอเริ่มทำงานอีกครั้ง)

โดยปกติแล้วการจำกัด CPU นั้นไม่น่าสนใจ เพราะโดยค่าเริ่มต้นแล้ว มันถูกปิด และถูกกำหนดค่าให้ไม่ทำอะไรเลย ถ้ามันถูกกำหนดค่าให้ฆ่ากระบวนการ แน่นอนว่านั่นจะเป็นตัวกระตุ้นการรีไซเคิล ปล่อยมันไป หมายเหตุสำหรับ IIS 8.x การควบคุมปริมาณ CPU จะกลายเป็นตัวเลือกเช่นกัน

AppPool (IIS) ไม่ใช่ AppDomain (.Net) (แต่อาจมีอย่างใดอย่างหนึ่ง/บางส่วน)

แต่... จากนั้นเราก็เข้าสู่ .Net land และการรีไซเคิล AppDomain ซึ่งอาจทำให้สูญเสียสถานะได้เช่นกัน (ดู: https://blogs.msdn.microsoft.com/tess/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles/ )

เวอร์ชันสั้น คุณทำได้โดยแตะไฟล์ web.config ในโฟลเดอร์เนื้อหาของคุณ (อีกครั้งด้วยการเลือก!) หรือโดยการสร้างโฟลเดอร์ในโฟลเดอร์นั้น หรือไฟล์ ASPX หรือ.. อื่นๆ... และนั่นก็เกี่ยวกับทำลายล้างเช่นเดียวกับการรีไซเคิล App Pool ลบด้วยค่าใช้จ่ายในการเริ่มต้นโค้ดเนทีฟ (เป็นแนวคิดของโค้ดที่ได้รับการจัดการเท่านั้น (.Net) ดังนั้นจึงมีเพียงโค้ดที่มีการจัดการเท่านั้นที่เกิดขึ้นที่นี่)

แอนตี้ไวรัสยังสามารถทริกเกอร์สิ่งนี้ได้ในขณะที่สแกนไฟล์ web.config ทำให้เกิดการแจ้งเตือนการเปลี่ยนแปลง ทำให้เกิด....

กรุณาตรวจสอบ

เหตุใดเราจึงรีไซเคิลกลุ่มแอปพลิเคชันของเรา

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

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

จำเป็นต้องเริ่มให้ความสำคัญกับการจัดการหน่วยความจำใน .NET มากขึ้นและทำให้แน่ใจว่าแอปพลิเคชันของเราสามารถทำงานต่อไปได้โดยไม่มีปัญหา

ตามสถานการณ์ OP (การเริ่มต้นนานเมื่อเริ่มต้น / อุ่นเครื่อง) อีกสิ่งหนึ่งที่ต้องตรวจสอบคือขีด จำกัด เวลาเริ่มต้น (วินาที) ซึ่งมีค่าเริ่มต้น 90 วินาที ถ้าการเริ่มต้นใช้เวลามากกว่าขีดจำกัดเวลาเริ่มต้น กระบวนการของผู้ปฏิบัติงานสามารถยุติลงได้