Linuxはメモリをスクラブできますか?


10

Linuxにはメモリを「スクラブ」するメカニズムがありますか?たとえば、メモリをテストし、不良領域がダーティであるとマークして、不良RAMチップがインストールされていてもシステムが「安全に」動作し続けることができるようにしますか?

回答:


2

答えは「はい」であり、透過的に行われます(エラーを検出するためのECCメモリがあり、カーネルのバージョンが安全に動作し続けるために少なくとも2.6.30である場合)。

基本的に、メモリはプロセッサからの読み取りごとにチェックされ、定期的にスクラブされて*、エラー修正コード(ECC)との整合性がチェックされます。エラーが発生した場合、マシンチェック例外が発生します。この例外は、ログに記録され、mcelog(http://www.mcelog.org/)によって取得されます。

エラーが修正可能である場合、「リークの多いバケット」カウンターが増加します。これにより、頻繁に失敗する物理DIMMが透過的に別のDIMMに交換されます。したがって、メモリページが新しい場所にコピーされ、仮想メモリアドレスが新しいページを指すように更新され、古いページはOSによって使用されないようにマークされます。

これはLinuxでは「ソフトオフライン」と呼ばれます(Solarisではメモリページのリタイア、他のOSについては知りません)。

ただし、エラーを修正できなかった場合は、いわゆる「ハードオフライン」が発生します。つまり、メモリページが通常のオペレーティングシステムのメモリ管理から削除され、アプリケーションが強制終了されます(注意:どこかを知らせるキャッチ可能なSIGBUS信号によって)エラーが発生しましたが、気にせずにキャッチしようとすることはまれです)。メモリページがファイルからマップされてクリーンな場合、OSはプロセスを強制終了する代わりに、別の物理的な場所に透過的に再ロードすることもできます。

mcelogで詳細を読むことができます。多くの構成オプションがあり、他の動作をトリガーしたり、オプションを読んだり、システムでmcelogが実行されていることを確認したりするためのその他のリードを得ることができます。


*スクラビング、つまり「パトロールスクラビング」は、メモリを読み取り、ECCでエラーをチェックし、エラーが発見されたときに訂正されたメモリワードで上書きすることで構成されます。パトロールスクラビングという用語は、メモリリードのエラーで誤ったデータを上書きすることに反対して使用されます。これは、「デマンドスクラビング」と呼ばれることもあります。スクラブは、通常BIOSを介して有効にできるハードウェア手順です。


1
これは、より高価なECCメモリがある場合にのみ適用されます。
psusi 14

これは、ECCを備えたすべてのメモリに適用されます。同等(ただし、修正できない)、SECDED、より高価なチップキル、またはより新しいチップキルであること。DDR1はすでにECCを実装できますが、使用する実際のモデルによって異なります。「ホーム」市場では従来、回復力の必要性は少なくなっていますが、スーパーコンピュータには20年以上前から回復力が備わっています。
Cimbali 2014

1
つまり、ECCメモリは(非ECCよりも)高価であるため、ほとんどの人はそれを持っていません。
psusi 14

1
まあ「ほとんどの人」はかなり曖昧です。投資と電力の代償を払うのが一般的であるかどうかは、私が言ったように、市場に依存します。私の平均的なDellラップトップは、現在2年前のものですが、標準で搭載されています(標準、特別なオプションは要求されません)。機能の小型化によりDIMMがさまざまな放射線に敏感になるため、ますます一般的になっています。
Cimbali 2014

1
「Patrol Scrubbing」(ECCメモリを搭載したシステム)を実行するCimbali-BIOSファームウェア(おそらくsmmモード、OSカーネルでは透過的に)または一部のソフトウェアモードのLinuxカーネル(パトロールスクラブを実行するモジュール)?ECCメモリはecc合計をチェックしませんでした。eccをチェックするには、データを読み取る必要があります(メモリコントローラーのeccスキームが合計をチェックします)。一部のメモリは(CPU上の通常のプログラムによって)頻繁に読み取られ、別のメモリは数週間読み取られない場合があります。パトロールスクラブは、ECCチェックを行うために毎日(インテル)、またはすべての1-48時間のすべてのメモリを読み込みます- 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

