Linux có thể xóa bộ nhớ?


10

Linux có cơ chế "xóa" bộ nhớ không? ví dụ: kiểm tra bộ nhớ và đánh dấu các khu vực là bẩn nếu chúng bị lỗi để hệ thống có thể tiếp tục hoạt động "an toàn" ngay cả với các chip ram xấu được cài đặt?!

Câu trả lời:


2

Câu trả lời là có, và nó được thực hiện một cách minh bạch (miễn là bạn có bộ nhớ ECC để phát hiện lỗi và phiên bản kernel của bạn ít nhất là 2.6.30 để tiếp tục hoạt động an toàn).

Về cơ bản, bộ nhớ của bạn được kiểm tra mỗi lần đọc từ bộ xử lý và được kiểm tra định kỳ *, để kiểm tra tính nhất quán với Mã sửa lỗi (ECC). Nếu xảy ra lỗi, bạn nhận được Ngoại lệ kiểm tra máy, sau đó được ghi lại và lấy bởi mcelog ( http://www.mcelog.org/ ).

Nếu lỗi của bạn có thể sửa được, nó sẽ tăng bộ đếm "thùng bị rò rỉ", điều này gây ra một DIMM vật lý không thường xuyên bị thay thế trong suốt bằng một bộ đếm khác. Do đó, trang bộ nhớ của bạn được sao chép sang một vị trí mới, địa chỉ bộ nhớ ảo của bạn được cập nhật để trỏ đến trang mới và trang cũ được HĐH đánh dấu là không sử dụng nữa.

Điều này được gọi là "mềm mại" trên Linux (và nghỉ hưu trang bộ nhớ trên Solaris, tôi không biết về các hệ điều hành khác).

Tuy nhiên, nếu lỗi của bạn không thể sửa được, thì cái gọi là "lỗi cứng" xảy ra, đó là trang bộ nhớ của bạn bị xóa khỏi quản lý bộ nhớ hệ điều hành bình thường và ứng dụng của bạn bị giết (NB: bởi một số tín hiệu SIGBUS có thể bắt được cho bạn biết lỗi đã xảy ra, nhưng hiếm khi không quan tâm và cố gắng bắt nó). Nếu trang bộ nhớ của bạn được ánh xạ từ một tệp và sạch, HĐH cũng có thể tải lại nó trong suốt tại một vị trí thực tế khác thay vì giết quá trình.

Bạn có thể đọc thêm trên mcelog, có nhiều tùy chọn cấu hình, bạn có thể kích hoạt các hành vi khác, tùy chọn và các hướng dẫn khác về những gì cần đọc và cách đảm bảo mcelog đang chạy trên hệ thống của bạn.


* Chà hoặc "Patrol Scrubbing" bao gồm đọc bộ nhớ, kiểm tra xem nó có lỗi với ECC không, và ghi đè bằng các từ bộ nhớ đã sửa khi phát hiện ra lỗi. Thuật ngữ chà tuần tra được sử dụng bởi phe đối lập để ghi đè dữ liệu không chính xác về lỗi trong các lần đọc bộ nhớ, đôi khi được gọi là "Xóa theo yêu cầu". Chà là một quy trình phần cứng có thể được kích hoạt, thường là thông qua BIOS.


1
Điều này chỉ áp dụng nếu bạn có bộ nhớ ECC đắt hơn.
psusi

Điều này áp dụng cho tất cả các ký ức với ECC. Có thể là tính chẵn lẻ (nhưng sau đó bạn không thể sửa), BÍ MẬT, Chipkill đắt hơn hoặc bất kỳ loại nào mới hơn. DDR1 có thể đã triển khai ECC, nhưng tất cả sẽ phụ thuộc vào mô hình thực tế bạn sử dụng. Theo truyền thống, thị trường "nhà" có nhu cầu phục hồi ít hơn, nhưng siêu máy tính đã được trang bị chúng trong hơn 20 năm - các máy chủ ở giữa.
Cimbali

1
Ý tôi là bộ nhớ ECC đắt hơn (không phải ECC) và vì vậy hầu hết mọi người không có nó.
psusi

1
Vâng "hầu hết mọi người" là khá mơ hồ. Việc trả giá đầu tư và quyền lực có phụ thuộc vào thị trường hay không, như tôi đã nói. Máy tính xách tay Dell trung bình của tôi, hiện đã được 2 tuổi, được trang bị nó (tiêu chuẩn, không có tùy chọn đặc biệt nào được yêu cầu). Nó ngày càng trở nên phổ biến hơn, bởi vì việc thu nhỏ các tính năng làm cho các DIMM trở nên nhạy cảm hơn với các bức xạ khác nhau.
Cimbali

1
Cimbali, người thực hiện "Patrol Scrubbing" (trên các hệ thống có bộ nhớ ECC) - phần sụn bios (có thể ở chế độ smm, trong suốt cho kernel OS) hoặc kernel linux trong một số chế độ phần mềm (mô đun nào thực hiện quá trình tuần tra)? Bộ nhớ ECC không kiểm tra tổng ecc; để kiểm tra ecc, dữ liệu phải được đọc (và sơ đồ ecc trong bộ điều khiển bộ nhớ sẽ kiểm tra tổng). Một số bộ nhớ được đọc thường xuyên (bởi các chương trình bình thường trên cpu), một số khác có thể không được đọc trong nhiều tuần. Việc cọ sát tuần tra sẽ đọc tất cả bộ nhớ mỗi ngày (intel) hoặc cứ sau 1-48 giờ để kiểm tra ecc - Electronics.stackexchange.com/q/73546#comment911379_73573
osgx

7

Đây thực sự là một ý tưởng tồi. Bộ nhớ không thể được kiểm tra một cách đáng tin cậy trong một lần quét nhanh. Đây là lý do tại sao phần mềm như memtest86 sử dụng nhiều đường chuyền với các bit bit khác nhau để kiểm tra bộ nhớ. Giải pháp:

  1. Kiểm tra bộ nhớ với memtest86 , tốt nhất là kiểm tra dài, để nó chạy qua đêm, sẽ mất nhiều thời gian.

  2. Nếu phát hiện bộ nhớ xấu, sử dụng memmap tham số kernel để buộc kernel không sử dụng bộ nhớ đó:

   memmap = nn [KMG] $ ss [KMG]
            [KNL, ACPI] Đánh dấu bộ nhớ cụ thể là dành riêng.
            Vùng nhớ được sử dụng, từ ss đến ss + nn.
            Ví dụ: Loại trừ bộ nhớ từ 0x18690000-0x1869ffff
                     bản đồ = 64K $ 0x18690000
                     hoặc là
                     bản đồ = 0x10000 $ 0x18690000

Ngoài ra, bạn có thể sử dụng bộ nhớ ECC sẽ tự động sửa lỗi 1 bit và tự động phát hiện lỗi 2 bit trong bộ nhớ của bạn (và bạn sẽ nhận được thông báo nhật ký từ kernel về các sự cố bộ nhớ không chính xác nếu chúng xảy ra)


Cảm ơn các mẹo về các tham số kernel. Bạn có nghĩ rằng bạn vui lòng có thể làm rõ lý do tại sao đây là một ý tưởng tồi như vậy và tại sao bạn không thể kiểm tra một đoạn bộ nhớ bằng các phương pháp tương tự như memtest86 (+) không? Tôi biết rằng việc kiểm tra đáng tin cậy hơn đòi hỏi nhiều thời gian CPU hơn (và có thể cả khối ram lớn hơn trong một lần) nhưng tại sao điều này phải là một điểm dừng hiển thị? Thời gian CPU có thể không phải là vấn đề nếu trải đều trong một khoảng thời gian đủ dài và bên cạnh đó nhiều cpu đang ngày càng trở nên phổ biến hơn.
Sáp

Về mặt kỹ thuật, nếu được thực hiện trong khoảng thời gian đủ dài, điều này có thể là có thể. Nhưng nút cổ chai ở đây không phải là CPU, mà là bus bộ nhớ và dĩ nhiên bạn "đầu độc" bộ nhớ cache của CPU. Tôi không biết về mô-đun hạt nhân như vậy và ý tưởng này rất mong manh đối với tôi (sắp xếp mô hình lặp đi lặp lại viết vào một vùng bộ nhớ tùy ý trên hệ thống trực tiếp, v.v.)
haimg

haimg: câu hỏi: VFS sẽ quản lý phân trang cho bộ nhớ dành riêng này? tôi nghĩ rằng nó không thể được nhìn thấy bởi nó.
Jay D

1
@Waxhead Việc xóa bộ nhớ thường được thực hiện ở cấp BIOS bằng phần cứng. Nếu được bật, bạn nên tìm các tùy chọn để cọ sát tuần tra và yêu cầu chà. Nếu tính toàn vẹn của bộ nhớ là quan trọng đối với bạn, thì chắc chắn là nếu bạn đang sử dụng bộ nhớ ECC, thì hiệu suất nhỏ đạt được bằng cách bật các tùy chọn này là đáng giá.
Ian

1
Tôi nghĩ sẽ rất thú vị khi bao gồm một tham chiếu đến mô-đun kernel badram ở đây. Nó sử dụng memtest86 như bạn đề xuất, nhưng thay vì kiềm chế kernel sử dụng bộ nhớ xấu, nó phân bổ nó cho kernel để không sử dụng, đảm bảo hiệu quả rằng cả kernel và ứng dụng của bạn không chạy vào bộ nhớ đó.
Cimbali

2

Các bài đăng và trả lời hiểu sai vấn đề. Việc xóa bộ nhớ nhằm mục đích giữ cho các lỗi bit đơn có thể sửa được biến thành các lỗi kép không chính xác. Thỉnh thoảng, bộ lọc chỉ đơn thuần là tất cả bộ nhớ vật lý (buộc bộ nhớ cache bị mất). Nếu có bất kỳ lỗi bit đơn nào, chúng sẽ được sửa chữa (và việc hiệu chỉnh phải ghi lại giá trị chính xác bằng cách sử dụng so sánh và trao đổi), do đó sẽ xóa lỗi.

Mặt khác, nếu một lỗi thứ hai xảy ra trong một từ đã có một lỗi, toàn bộ từ đó sẽ không chính xác và HĐH sẽ phải làm một cái gì đó quyết liệt.

Chà là rất quan trọng vì không có nó, bộ nhớ được đọc nhưng không được ghi (như các trang mã) có thể tích lũy lỗi theo thời gian.


Tại sao bạn nghĩ rằng câu trả lời bỏ lỡ hiểu vấn đề khi nó đã được đánh dấu là câu trả lời?
Dave

1
Mặc dù trả lời của Dave, Larry hoàn toàn chính xác, câu trả lời / không / hiểu sai câu hỏi. Câu hỏi đặt ra là liệu linux có thể thực hiện việc xóa bộ nhớ hay không, như cách giải thích cẩn thận của Larry, để ngăn các lỗi đơn bit được ECC h / w phát hiện và sửa thành các lỗi 2 bit không thể sửa được. Câu trả lời nói về cách phát hiện những lỗi đó ngay từ đầu bằng ứng dụng phần mềm.
Ian

Tôi nghĩ rằng bạn hiểu sai mục đích ở đây. Tất nhiên bạn đúng trong mô tả của mình về việc cọ sát, tuy nhiên nếu bạn chạy một máy chủ tệp (không quan trọng) trên ram không ecc và có các chu kỳ CPU để dự phòng thì có vẻ như sớm muộn cũng có thể phát hiện ra lỗi bộ nhớ và đánh dấu nó là xấu và biết về nó hơn là không biết về một chip bộ nhớ xấu. Có lẽ một từ ngữ tốt hơn sẽ là xác nhận / xác minh bộ nhớ. Không phải kỹ thuật cọ sát có lẽ, nhưng vẫn là một cách hữu hiệu để giảm thiệt hại do bộ nhớ có khả năng xấu.
Sáp

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.