ビット反転の原因はいくつもありますが、宇宙線もそのひとつです

Firefoxクラッシュ、原因は宇宙線? 約47万件の報告分析、最大15%がメモリのビット反転現象の可能性

Munenori Taniguchi

Image:Mozilla

Mozillaの技術者ガブリエレ・スヴェルト氏は、Firefoxで発生したクラッシュのうち、最大で15%が「ビット反転」と呼ばれる現象に起因している可能性があるとSNSで報告した。

Mozillaの技術者チームは先週、約47万件にものぼるFirefoxのクラッシュレポートを受け取った。それはMozillaへの情報送信を許可したユーザーのマシン上で実際に発生したクラッシュに関する情報だが、チームが分析したところ、全体約15%が、ビット反転と呼ばれる現象に起因する可能性があったのだという。

ビット反転とは、メモリセル(RAM、キャッシュなど)の値が、意図しない外部入力によって0から1へ、あるいはその逆になってしまう現象のこと。ソフトウェアに関係なく、突然メモリセル上の一部で、 “0” だったデータが “1” に、または “1” だったデータが “0” に変わってしまうため、ビット反転が発生すると大抵の場合、コンピューターはクラッシュしてしまう。

この現象が発生する原因のひとつには、宇宙線がある。宇宙線とは、宇宙空間から飛来する高エネルギー放射線のことだ。宇宙線は通常、地球の磁場によって減衰し、影響ある強さで地上に届くことはほとんどない。しかし、太陽フレアなどによって強力な宇宙線が発生したりすると、それが地球上に到達してデジタル時計などを狂わせたり、コンピューターソフトウェアをクラッシュさせたりする。

技術者らが調べた当初、このビット反転の確率は10%と見積もられていた。だが、そこからさらにメモリ不足によるリソース枯渇など、別の原因の可能性を削っていくと、ビット反転で起こったクラッシュの確率は約15%にまで増加したのだという。また、クラッシュ後にメモリテスターを実行したユーザーからの情報を分析したところ、ビット反転が原因と考えられるクラッシュの半分は、ハードウェアの問題だった。スヴェルト氏は、この数字は自分が見てきたこの問題に関するどの推定値よりも高いと述べた。

Image:Gabriele Svelto/Mastodon

ただ、地上における民生品のコンピューターシステムやデバイスがビット反転でクラッシュするのは、だいたい年に1回程度と考えられている。それに比べると、Firefoxのクラッシュの原因のうち最大15%がビット反転というのは非常に大きい数字であるように思える。

スヴェルト氏の投稿に対し、Hacker Newsのコメントユーザーらからは、ビット反転がメモリを破損させるなら、クラッシュ検知コード自体も破損してしまい、誤検知を引き起こす可能性もあるのではないかなど、様々な疑問の声があがった。

こうした疑問がわくのは当然のことだ。スヴェルト氏らの推定は、クラッシュのパターンに基づいた推論であり、直接的な証拠ではないからだ。ただ、もっと広い視点で見れば、クラッシュの一定割合はソフトウェアのバグではなくハードウェアの故障である、という点は変わらない。

ビット反転現象は、コンピューターシステムの電源電圧の不安定さや、過熱による不安定動作、メモリなどの製造上の欠陥や経年劣化、クロストークといった要因からも引き起こされることがある。そして、どの原因が最もビット反転を引き起こしやすいかはわかっていない。つまり、Firefox のクラッシュから、偶然そこを通過した宇宙線によって引き起こされた回数という、おそらく最も興味深い統計値を掘り下げて調べるのはほとんど無理だ。

スヴェルト氏がFirefoxのクラッシュに関してビット反転の可能性が高いと持ち出したのは、要するに同ブラウザーがクラッシュする原因には、ソフトウェアのバグだけではなく、ハードウェアが持つ欠陥であるということだという。

そしてスヴェルト氏は、主にコンピューターとスマートフォンに関してこの問題を取り上げたが、「あの高級なARMベースのMacBookでも、クラッシュは何度も発生している」、これはあらゆるデジタルデバイスに当てはまる問題だと述べた。

ビット反転によるクラッシュを発生しにくくするには、コンピューターシステムにECC(誤り訂正符号)メモリを使用する方法が挙げられる。ECCメモリでは追加のチップがパリティビットを保存し、ECCコントローラがデータの読み取りごとに整合性をチェックするため、シングルビットエラーは透過的に修正され、マルチビットエラーは検出・報告されるため、原因不明のエラーになりにくい。

ただし、ECCメモリはサーバーなど高額なシステムでしか対応していないことが多い。これはインテルがECCのサポートをサーバー向けCPUのXeonシリーズなどに限定しており、Coreシリーズなど個人向けのシステムでは使えない設計になっているからだ(AMDのRyzenシリーズの一部は、特定のマザーボードとの組み合わせでECCメモリをサポートしている)。

Linuxカーネルの開発者リーナス・トーバルズ氏は2021年に、インテルがサーバー向けCPUから大きな利ざやを得るために人為的な制限を設けたと主張し、「不適切な市場細分化によってECC業界全体を潰している」と非難していた。

開発者目線でこの問題を見れば、手がけるソフトウェアにクラッシュ報告が寄せられたとしても、そこにビット反転の兆候があれば、すべてがコードのせいでない可能性があるということだ。

特定の手順でクラッシュが100%再現できるならそれはバグだが、ランダムで再現性がなく、毎回異なるコードパスで発生する場合は、それは宇宙線や熱、電源電圧の問題などにハードウェアが狂わされた可能性がある。

そんな場合は、いきなりコードを書き換えようとする前に、MemTest86+アプリなどでメモリ状態を確認する方が原因を特定しやすいかもしれない。

関連キーワード: