Linux hafızayı temizleyebilir mi?


10

Linux'un hafızayı "temizlemek" için bir mekanizması var mı? örneğin, sistemin bozuk ram çipleri takılıyken bile "güvenli" şekilde çalışmaya devam edebilmesi için hafızayı test etmek ve başarısız olduklarında alanları kirli olarak işaretlemek ?!

Yanıtlar:


2

Yanıt evettir ve şeffaf bir şekilde yapılır (hataları algılamak için ECC belleğiniz varsa ve çekirdek sürümünüz güvenli bir şekilde çalışmaya devam etmek için en az 2.6.30'dur).

Temel olarak, belleğiniz işlemciden her okumada kontrol edilir ve Hata Düzeltme Kodları (ECC) ile tutarlılığı kontrol etmek için periyodik olarak * temizlenir. Bir hata meydana geldiğinde, daha sonra mcelog ( http://www.mcelog.org/ ) tarafından kaydedilip tutulan bir Makine Kontrolü İstisnası alırsınız .

Hatanız düzeltilebilirse, "sızdıran kova" sayacını arttırır, bu da çok sık başarısız olan fiziksel bir DIMM'nin şeffaf bir şekilde başka bir tanesiyle değiştirilmesine neden olur. Böylece bellek sayfanız yeni bir konuma kopyalanır, sanal bellek adresiniz yeni sayfayı gösterecek şekilde güncellenir ve eski sayfa artık OS tarafından artık kullanılmayacak şekilde işaretlenir.

Buna Linux'ta "yumuşak çizgi" denir (ve Solaris'te bellek sayfası emekliliği, diğer işletim sistemlerini bilmiyorum).

Ancak hatanız düzeltilemediyse, "sabit hat" olarak adlandırılan şey gerçekleşir, yani bellek sayfanız normal işletim sistemi bellek yönetiminden kaldırılır ve uygulamanız öldürülür (NB: size nerede olduğunu söyleyen bazı catchable SIGBUS sinyali ile) hata oldu, ancak umursamaya ve yakalamaya çalışamayacak kadar nadir). Bellek sayfanız bir dosyadan eşlenir ve temizlenirse, işletim sistemi de işlemi öldürmek yerine sayfayı başka bir fiziksel konuma yeniden yükleyebilir.

Mcelog hakkında daha fazla bilgi edinebilir, birçok yapılandırma seçeneği vardır, tetiklenecek başka davranışlar, seçenekler ve mcelog'un sisteminizde çalıştığından nasıl emin olacağınıza dair seçenekler ve diğer ipuçlarını alabilirsiniz.


* Fýrçalama veya "Devriye Fýrçalama", hafýza okuma, hatalar için ECC'ye karţý kontrol etme ve bir hata bulunduðunda düzeltilmiþ hafýza kelimelerle üzerine yazmayý içerir. Devriye ovma terimi, bazen "Talep Ovma" olarak adlandırılan bellek okumalarındaki hatalar üzerine yanlış verilerin üzerine yazılmasına karşıdır. Ovma, genellikle BIOS üzerinden etkinleştirilebilen bir donanım prosedürüdür.


1
Bu yalnızca daha pahalı ECC belleğiniz varsa geçerlidir.
psusi

Bu, ECC'li tüm anılar için geçerlidir. Eşlik olsun (ama o zaman düzeltemezsiniz), SECDED, daha pahalı Chipkill veya daha yeni olanlar. DDR1 zaten ECC uygulayabilir, ancak hepsi kullandığınız gerçek modele bağlıdır. "Ev" pazarının geleneksel olarak daha az esnekliğe ihtiyacı vardır, ancak süper bilgisayarlar 20 yıldan uzun bir süredir onlarla donatılmıştır - sunucular arasındadır.
Cimbali

1
ECC hafızasının (ECC olmayanlardan) daha pahalı olduğunu ve bu yüzden çoğu insanın sahip olmadığını söyledim.
psusi

1
"Çoğu insan" oldukça belirsizdir. Dediğim gibi yatırımın ve gücün bedelini ödemenin yaygın olup olmadığı pazara bağlıdır. Şu anda 2 yaşında olan ortalama Dell dizüstü bilgisayarımla donatılmış (standart, özel seçenek istenmiyor). Gittikçe yaygınlaşıyor, çünkü özelliklerin minyatürleştirilmesi DIMM'leri çeşitli radyasyonlara karşı daha duyarlı hale getiriyor.
Cimbali

1
"Devriye Ovma" (ECC belleğe sahip sistemlerde) - bios ürün yazılımı (muhtemelen smm modunda, işletim sistemi çekirdeği için şeffaf olarak) veya linux çekirdeğini kim yapar? ECC belleği ecc toplamlarını kontrol etmedi; ecc'yi kontrol etmek için veriler okunmalıdır (ve bellek denetleyicisindeki ecc şeması toplamı kontrol edecektir). Bazı bellekler sık ​​sık okunur (cpu üzerindeki normal programlar tarafından), diğeri haftalarca okunamayabilir. Devriye ovma, ecc kontrolünü yapmak için her gün (intel) veya her 1-48 saatte bir tüm belleği okuyacaktır - electronics.stackexchange.com/q/73546#comment911379_73573
osgx

7

