Linux มีกลไกในการ "ขัด" หน่วยความจำหรือไม่? เช่นการทดสอบหน่วยความจำและการทำเครื่องหมายพื้นที่สกปรกถ้าพวกเขาล้มเหลวเพื่อให้ระบบสามารถดำเนินการต่อ "ปลอดภัย" แม้จะติดตั้งชิปแรมไม่ดี?!
Linux มีกลไกในการ "ขัด" หน่วยความจำหรือไม่? เช่นการทดสอบหน่วยความจำและการทำเครื่องหมายพื้นที่สกปรกถ้าพวกเขาล้มเหลวเพื่อให้ระบบสามารถดำเนินการต่อ "ปลอดภัย" แม้จะติดตั้งชิปแรมไม่ดี?!
คำตอบ:
คำตอบคือใช่และจะทำอย่างโปร่งใส (หากคุณมีหน่วยความจำ ECC เพื่อตรวจหาข้อผิดพลาดและรุ่นเคอร์เนลของคุณอย่างน้อย 2.6.30 เพื่อให้ทำงานได้อย่างปลอดภัย)
โดยทั่วไปหน่วยความจำของคุณจะถูกตรวจสอบทุกครั้งที่อ่านจากโปรเซสเซอร์และขัดเป็นระยะ * เพื่อตรวจสอบความสอดคล้องกับรหัสการแก้ไขข้อผิดพลาด (ECC) หากมีข้อผิดพลาดเกิดขึ้นคุณจะได้รับข้อยกเว้นการตรวจสอบเครื่องจักรซึ่งจะถูกบันทึกและคว้าโดย mcelog ( http://www.mcelog.org/ )
หากข้อผิดพลาดของคุณถูกต้องมันจะเพิ่มตัวนับ "ถังที่รั่ว" ซึ่งทำให้ DIMM ทางกายภาพที่ล้มเหลวบ่อยเกินไปที่จะถูกแทนที่โดยโปร่งใสอีกอันหนึ่ง ดังนั้นหน้าหน่วยความจำของคุณจะถูกคัดลอกไปยังตำแหน่งใหม่ที่อยู่หน่วยความจำเสมือนของคุณจะได้รับการอัปเดตให้ชี้ไปที่หน้าใหม่และหน้าเก่าจะถูกทำเครื่องหมายโดยระบบปฏิบัติการเพื่อไม่ให้ใช้อีกต่อไป
สิ่งนี้เรียกว่า "soft-offlining" บน Linux (และการยกเลิกเพจหน่วยความจำบน Solaris ฉันไม่รู้เกี่ยวกับระบบปฏิบัติการอื่น)
หากข้อผิดพลาดของคุณไม่สามารถแก้ไขได้อย่างไรก็ตามสิ่งที่เรียกว่า "hard-offining" เกิดขึ้นนั่นคือหน้าหน่วยความจำของคุณจะถูกลบออกจากการจัดการหน่วยความจำระบบปฏิบัติการปกติและแอปพลิเคชันของคุณถูกฆ่า (NB: โดยสัญญาณ SIGBUS เกิดข้อผิดพลาด แต่หายากพอที่จะไม่สนใจและพยายามจับมัน) หากหน้าหน่วยความจำของคุณถูกแมปจากไฟล์และล้างระบบปฏิบัติการยังสามารถโหลดซ้ำได้ที่ตำแหน่งทางกายภาพอื่นแทนการฆ่ากระบวนการ
คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ mcelog มีตัวเลือกการกำหนดค่ามากมายคุณสามารถรับพฤติกรรมอื่น ๆ ที่จะถูกเรียกใช้ตัวเลือกและโอกาสในการขายอื่น ๆ ในการอ่านและวิธีการทำให้แน่ใจว่า mcelog ทำงานบนระบบของคุณ
* Scrubbing หรือ "Patrol Scrubbing" ประกอบด้วยหน่วยความจำในการอ่านตรวจสอบกับข้อผิดพลาด ECC และเขียนทับด้วยคำหน่วยความจำที่ถูกต้องเมื่อพบข้อผิดพลาด การขัดคำลาดตระเวนถูกใช้โดยฝ่ายตรงข้ามเพื่อเขียนทับข้อมูลที่ไม่ถูกต้องเกี่ยวกับข้อผิดพลาดในการอ่านหน่วยความจำซึ่งบางครั้งเรียกว่า "Demand Scrubbing" การขัดถูเป็นขั้นตอนฮาร์ดแวร์ที่สามารถเปิดใช้งานได้โดยปกติผ่านทาง BIOS
นี่เป็นความคิดที่แย่จริงๆ หน่วยความจำไม่สามารถทดสอบได้อย่างน่าเชื่อถือในการกวาดอย่างรวดเร็ว นี่คือเหตุผลที่ซอฟต์แวร์เช่น memtest86 ใช้การผ่านหลายครั้งด้วยบิตแพตเตอร์ที่แตกต่างกันเพื่อทดสอบหน่วยความจำ วิธีการแก้:
ทดสอบหน่วยความจำด้วยmemtest86ควรทดสอบนานกว่าปล่อยทิ้งไว้ข้ามคืนมันจะใช้เวลานาน
หากตรวจพบหน่วยความจำไม่ดีให้ใช้memmap
พารามิเตอร์เคอร์เนลเพื่อบังคับให้เคอร์เนลไม่ใช้หน่วยความจำนั้น:
memmap = NN [KMG] $ ss [KMG] [KNL, ACPI] ทำเครื่องหมายหน่วยความจำเฉพาะตามที่สงวนไว้ ขอบเขตของหน่วยความจำที่จะใช้จาก ss ถึง ss + nn ตัวอย่าง: ยกเว้นหน่วยความจำจาก 0x18690000-0x1869ffff memmap = 64K $ 0x18690000 หรือ memmap = 0x10000 $ 0x18690000
นอกจากนี้คุณสามารถใช้หน่วยความจำ ECC ซึ่งจะแก้ไขข้อผิดพลาด 1 บิตและตรวจสอบข้อผิดพลาด 2 บิตในหน่วยความจำของคุณโดยอัตโนมัติ (และคุณจะได้รับข้อความบันทึกจากเคอร์เนลเกี่ยวกับปัญหาหน่วยความจำที่ไม่สามารถแก้ไขได้หากเกิดขึ้น)
โพสต์และคำตอบเข้าใจผิดปัญหา การขัดหน่วยความจำมีวัตถุประสงค์เพื่อป้องกันข้อผิดพลาดบิตเดียวที่ถูกต้องจากการเปลี่ยนเป็นข้อผิดพลาดสองครั้งที่ไม่สามารถแก้ไขได้ Scrubber เพียงหน่วยความจำกายภาพทั้งหมด (บังคับให้แคชทำพลาด) เป็นครั้งคราว หากมีข้อผิดพลาดบิตเดียวพวกเขาจะได้รับการแก้ไข (และการแก้ไขจะต้องเขียนค่าที่ถูกต้องโดยใช้การเปรียบเทียบและสลับ) ดังนั้นการล้างข้อผิดพลาด
มิฉะนั้นหากเกิดข้อผิดพลาดครั้งที่สองในคำที่มีอยู่แล้วข้อผิดพลาดทั้งคำจะไม่สามารถแก้ไขได้และระบบปฏิบัติการจะต้องทำอะไรบางอย่างที่รุนแรง
การขัดเป็นสิ่งสำคัญเพราะหากไม่มีหน่วยความจำที่อ่านแล้ว แต่ไม่ได้เขียน (เช่นหน้ารหัส) อาจสะสมข้อผิดพลาดเมื่อเวลาผ่านไป