หน่วยความจำขัด Linux สามารถ?


10

Linux มีกลไกในการ "ขัด" หน่วยความจำหรือไม่? เช่นการทดสอบหน่วยความจำและการทำเครื่องหมายพื้นที่สกปรกถ้าพวกเขาล้มเหลวเพื่อให้ระบบสามารถดำเนินการต่อ "ปลอดภัย" แม้จะติดตั้งชิปแรมไม่ดี?!

คำตอบ:


2

คำตอบคือใช่และจะทำอย่างโปร่งใส (หากคุณมีหน่วยความจำ 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


1
การดำเนินการนี้ใช้เฉพาะถ้าคุณมีหน่วยความจำ ECC ที่แพงกว่า
psusi

สิ่งนี้ใช้กับความทรงจำทั้งหมดด้วย ECC ไม่ว่าจะเป็นพาริตี้ (แต่คุณไม่สามารถแก้ไขได้), SECDED, Chipkill ที่แพงกว่าหรือใหม่กว่า DDR1 สามารถติดตั้ง ECC ได้แล้ว แต่ทุกอย่างขึ้นอยู่กับรุ่นที่คุณใช้ ตลาด "บ้าน" มักไม่ต้องการความยืดหยุ่น แต่ซูเปอร์คอมพิวเตอร์ได้ติดตั้งมานานกว่า 20 ปีแล้ว - เซิร์ฟเวอร์อยู่ระหว่างนั้น
Cimbali

1
ฉันหมายถึงหน่วยความจำ ECC มีราคาแพงกว่า (ไม่ใช่ ECC) และคนส่วนใหญ่ไม่มี
psusi

1
"คนส่วนใหญ่" นั้นค่อนข้างคลุมเครือ ไม่ว่าจะเป็นเรื่องปกติที่จะต้องจ่ายราคาในการลงทุนและพลังงานขึ้นอยู่กับตลาดเช่นที่ฉันพูด แล็ปท็อป Dell เฉลี่ยของฉันตอนนี้อายุ 2 ปีติดตั้งแล้ว (มาตรฐานไม่มีตัวเลือกพิเศษถาม) มันเริ่มเป็นที่แพร่หลายมากขึ้นเนื่องจากคุณสมบัติการย่อขนาดทำให้ DIMM มีความรู้สึกต่อการแผ่รังสีต่างๆมากขึ้น
Cimbali

1
Cimbali ใครทำ "ตระเวนขัดถู" (บนระบบที่มีหน่วยความจำ ECC) - เฟิร์มแวร์ไบออส (อาจอยู่ในโหมด smm, โปร่งใสสำหรับเคอร์เนลระบบปฏิบัติการ) หรือเคอร์เนลลินุกซ์ในบางโหมดซอฟต์แวร์ หน่วยความจำ ECC ไม่ได้ตรวจสอบผลรวม ecc; เพื่อตรวจสอบ ecc ข้อมูลจะต้องอ่าน (และรูปแบบ ecc ในตัวควบคุมหน่วยความจำจะตรวจสอบผลรวม) หน่วยความจำบางส่วนถูกอ่านบ่อย (โดยโปรแกรมปกติบน cpu) หน่วยความจำบางอันอาจไม่สามารถอ่านได้นานหลายสัปดาห์ การลาดตระเวนจะอ่านหน่วยความจำทุกวัน (Intel) หรือทุก ๆ 1-48 ชั่วโมงเพื่อทำการตรวจสอบ ecc - electronics.stackexchange.com/q/73546#comment911379_73573
osgx

7

นี่เป็นความคิดที่แย่จริงๆ หน่วยความจำไม่สามารถทดสอบได้อย่างน่าเชื่อถือในการกวาดอย่างรวดเร็ว นี่คือเหตุผลที่ซอฟต์แวร์เช่น memtest86 ใช้การผ่านหลายครั้งด้วยบิตแพตเตอร์ที่แตกต่างกันเพื่อทดสอบหน่วยความจำ วิธีการแก้:

  1. ทดสอบหน่วยความจำด้วยmemtest86ควรทดสอบนานกว่าปล่อยทิ้งไว้ข้ามคืนมันจะใช้เวลานาน

  2. หากตรวจพบหน่วยความจำไม่ดีให้ใช้memmap พารามิเตอร์เคอร์เนลเพื่อบังคับให้เคอร์เนลไม่ใช้หน่วยความจำนั้น:

   memmap = NN [KMG] $ ss [KMG]
            [KNL, ACPI] ทำเครื่องหมายหน่วยความจำเฉพาะตามที่สงวนไว้
            ขอบเขตของหน่วยความจำที่จะใช้จาก ss ถึง ss + nn
            ตัวอย่าง: ยกเว้นหน่วยความจำจาก 0x18690000-0x1869ffff
                     memmap = 64K $ 0x18690000
                     หรือ
                     memmap = 0x10000 $ 0x18690000

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


ขอบคุณสำหรับคำแนะนำเกี่ยวกับพารามิเตอร์เคอร์เนลเหล่านั้น คุณคิดว่าคุณสามารถอธิบายได้อย่างชัดเจนว่าเหตุใดจึงเป็นความคิดที่ไม่ดีและทำไมคุณไม่สามารถตรวจสอบหน่วยความจำโดยใช้วิธีการเดียวกันกับ memtest86 (+)? ฉันทราบว่าการทดสอบที่เชื่อถือได้มากขึ้นนั้นต้องใช้เวลา CPU มากขึ้น (และอาจมี RAM ที่ใหญ่กว่าในคราวเดียว) แต่ทำไมสิ่งนี้จึงต้องมีการหยุดการแสดง? เวลา CPU อาจไม่เป็นปัญหาหากแพร่กระจายในระยะเวลานานพอและนอกเหนือจากซีพียูหลายตัวกลายเป็นกระแสหลักมากขึ้นเรื่อย ๆ
Waxhead

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

haimg: คำถาม: VFS จะจัดการการเพจสำหรับหน่วยความจำที่สงวนไว้นี้หรือไม่? ฉันคิดว่ามันไม่สามารถทำได้เพราะมันจะไม่ปรากฏให้เห็น
Jay D

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

1
ฉันคิดว่ามันน่าสนใจที่จะรวมการอ้างอิงถึงโมดูลเคอร์เนลbadramที่นี่ มันใช้ memtest86 ตามที่คุณเสนอ แต่แทนที่จะละเว้นการใช้เคอร์เนลหน่วยความจำไม่ดีมันจะจัดสรรให้เคอร์เนลที่ไม่ได้ใช้อย่างมีประสิทธิภาพรับประกันว่าทั้งเคอร์เนลและแอปพลิเคชันของคุณทำงานในหน่วยความจำนั้น
Cimbali

2

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

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

การขัดเป็นสิ่งสำคัญเพราะหากไม่มีหน่วยความจำที่อ่านแล้ว แต่ไม่ได้เขียน (เช่นหน้ารหัส) อาจสะสมข้อผิดพลาดเมื่อเวลาผ่านไป


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

1
แม้จะมีคำตอบของเดฟแลร์รี่ก็ค่อนข้างถูกต้องคำตอบ / ไม่ / เข้าใจผิดคำถาม คำถามจะถามว่า linux สามารถทำการขัดหน่วยความจำได้หรือไม่ตามที่ Larry อธิบายไว้อย่างรอบคอบเพื่อป้องกันข้อผิดพลาดบิตเดียวที่ตรวจพบและแก้ไขโดย ECC h / w จากการเปลี่ยนเป็นข้อผิดพลาด 2 บิตที่ไม่สามารถแก้ไขได้ คำตอบพูดคุยเกี่ยวกับวิธีการตรวจสอบข้อผิดพลาดเหล่านั้นในครั้งแรกที่ใช้ซอฟต์แวร์
เอียน

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

1

ถ้าคุณมีหน่วยความจำ ECC คุณอาจต้องการที่จะมีการมองใกล้ที่https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-edac (ฉันพบว่า "sdram_scrub_rate" น่าสนใจเป็นพิเศษ)

(ถ้าลิงค์นี้แตกในบางจุด (ไม่ควรทำจริงๆ) ฉันขอแนะนำให้ดาวน์โหลดเอกสาร Linux ที่เหมาะสมและค้นหาคำว่า "scrub")

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