ฉันควรทำอย่างไรเพื่อให้แน่ใจว่า IIS ไม่ได้รีไซเคิลแอปพลิเคชันของฉัน


82

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

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

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

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

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

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

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


คุณได้รับภาพหน้าจอด้านบนด้วยการตั้งค่าสำหรับ IIS ที่ไหน
Andrew William Ross

นั่นคือแผ่นคุณสมบัติของแอพขั้นสูง
TristanK

คำตอบ:


105

รีไซเคิล

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

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

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

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

การตั้งค่า

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

ปฏิกิริยารีแอคทีฟคือที่ที่ WAS ตรวจพบปัญหาและถ่ายทำกระบวนการ (หลังจากสร้าง W3WP ทดแทนที่เหมาะสม)

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

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

จะทำอย่างไร:

โดยทั่วไป:

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

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

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

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

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

การ จำกัด ซีพียูนั้นไม่น่าสนใจตามปกติเพราะโดยปกติแล้วมันจะปิดและมันก็กำหนดค่าให้ไม่ทำอะไรเลย หากมีการกำหนดค่าให้ฆ่ากระบวนการตรวจสอบว่าเป็นทริกเกอร์การรีไซเคิล ทิ้งไว้ หมายเหตุสำหรับ 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 ทำให้เกิดการแจ้งเตือนการเปลี่ยนแปลงทำให้ ....


2
รอสักครู่รอ ... ทำไมการอ่าน web.config จาก Antivirus ทำให้เกิดการแจ้งเตือนการเปลี่ยนแปลง โปรแกรมป้องกันไวรัสใด ๆ ที่ "แตะ" web.config โดยไม่มีเหตุผลคือถังขยะ imho
ชีฟ

AV อาจไม่ใช่แค่อ่าน แต่อาจเขียน - เช่นสตรีมข้อมูลสำรองบันทึกรุ่นเอ็นจิ้นที่ใช้ในการสแกนไฟล์ล่าสุด เป็นความคิด
TristanK

7

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

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

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

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

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


3
เหตุผลหนึ่งก็คือ. NET ใช้ heap แยกสำหรับ 'วัตถุขนาดใหญ่' (ปกติ 85K หรือใหญ่กว่าหรือบางอย่าง) ซึ่งไม่ได้ทำการกระชับเมื่อเกิดการรวบรวมขยะ (แม้ว่าใน. NET 4.5.1 ฉันคิดว่าพวกเขาเพิ่มตัวเลือกสำหรับการกระชับ LOH) และ ใน ASP.NET เมื่อเรนเดอร์ HTML บนฝั่งเซิร์ฟเวอร์ไม่ใช่เรื่องแปลกที่จะเห็น 85K ของ HTML (โดยเฉพาะอย่างยิ่งสำหรับเนื้อหาซ้ำ ๆ เช่นตารางและกริด) และ HTML นี้โดยทั่วไปแล้ว ณ จุดหนึ่งเพียงวัตถุ String ขนาดใหญ่บนเซิร์ฟเวอร์และถ้ามันมีคุณสมบัติเป็น วัตถุขนาดใหญ่ก็จะก่อให้เกิดการกระจายตัวของวัตถุกองขนาดใหญ่ที่สุดที่เกิดขึ้นใน OutOfMemoryException จึงรีไซเคิล
nothingisnecessary

0

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

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