Bisakah Linux menggosok memori?

10

Apakah Linux memiliki mekanisme untuk "menggosok" memori? misalnya menguji memori dan menandai area sebagai kotor jika gagal sehingga sistem dapat terus beroperasi "dengan aman" bahkan dengan chip ram buruk diinstal ?!

Waxhead
sumber

Jawaban:

2

Jawabannya adalah ya, dan itu dilakukan secara transparan (asalkan Anda memiliki memori ECC untuk mendeteksi kesalahan, dan versi kernel Anda setidaknya 2.6.30 untuk terus beroperasi dengan aman).

Pada dasarnya, memori Anda diperiksa pada setiap pembacaan dari prosesor, dan digosok secara berkala *, untuk memeriksa konsistensi dengan Error Correcting Codes (ECC). Jika kesalahan terjadi, Anda mendapatkan Pengecualian Pemeriksaan Mesin, yang kemudian dicatat dan diambil oleh mcelog ( http://www.mcelog.org/ ).

Jika kesalahan Anda dapat diperbaiki, itu menambah penghitung "leaky bucket", yang menyebabkan DIMM fisik yang gagal terlalu sering diganti secara transparan oleh yang lain. Dengan demikian halaman memori Anda disalin ke lokasi baru, alamat memori virtual Anda diperbarui untuk menunjuk ke halaman baru, dan halaman lama ditandai oleh OS karena tidak akan digunakan lagi.

Ini disebut "soft-offlining" di Linux (dan pensiunnya halaman memori di Solaris, saya tidak tahu tentang OS lain).

Namun jika kesalahan Anda tidak dapat diperbaiki, apa yang disebut "hard-offlining" terjadi, yaitu halaman memori Anda dihapus dari manajemen memori sistem operasi normal, dan aplikasi Anda terbunuh (NB: oleh beberapa sinyal SIGBUS yang dapat ditangkap yang memberi tahu Anda di mana kesalahan terjadi, tetapi cukup jarang untuk tidak peduli dan mencoba menangkapnya). Jika halaman memori Anda dipetakan dari file dan bersih, OS juga dapat memuat ulang secara transparan di lokasi fisik lain alih-alih mematikan proses.

Anda dapat membaca lebih lanjut tentang mcelog, ada banyak opsi konfigurasi, Anda bisa memicu perilaku lain, opsi, dan arahan lain tentang apa yang harus dibaca dan bagaimana memastikan mcelog berjalan di sistem Anda.


* Menggosok, atau "Menggosok Patroli" terdiri dari membaca memori, memeriksanya terhadap ECC untuk kesalahan, dan menimpa dengan kata-kata memori yang dikoreksi ketika kesalahan ditemukan. Istilah penggosokan patroli digunakan oleh oposisi untuk menimpa data yang salah tentang kesalahan dalam memori yang dibaca, yang kadang-kadang disebut "Permintaan Penggosokan". Scrubbing adalah prosedur perangkat keras yang dapat diaktifkan, biasanya melalui BIOS.

Cimbali
sumber
1
Ini hanya berlaku jika Anda memiliki memori ECC yang lebih mahal.
psusi
Ini berlaku untuk semua memori dengan ECC. Baik paritas (tetapi kemudian Anda tidak dapat memperbaiki), SECDED, Chipkill yang lebih mahal atau yang lebih baru. DDR1 sudah bisa mengimplementasikan ECC, tetapi semuanya akan tergantung pada model aktual yang Anda gunakan. Pasar "rumah" secara tradisional kurang membutuhkan ketahanan, tetapi superkomputer telah dilengkapi dengan mereka selama lebih dari 20 tahun - server ada di antaranya.
Cimbali
1
Maksudku memori ECC lebih mahal (daripada non ECC) dan kebanyakan orang tidak memilikinya.
psusi
1
Yah, "kebanyakan orang" agak kabur. Apakah lazim untuk membayar harga dalam investasi dan kekuasaan tergantung pada pasar, seperti yang saya katakan. Rata-rata laptop Dell saya, yang sudah berusia 2 tahun sekarang, dilengkapi dengan itu (standar, tidak ada opsi khusus yang diminta). Semakin umum, karena miniaturisasi fitur membuat DIMM lebih masuk akal untuk berbagai radiasi.
Cimbali
1
Cimbali, yang melakukan "Patrol Scrubbing" (pada sistem dengan memori ECC) - firmware BIOS (mungkin dalam mode smm, secara transparan untuk kernel OS) atau kernel linux dalam beberapa mode perangkat lunak (modul mana yang melakukan scrubbing patroli)? Memori ECC tidak memeriksa jumlah ecc; untuk memeriksa ECC, data harus dibaca (dan skema ECC dalam memory controller akan memeriksa jumlah). Sebagian memori sering dibaca (oleh program normal pada cpu), yang lain mungkin tidak dibaca selama berminggu-minggu. Penggosokan patroli akan membaca semua memori setiap hari (intel) atau setiap 1-48 jam untuk melakukan pemeriksaan ecc - electronics.stackexchange.com/q/73546#comment911379_73573
osgx
7

Ini sebenarnya ide yang buruk. Memori tidak dapat diuji secara andal dalam sapuan cepat. Inilah sebabnya mengapa perangkat lunak seperti memtest86 menggunakan banyak lintasan dengan patters bit yang berbeda untuk menguji memori. Larutan:

  1. Tes memori dengan memtest86 , sebaiknya tes panjang, biarkan berjalan semalaman, itu akan memakan waktu lama.

  2. Jika memori buruk terdeteksi, gunakan memmap parameter kernel untuk memaksa kernel tidak menggunakan memori itu:

   memmap = nn [KMG] $ ss [KMG]
            [KNL, ACPI] Tandai memori spesifik sebagai cadangan.
            Wilayah memori yang akan digunakan, dari ss ke ss + nn.
            Contoh: Kecualikan memori dari 0x18690000-0x1869ffff
                     memmap = 64K $ 0x18690000
                     atau
                     memmap = 0x10000 $ 0x18690000

Selain itu, Anda dapat menggunakan memori ECC yang akan memperbaiki kesalahan 1-bit dan mendeteksi kesalahan 2-bit di memori Anda secara otomatis (dan Anda akan mendapatkan pesan log dari kernel tentang masalah memori yang tidak dapat diperbaiki jika terjadi)

haim
sumber
Terima kasih atas tip pada parameter kernel tersebut. Apakah Anda pikir Anda dapat mengklarifikasi mengapa ini adalah ide yang buruk dan mengapa Anda tidak dapat memeriksa sepotong memori menggunakan metode yang sama seperti memtest86 (+)? Saya sadar bahwa pengujian yang lebih andal membutuhkan lebih banyak waktu CPU (dan mungkin potongan ram yang lebih besar sekaligus) tetapi mengapa ini harus menjadi penghenti acara? Waktu CPU mungkin tidak menjadi masalah jika tersebar dalam periode yang cukup lama dan selain itu multi cpu menjadi lebih dan lebih utama.
Waxhead
Yah secara teknis, jika dilakukan dalam jangka waktu yang cukup lama, ini mungkin dilakukan. Tetapi hambatannya di sini bukanlah CPU, tetapi bus memori, dan tentu saja Anda "meracuni" cache memori CPU Anda. Saya tidak menyadari modul kernel seperti itu, dan gagasan itu terlihat sangat rapuh bagi saya (mengatur penulisan pola berulang-ulang ke wilayah memori acak pada sistem live, dll.)
haimg
haimg: pertanyaan: apakah VFS mengelola paging untuk memori yang dipesan ini? saya pikir itu tidak bisa karena tidak akan terlihat olehnya.
Jay D
1
@Waxhead Menggosok memori biasanya dilakukan pada level BIOS menggunakan perangkat keras. Jika diaktifkan, Anda harus menemukan opsi untuk menggosok patroli dan permintaan menggosok. Jika integritas memori penting bagi Anda, yang tentunya adalah jika Anda menggunakan memori ECC, maka kinerja yang lebih kecil yang diperoleh dengan mengaktifkan opsi ini bermanfaat.
Ian
1
Saya pikir mungkin menarik untuk menyertakan referensi ke modul kernel badram di sini. Ia menggunakan memtest86 saat Anda usulkan, tetapi alih-alih menahan kernel dari menggunakan memori buruk, ia mengalokasikannya ke kernel untuk tidak digunakan, secara efektif menjamin bahwa baik kernel maupun aplikasi Anda tidak masuk ke memori itu.
Cimbali
2

Posting dan jawaban salah paham masalah ini. Memory scrubbing dimaksudkan untuk menjaga kesalahan bit tunggal yang dapat diperbaiki agar tidak berubah menjadi kesalahan ganda yang tidak dapat diperbaiki. Scrubber hanya semua memori fisik (memaksa cache tidak melakukannya) sesekali. Jika ada kesalahan bit tunggal, mereka akan dikoreksi (dan koreksi harus menulis ulang nilai yang benar menggunakan perbandingan-dan-swap), sehingga menghapus kesalahan tersebut.

Kalau tidak, jika kesalahan kedua terjadi pada kata yang sudah memiliki satu kesalahan, seluruh kata tidak akan dapat diperbaiki dan OS harus melakukan sesuatu yang drastis.

Menggosok penting karena tanpa itu, memori yang dibaca tetapi tidak tertulis (seperti halaman kode) dapat mengakumulasi kesalahan dari waktu ke waktu.

Larry Stewart
sumber
Menurut Anda mengapa jawaban miss memahami masalah ketika telah ditandai sebagai jawabannya?
Dave
1
Terlepas dari jawaban Dave, Larry benar, jawabannya / apakah / salah paham pertanyaan. Pertanyaannya bertanya apakah linux dapat melakukan scrub memori, digunakan, seperti yang dijelaskan Larry dengan hati-hati, untuk mencegah kesalahan bit tunggal terdeteksi dan diperbaiki oleh ECC h / w dari berubah menjadi kesalahan 2 bit yang tidak dapat diperbaiki. Jawabannya berbicara tentang bagaimana mendeteksi kesalahan-kesalahan itu di tempat pertama menggunakan aplikasi perangkat lunak.
Ian
Saya pikir Anda salah paham tujuannya di sini. Anda tentu saja benar dalam deskripsi Anda tentang menggosok namun jika Anda misalnya menjalankan file server (non-kritis) pada ram non-ecc dan memiliki siklus CPU untuk cadangan itu terdengar seperti ide yang baik cepat atau lambat dapat mendeteksi korupsi memori dan tandai sebagai buruk dan tahu tentang itu daripada tidak menyadari chip memori yang buruk. Mungkin kata-kata yang lebih baik adalah validasi / verifikasi memori. Mungkin tidak secara teknis menggosok, tetapi masih cara yang layak untuk mengurangi kerusakan yang disebabkan oleh memori yang berpotensi buruk.
Waxhead
1

Jika Anda memiliki memori ECC, Anda mungkin ingin melihat lebih dekat di https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-edac . (Saya menemukan "sdram_scrub_rate" sangat menarik.)

(Jika tautan ini rusak pada beberapa titik (sebenarnya tidak seharusnya) saya sarankan mengunduh dokumentasi Linux yang sesuai dan mencari "scrub".)

Kai
sumber