⚠️

amdgpu がフリーズしたときのリモートシャットダウン

2024/09/30に公開

tl;dr

  • amdgpuなどの特定のドライバがフリーズしてシャットダウンが終わらない
    • 但し、ssh等でアクセスができる状況
      • シャットダウン処理をする前段階で実行する必要がある
  • 以下のとおり動作するバッチを書いて、実行可能な状態で保存する
    • /proc/sys/kernel/sysrq1を書きこむ
    • /proc/sysrq-triggeroを書きこむ

概要

本記事では、amdgpuがフリーズ(熱暴走, 電圧降下)したとき、マシンの強制シャットダウン方法について解説します。

以下は弊環境(openSUSE, Radeon Vega56)でのフリーズ時のログ(journalctl -r)の抜粋です。

--- 以上同様のログ
930 09:00:50 rlySUSEpc kernel: [drm:amdgpu_job_timedout [amdgpu]] *ERROR* ring page0 timeout, signaled seq=248225>
930 09:00:40 rlySUSEpc kernel: [drm:amdgpu_job_timedout [amdgpu]] *ERROR* GPU Recovery Failed: -19
--- 以下同様のログ

見てわかるとおり、タイムアウトを繰り返しており、画面には何も表示されていない状態です。

  • ついでに言うとファンが掃除機みたいな音量で回転しています(ええ)

方法

通常のシャットダウン

日常的にLinuxを使用しているユーザであれば、sshで接続したマシンでsudo shutdown nowなどを使用してシャットダウンしていると思います。

ですが、amdgpu等、特定のドライバがフリーズしていたり、いろいろな理由でシャットダウンが一生終わらない場合があります。

  • sudo shutdown -f now のように、-fオプションを利用しても同様にシャットダウンできない場合があります。

強制的なシャットダウン

強制的にシャットダウンをする方法として今回紹介するのが、Magic SysRq Keyをエミュレートする方法です。

  • もしフリーズして、あなたが画面の前にいるのであれば、SysRq + Alt + oキーを押下すればなんとかなるでしょう。
  • ですが、リモート環境でGPUをゴリゴリやっていて、どうしようもなくなったときは、コンピュータの前まで車を走らせる必要があります。

バッチを書く

  1. 以下のとおり動作するバッチを書いて、実行可能な状態で保存しておく
    • /proc/sys/kernel/sysrq1を書きこむ
    • /proc/sysrq-triggeroを書きこむ
#!/bin/bash
echo 1 | sudo tee /proc/sys/kernel/sysrq # SysRqキーを有効化する
echo o | sudo tee /proc/sysrq-trigger # SysRq + Alt + o (強制シャットダウン) と同じ動作をする

実行権限を付与する

$ chmod +x ./sysrq.sh
  1. (実際にフリーズしたとき)、通常のシャットダウンをする前に先程のバッチを実行する
$ ./sysrq.sh
  1. (任意)wake-on-lanで再起動する
  • 弊環境では、SysRq シャットダウンをした後でもwake-on-lanでの起動はできました。
    • 環境によってできない場合もあるかもしれないので気をつけてください。

Discussion