ใน Windows 8.1 มีวิธีใดบ้างที่จะทำให้มั่นใจว่ากระบวนการจะไม่ถูกฆ่าก่อนที่จะหมดเมื่อ RAM หมด


18

ฉันเขียนแอปพลิเคชั่น. NET 4.5 ที่บัฟเฟอร์สีข้อมูลอินฟราเรดและข้อมูลเชิงลึกจาก Kinect v2 ทำการประมวลผลบางอย่างแล้วประมวลผลลงในดิสก์ในรูปแบบที่ไม่มีการบีบอัด แอ็พพลิเคชัน. NET ยังเริ่ม ffmpeg ในฐานะ subprocess และไพพ์ข้อมูลสีเพื่อให้เข้ารหัสเป็น H.264

เนื่องจากฉันไม่ได้ใช้ SSD ข้อมูลวิดีโอจึงมาถึงเร็วกว่าที่ฉันสามารถเขียนลงดิสก์ได้ แต่ก็โอเคมันเป็นที่ยอมรับสำหรับฉันที่จะทิ้งเฟรมวิดีโอเมื่อฉันเหลือแรมน้อย สิ่งที่ฉันต้องการเพียงอย่างเดียวคือสิ่งที่ฉันทำต่อเนื่องเป็นส่วนใหญ่ต่อเนื่อง 8-10 วินาทีวิดีโอ ดังนั้นฉันจึงได้เพิ่มตรรกะบางอย่างในแอปพลิเคชั่น. NET 4.5 ของฉันเพื่อเริ่มทิ้งเฟรมวิดีโอเมื่อฉันไม่มี RAM เพียงพอที่จะบัฟเฟอร์บัฟเฟอร์ต่อเนื่องวิดีโอ 8 ถึง 10 วินาที (ประมาณ 1.5 ถึง 2 GB)

และเพื่อป้องกันการฟาดหน้าฉันจึงปิดการใช้งานไฟล์เพจจิ้งอย่างสมบูรณ์ ทำให้ฉันมี RAM จริงทั้งหมด 16 GB

ปัญหาของฉันคือแม้จะมีกลไกนั้นอยู่แล้วบางครั้งแอปพลิเคชัน. NET ของฉันหรือกระบวนการย่อย ffmpeg ยังคงถูกฆ่าเมื่อ Windows 8.1 ประหลาดใจเกี่ยวกับ RAM ต่ำเพราะเห็นได้ชัดว่าแอปพลิเคชันของฉันใช้ RAM ส่วนใหญ่ เพื่อเขียนลงดิสก์ มีวิธีบอก Windows หรือไม่ว่ากระบวนการของฉันสำคัญกว่ากระบวนการอื่น ๆ เพื่อที่ Windows จะเริ่มฆ่ากระบวนการที่สำคัญน้อยกว่าก่อน


10
ฉันไม่คิดว่า windows ฆ่ากระบวนการฉันคิดว่านั่นเป็นคุณสมบัติลินุกซ์เท่านั้น
Scott Chamberlain

4
@ScottChamberlain: นั่นเป็นเพราะการปิดเพจไฟล์ใน Windows นั้นหาได้ยากมาก มันทำให้คุณทุกชนิดของพฤติกรรมที่ไม่คาดคิดและผิดปกติ คำตอบที่ชัดเจนที่นี่คือ "อย่าปิดแฟ้มเพจจิ้งซึ่งบังคับให้ Windows เก็บข้อมูลที่ไม่ได้ใช้ใน RAM เพื่อให้แอปของคุณไม่สามารถใช้ RAM นั้น"
MSalters

1
หากนี่เป็นคำถาม StackOverflow ฉันสามารถชี้ให้คุณเห็นCreateMemoryResourceNotificationว่าการแฮ็กน้อยกว่ามาก
MSalters

7
@Kal: หากการเข้าถึงดิสก์เป็นคอขวดให้ใช้การบีบอัดที่แรงกว่าหาก CPU เป็นคอขวดให้ใช้การบีบอัดที่เร็วขึ้น หากทั้งคู่เป็นคอขวดให้คิดทบทวนการออกแบบทั้งหมดของคุณแล้วเริ่มใหม่หรือรับฮาร์ดแวร์ที่ดีกว่า
Mooing Duck

1
@FactorMystic OMG เขาทำอะไร การปิดใช้งานไฟล์หน้าจะลด RAM ที่ใช้งานได้อย่างมาก
Aron

คำตอบ:


45

Windows ไม่ได้ฆ่ากระบวนการเมื่อใช้ RAM ทั้งหมด สิ่งที่เกิดขึ้นจริงคือกระบวนการไม่สามารถจัดสรรหน่วยความจำและความล้มเหลว

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

งานนำเสนอนี้จาก Technet อธิบาย: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405

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

