要約
ubuntu 22.04でGUIログインしたら,「システムプログラムの問題が見つかりました」が表示されるようになった.
ログを眺めると,gnomeのプロセスがシグナル11でkillされていた.
gnomeを入れなおしても同様にシグナル11でkillされるので,メモリ故障を疑い,memtest86を実行した.
すると,特定のメモリだけErrorを吐くことが分かった.
本題
環境
CPU : AMD Ryzen Threadripper
RAM : Corsair Memory 16GB x4 (合計 64GB)
GPU : GeForce RTX 4090
OS : Ubuntu 22.04
主用途は深層学習の実行である.
状況
遠隔ログインでサーバを使おうと毎朝ログインを試みても使えないという苦情があった.
また,Gnomeのログイン画面でも,マウスカーソルは動くがクリックが効かず,キーボードの反応もないという状態であった.
サーバを強制終了しもう一度起動すると,動作が重いもののGnomeのログイン画面からログインでき,webブラウザやterminalを使うことができた.
ログインに成功すると,「システムプログラムの問題が見つかりました」が表示され,詳細を確認するとgnomeのプロセスがシグナル11でkillされていることが分かった.
対応1
gnomeのプログラムが何かの影響で破損してしまったのではないかと考え,gnomeを入れなおすことにした.
$ sudo apt install ubuntu-desktop --reinstall
しかし,状況は改善せず,gnomeのプロセスがシグナル11でkillされていることが分かった.
対応2
linuxがシグナル11でkillするときは,不正なメモリ参照をしたときである.
gnomeが不正なメモリ参照をするようなプログラムだとは考えにくいので,メモリが破損して,おかしいメモリ参照をしているのではないかと疑った.
メモリチェックツールとして有名なmemtest86を走らせることにした.
memtest86は以下の手順で導入した.
$ wget https://www.memtest86.com/downloads/memtest86-usb.zip
$ unzip memtest86-usb.zip
$ /sbin/gdisk -l memtest86-usb.img
[省略]
Number Start (sector) End (sector) Size Code Name
1 2048 524287 255.0 MiB 0700 MemTest86
2 524288 1048575 256.0 MiB EF00 EFI System Partition
3 1048576 2097118 512.0 MiB 0700 DMA Test Partition
## 重要なのは EFI System PartitionのStart sector
$ sudo mkdir -p /mnt
$ sudo mount -o loop,offset=$(({EFI System PartitionのStart sector}*512)) memtest86-usb.img /mnt/ ##今回はoffset=$((524288*512))
$ cd /mnt
$ sudo mkdir /boot/efi/EFI/memtest
$ sudo cp -r EFI/BOOT/* /boot/efi/EFI/memtest
$ df -h | grep efi
/dev/nvme0n1p1 93M 5.2M 88M 6% /boot/efi
## 重要なのは 左側のfilesystem
$ efibootmgr -v
BootCurrent: 0001
Timeout: 1 seconds
BootOrder: 0001,0002,0003,0004
Boot0001* ubuntu HD(1,GPT,833852b7-45e0-42d9-8e19-5dbf6e9c2b7d,0x800,0x2f000)/File(\EFI\ubuntu\shimx64.efi)
Boot0002* UEFI:CD/DVD Drive BBS(129,,0x0)
Boot0003* UEFI:Removable Device BBS(130,,0x0)
Boot0004* UEFI:Network Device BBS(131,,0x0)
## 重要なのはBootCurrentで指定されている値(今回は0001)と,そのBoot0001のHD(1,...)にある始めの数字(今回は1)である
$ sudo efibootmgr -c --disk {/boot/efiのある左側のfilesystem} --part {Boot000xのHDの始めの値} --loader /EFI/memtest/BOOTX64.efi --label "memtest"
## 具体例は以下のようになる
$ sudo efibootmgr -c --disk /dev/nvme0n1p1 --part 1 --loader /EFI/memtest/BOOTX64.efi --label "memtest"
## ここはBoot000xの順番を見て,memtestが前から2番目になるようにする
$ sudo efibootmgr -o 1,5,2,3,4
以下のコマンドを打つと,再起動時にmemtestが起動するようになる.
$ sudo efibootmgr -n 2
このようにして導入したmemtest86を実行すると,Errorが頻繁に起こることを確認した.
メモリを一枚ずつ差し,一つ一つ確認すると,Errorが頻繁に起こるメモリが1枚のみあった.
これより,メモリが破損していることが確認された.
参考にしたサイト
https://pyopyopyo.hatenablog.com/entry/20160528/p1
https://qiita.com/foursue/items/8548c4402c0651ba5aaa