さらに、1ビットエラーを修正し、メモリ内の2ビットエラーを自動的に検出するECCメモリを使用できます(修正できないメモリの問題が発生すると、カーネルからログメッセージが表示されます)


これらのカーネルパラメータに関するヒントをありがとう。これがなぜそんなに悪い考えなのか、なぜmemtest86(+)と同じメソッドを使用してメモリのチャンクをチェックできないのかを明確にできると思いますか?より信頼性の高いテストにはより多くのCPU時間(そしておそらく、RAMのより大きなチャンクも一度に)が必要であることは承知していますが、なぜこれがショーストッパーになる必要があるのでしょうか。CPU時間は、十分に長い期間にわたって分散し、マルチCPUに加えてますます主流になっている場合には問題にならない可能性があります。
ワックスヘッド

技術的には、十分に長い時間をかけて行うと、これが可能になる場合があります。ただし、ここでのボトルネックはCPUではなく、メモリバスであり、もちろん、CPUのメモリキャッシュを「汚染」します。私はそのようなカーネルモジュールを認識していません。その考えは私にとって非常に壊れやすいように見えます(ライブシステム上のメモリの任意の領域への繰り返しパターン書き込みを
調整する

haimg:質問:VFSはこの予約メモリのページングを管理しますか?見えないので出来ないと思います。
ジェイD

1
@Waxheadメモリスクラブは通常、ハードウェアを使用してBIOSレベルで行われます。有効にすると、巡回スクラブとデマンドスクラブのオプションが表示されます。メモリの整合性が重要である場合、つまり、ECCメモリを使用している場合は、これらのオプションを有効にすることで得られる小さなパフォーマンスヒットに価値があります。
Ian

1
ここにbadramカーネルモジュールへの参照を含めるのは興味深いと思います。提案どおりにmemtest86を使用しますが、カーネルが不良メモリを使用しないようにする代わりに、カーネルを使用しないように割り当て、カーネルもアプリケーションもそのメモリで実行されないことを効果的に保証します。
Cimbali

2

投稿と回答は問題を誤解しています。メモリスクラビングは、訂正可能なシングルビットエラーが訂正不可能なダブルエラーになるのを防ぐことを目的としています。スクラバーは単にすべての物理メモリ(キャッシュミスを強制的に実行させる)を時々します。シングルビットエラーがある場合、それらは訂正され(そして、訂正は比較とスワップを使用して正しい値を書き換える必要があります)、エラーをクリアします。

それ以外の場合、すでに1つのエラーがある単語で2番目のエラーが発生すると、単語全体が修正不能になり、OSが大幅な処理を行う必要があります。

スクラブは重要です。スクラブを行わないと、読み取りは行われるが書き込まれない(コードページのような)メモリが時間の経過とともにエラーを蓄積する可能性があるためです。


回答としてマークされているのに、回答ミスが問題を理解したと思うのはなぜですか?
Dave

1
デイブの返答にもかかわらず、ラリーは正解です。答えは/ does /質問を誤解しています。ラリーが慎重に説明しているように、ECC h / wによって検出および訂正されたシングルビットエラーが訂正不可能な2ビットエラーになるのを防ぐために、Linuxがメモリスクラブを実行できるかどうかという質問です。答えは、最初にソフトウェアアプリケーションを使用してこれらのエラーを検出する方法について説明します。
Ian

ここで目的を誤解していると思います。もちろん、スクラブについての説明は正しいですが、たとえば(非クリティカル)ファイルサーバーを非ecc ramで実行していて、CPUサイクルを節約できる場合は、遅かれ早かれ破損を検出できるようにするとよいでしょうメモリを不良としてフラグを立て、不良のメモリチップに気付かないよりもそのことを認識します。おそらく、より良い言い回しは、メモリの検証/検証でしょう。技術的なスクラブではないかもしれませんが、潜在的に不良なメモリによるダメージを減らすための実行可能な方法です。
Waxhead 2014

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.