หน่วยความจำเสมือนเป็นรากฐานของวิธีการที่ระบบปฏิบัติการสมัยใหม่จัดสรรทรัพยากรดังนั้นทุกอย่างเกี่ยวกับการมีสิ่งต่าง ๆ ใน RAM ที่ใช้งานอยู่และการย้ายสิ่งเข้าและออกจากดิสก์

มีคำตอบเพียงสองข้อเท่านั้น:

  1. เปิดใช้งาน pagefile อีกครั้งและเพิ่ม RAM บนคอมพิวเตอร์ของคุณเพื่อลดการกระตุกดิสก์
  2. ลดความต้องการหน่วยความจำของแอปพลิเคชันของคุณ

บรรทัดล่างคือ RAM เป็นเพียงอีกระดับของแคชและทุกสิ่งที่เกี่ยวกับหน่วยความจำเสมือน, ไฟล์หน้า, ไฟล์ที่ถูกแมปหน่วยความจำและทั้งหมดที่มาลงที่นี้: ถ้าคุณมีหน่วยความจำหมดคุณต้องเพิ่ม มากกว่า.


4
หรือใช้ให้น้อยลง ....
พฤศจิกายน

1
โปรดทราบว่างานค้างกำลังสร้างขึ้นเนื่องจากข้อมูลไม่สามารถเขียนลงดิสก์ได้เร็วพอ ฉันไม่คิดว่าการเปิดใช้งานหน่วยความจำเสมือนบนดิสก์เดียวกันสามารถช่วยได้ที่นั่น ...
Alexander

3
ในความเป็นจริงไฟล์หน้าจะเป็นที่อื่นในดิสก์ และเนื่องจากเรารู้ว่าไม่ใช่ SSD นั่นหมายถึงการค้นหาทางกายภาพซึ่งเป็นการทำงานของดิสก์ที่ช้าที่สุด
MSalters

9
ดูเหมือนว่าคุณต้องการการจัดการหน่วยความจำที่ชัดเจนในแอปพลิเคชันของคุณแล้ว ...
Joe

1
@ โจนี้อย่างแน่นอน ตัวรวบรวมขยะจะทำให้การจัดการหน่วยความจำเป็นฝันร้ายในสถานการณ์ประเภทนี้ สถานการณ์ประเภทนี้ไม่สำคัญสำหรับฉันที่จะจัดการกับใน C ++ เพราะฉันมีการควบคุมการใช้งานหน่วยความจำทั้งหมดอย่างละเอียด แม้ว่าจะมีรูปแบบการออกแบบที่สามารถใช้งานได้ดีกับเคสนี้ใน C # แต่ก็ไม่ง่ายเหมือนที่คนส่วนใหญ่จะลอง
Thebluefish

0

ไปที่แผงเครื่องมือ Windows & การตั้งค่าขั้นสูงและปิดการใช้งานสิ่งที่ไม่จำเป็นเช่นเอฟเฟกต์หน้าต่างหากคุณยังไม่ได้รับ Sysinternals Process Explorer & / หรือการตรวจสอบระบบเพื่อค้นหาและปิดสิ่งอื่นใดที่ทำให้ CPU หรือหน่วยความจำ

ที่สำคัญกว่านั้นให้ใช้ Process Explorer & / หรือ System Monitor เพื่อดูว่าโปรแกรมของคุณกำลังทำงานอยู่และดูว่ามันล้มเหลวที่ไหนและอย่างไร เธรดใดที่ขาดหน่วยความจำและตายก่อน - ส่วน prgm หลักหรือส่วน ffmpeg มี dll เฉพาะหรือทรัพยากรที่ใช้ร่วมกันอื่น ๆ ที่ลูกโป่งมีขนาดโดยไม่คาดคิดหรือไม่? หรือการดำเนินการเป็นไปอย่างถูกต้องยกเว้นการกัดมากกว่าที่จะเคี้ยวข้อมูล

การกำหนดลักษณะของปัญหาของคุณให้แม่นยำยิ่งขึ้นจะนำคุณไปสู่แนวทางแก้ไข ตัวอย่างเช่นคุณสามารถใช้นโยบายการวางเฟรมของคุณได้มากขึ้นในขณะที่ปรับให้ดีขึ้นสำหรับเกณฑ์ chunk 8-10 วินาทีของคุณเพื่อให้ได้ RAM โดยรวมที่ต่ำ

คำแนะนำสุดท้าย: อาจลองเปลี่ยนมาใช้ Linux และเปิดใช้งานไฟล์เพจจิ้งอีกครั้ง (linux เรียกมันว่าพื้นที่สว็อปซึ่งทำให้ IMHO สนุกยิ่งขึ้นเช่นการแลกเปลี่ยนหรือพบเจอ!) โชคดี

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