ดังที่เราทุกคนทราบกันดีว่าการติดตั้งแอปพลิเคชันที่ทำงานตลอด 24 ชั่วโมงทุกวันไม่ใช่เรื่องง่าย หนึ่งในโครงการของฉันเคยดำเนินต่อไปนานกว่า 20 ชั่วโมงภายใต้ภาระงานที่รุนแรงและยังคงเสียชีวิตอย่างกล้าหาญ โชคดีที่ ASP.NET และ IIS มีสิ่งอำนวยความสะดวกที่ง่ายดายให้เราสร้างแอปพลิเคชัน .Net ที่เสถียรเป็นพิเศษได้อย่างง่ายดาย อย่างไรก็ตาม สิ่งที่ไม่พึงประสงค์เล็กน้อยคือวิธีการกำหนดค่าในระบบ Windows 2000 (เวอร์ชันต่ำกว่า IIS6.0) และ Windows 2003 (IIS6.0) นั้นแตกต่างกัน
เรามาพูดถึงระบบ windows 2000 กันก่อน ผู้ที่คุ้นเคยกับ ASP.NET ควรรู้จักไฟล์ machine.config ซึ่งถูกจัดเก็บไว้ในไดเร็กทอรี %WindowPath%Microsoft.NetFramework%.NetVersion%CONFIG ใช้โปรแกรมแก้ไขข้อความใดๆ (แน่นอนว่าโปรแกรมยอดนิยมที่สุดคือ "Notepad") เพื่อเปิดไฟล์และค้นหาส่วน <processModel...> ASP.NET ควบคุมกระบวนการบริการ ASP.NET (aspnet_wp.exe หรือ w3wp.ext) ตามการตั้งค่าในส่วนนี้ รหัสแอปพลิเคชัน ASP.NET ที่เราเขียนทำงานในพื้นที่กระบวนการนี้ หากคุณใช้ Framework 1.1 คุณจะเห็นคุณสมบัติมากกว่า n รายการในส่วนนี้ เราเกี่ยวข้องกับสามคุณสมบัติต่อไปนี้ ตามด้วยเครื่องหมายเท่ากับเป็นค่าเริ่มต้น:
timeout="Infinite"
idleTimeout="Infinite"
memoryLimit="60"
คุณไม่สามารถมองเห็นได้ภายใต้ Framework 2.0 แต่คุณสามารถเพิ่มด้วยตนเองได้
ให้ฉันแปลความหมายของแอตทริบิวต์ทั้งสามนี้ หลังจากทำงานอย่างต่อเนื่องตามเวลาที่ระบุโดยการหมดเวลา ให้เริ่มกระบวนการบริการ ASP.NET ใหม่ ค่าเริ่มต้นของการหมดเวลาคืออนันต์ คุณสามารถรีเซ็ตได้ในรูปแบบ "HH:MM:SS " ตัวอย่างเช่น timeout=24:00:00 หมายถึงการรีสตาร์ทหลังจาก 24 ชั่วโมง หากไม่มีใครเข้าถึงภายในเวลาที่ระบุโดย idleTimeout ให้รีสตาร์ทกระบวนการบริการ ASP.NET ค่าเริ่มต้นของ idleTimeout ยังเป็นอนันต์เช่นกัน และวิธีการตั้งค่า เป็นไปตามข้างต้น หากเปอร์เซ็นต์ของหน่วยความจำที่ใช้โดยกระบวนการบริการ ASP.NET กับหน่วยความจำระบบทั้งหมดเกินจำนวนที่ระบุโดย memoryLimit กระบวนการบริการ ASP.NET จะถูกรีสตาร์ท
ทำความเข้าใจด้วยความร่วมมือของคุณลักษณะทั้งสามนี้ กระบวนการบริการสามารถเริ่มต้นใหม่ได้โดยไม่ต้องรู้ตัว เพื่อให้แอปพลิเคชันของเราทำงานต่อไปได้ เมื่อฉันพูดแบบนี้ ผู้อ่านที่ระมัดระวังอาจค้นพบปัญหาแล้ว เมื่อเริ่มกระบวนการบริการใหม่ เซสชันของลูกค้าจะหายไปอย่างหลีกเลี่ยงไม่ได้และการดำเนินการของผู้ใช้จะถูกขัดจังหวะ เราจะบรรลุ “พระเจ้าไม่รู้ ผีไม่รู้” ได้อย่างไร?
ปัญหานี้มีอยู่จริง แต่ผลกระทบสามารถลดลงหรือกำจัดออกไปได้อย่างสมบูรณ์ด้วยมาตรการต่อไปนี้
ขั้นแรก เราสามารถตั้งค่า idleTimeout ให้เป็นค่าที่เหมาะสม โดยปกติฉันจะตั้งค่าเป็น 1.5-1.5 ของการตั้งค่าการหมดเวลาเซสชัน ตั้งค่าการหมดเวลาเป็นขีดจำกัดสูงสุดที่โปรแกรมสามารถคงอยู่ได้ โดยปกติฉันตั้งไว้ที่ 24 ชั่วโมง การดำเนินการนี้จะบังคับให้กระบวนการบริการเริ่มต้นใหม่เมื่อไม่ได้ใช้งาน เนื่องจากไม่มีเซสชันในขณะนี้ จึงเป็นไปไม่ได้ที่จะขัดจังหวะการทำงานของผู้ใช้ การตั้งค่านี้มีประสิทธิภาพมากในสภาพแวดล้อมสำนักงานขององค์กรขนาดเล็กและขนาดกลาง เนื่องจากโดยทั่วไปแล้วจะไม่สามารถเข้าถึงได้หลังเวลาทำการ
แน่นอนว่าวิธีการข้างต้นมีข้อจำกัดอย่างมากและใช้ได้เฉพาะในสถานการณ์เฉพาะเท่านั้น หากมีใครยังคงเข้าถึงหรือรีสตาร์ทเมื่อหน่วยความจำเกินขีดจำกัด การทำงานของผู้ใช้จะยังคงถูกรบกวน ทางออกที่ดีที่สุดคือการบันทึกสถานะเซสชันในกระบวนการที่แยกจากกัน บน ASP.Net สิ่งนี้สามารถทำได้ด้วยการกำหนดค่าอย่างง่าย
ที่มา: ห้องบันทึกเสียง BLOG