Bu aslında kötü bir fikir. Bellek hızlı bir taramada güvenilir bir şekilde test edilemez. Bu nedenle memtest86 gibi yazılımlar, belleği test etmek için farklı bit desenleri ile birden fazla geçiş kullanır. Çözüm:

  1. Memtest86 ile hafızayı test edin , tercihen uzun test edin, bir gece çalışmasını bekleyin , uzun zaman alacaktır.

  2. Bozuk bellek algılanırsa, memmap çekirdeği bu belleği kullanmaya zorlamak için çekirdek parametresini kullanın:

   memmap = nn [KMG] $ ss [KMG]
            [KNL, ACPI] Belirli bir belleği ayrılmış olarak işaretleyin.
            Kullanılacak bellek bölgesi, ss'den ss + nn'ye.
            Örnek: Belleği 0x18690000-0x1869ffff'den hariç tutma
                     memmap = 64K $ 0x18690000
                     veya
                     memmap = 0x10000 $ 0x18690000

Buna ek olarak, 1 bit hataları düzeltecek ve belleğinizdeki 2 bit hataları otomatik olarak algılayacak ECC belleği kullanabilirsiniz (ve eğer meydana gelirse düzeltilemez bellek sorunları hakkında çekirdekten günlük mesajları alırsınız)


Çekirdek parametrelerindeki ipucu için teşekkürler. Bunun neden böyle kötü bir fikir olduğunu ve memtest86 (+) ile aynı yöntemleri kullanarak neden bir bellek bölümünü kontrol edemediğinizi açıklayabileceğinizi düşünüyor musunuz? Daha güvenilir testlerin daha fazla CPU zamanı gerektirdiğinin farkındayım (ve muhtemelen bir seferde daha büyük koç parçaları), ancak bu neden bir şov tıpası olmalı? CPU süresi yeterince uzun bir süreye yayılırsa ve çoklu cpu'nun yanı sıra daha yaygın hale geliyorsa sorun olmayabilir.
Waxhead

Teknik olarak, yeterince uzun bir süre yapılırsa, bu mümkün olabilir. Ancak buradaki darboğaz CPU (lar) değil, bellek veri yolu ve tabii ki CPU'nuzun bellek önbelleğini "zehirliyor". Böyle bir çekirdek modülünün farkında
olmazdım

haimg: soru: VFS bu ayrılmış bellek için disk belleği yönetecek mi? Bence görünür olmayacak gibi olamaz.
Jay D

1
@Waxhead Bellek fırçalama genellikle donanım kullanılarak BIOS düzeyinde yapılır. Etkinleştirilirse devriye fırçalama ve talep fırçalama seçeneklerini bulmalısınız. Bellek bütünlüğü sizin için önemliyse, ki bu kesinlikle ECC bellek kullanıyorsanız, bu seçenekleri etkinleştirerek elde edilen ufacık performans vuruşuna değer.
Ian

1
Buradaki badram çekirdek modülüne bir referans eklemek ilginç olabilir . Önerdiğiniz gibi memtest86 kullanır, ancak çekirdeği kötü bellek kullanmaktan kaçınmak yerine, çekirdeğe kullanmamak için tahsis eder, ne çekirdeğin ne de uygulamalarınızın bu belleğe girmemesini etkili bir şekilde garanti eder.
Cimbali

2

Gönderi ve cevap sorunu yanlış anlıyor. Bellek fırçalama, düzeltilebilir tek bit hatalarının düzeltilemez çift hatalara dönüşmesini önlemek içindir. Yıkayıcı yalnızca tüm fiziksel belleği (önbelleği zorlamayı kaçırır) zaman zaman. Herhangi bir tek bit hatası varsa, bunlar düzeltilecektir (ve düzeltme bir karşılaştırma ve takas kullanarak doğru değeri yeniden yazmalıdır), böylece hatayı temizler.

Aksi takdirde, zaten bir hata içeren bir sözcükte ikinci bir hata oluşursa, tüm sözcük düzeltilemez ve işletim sisteminin sert bir şey yapması gerekir.

Fırçalama önemlidir, çünkü onsuz okunan ancak yazılmayan bellek (kod sayfaları gibi) zaman içinde hatalar biriktirebilir.


Sizce cevap özledim, cevap olarak işaretlendiğinde sorunu anladı mı?
Dave

1
Dave'in cevabına rağmen, Larry oldukça doğru, soruyu cevaplıyor / yanlış anlıyor. Soru linux'un Larry'nin dikkatle açıkladığı gibi kullanılan bir bellek ovma yapıp yapamayacağını soruyor ve ECC h / w tarafından algılanan ve düzeltilen tek bit hatalarının düzeltilemez 2 bit hatalara dönüşmesini önlemek için. Cevap, bir yazılım uygulaması kullanarak bu hataların ilk olarak nasıl tespit edileceğinden bahsediyor.
Ian

Sanırım burada amacı yanlış anlıyorsun. Elbette fırçalama hakkındaki açıklamanızda haklısınız, ancak örneğin ecc olmayan koç üzerinde (kritik olmayan) bir dosya sunucusu çalıştırırsanız ve yedeklemek için CPU döngüleri varsa, er ya da geç bozuk olanı tespit etmek için iyi bir fikir gibi geliyor bellek ve kötü olarak işaretleyin ve kötü bir bellek yongası farkında olmaktan daha iyi biliyorum. Belki de daha iyi bir ifade bellek doğrulaması / doğrulaması olabilir. Belki teknik olarak ovmak değil, ama yine de potansiyel olarak kötü hafızadan kaynaklanan hasarı azaltmanın geçerli bir yolu.
Waxhead

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.