Starfive VisonFive2(RISC-V SBC) で遊ぶ – その7 NVMeエラー対策のメモ1
VisionFive2を使っていて、NVMe SSDに起因する問題に悩まされている。これは、いまだに完全には解決できていない問題だ。ここまでの試行錯誤の記録をメモしておくので、読者の参考になれば幸いである。
さて、私のVisionFive2には、M.2 SSD(WD Blue SN570 500GB WDS500G3B0C)を刺している。そのSSDはrootやhomeとして使っている(cf. rootをM.2 SSDにする | ず@沖縄)。
このSSDはmicroSD(TF)に比べて高速であり満足している。しかし電源を入れたまま使っていると、私が利用していない時間帯にハングアップしていた。平均的な稼働時間(uptime)は1日に満たない状態であった。
/var/log/syslog を見ると、nvmeでタイムアウトが発生している。これがハングアップ原因のようだ。NVMe timeout → root fsをread-onlyでremount → 書き込めなくて死ぬ、ということらしい。
Jan 14 11:49:28 starfive kernel: [ 679.338722] nvme nvme0: I/O 853 QID 4 timeout, completion polled Jan 14 11:49:59 starfive kernel: [ 710.022887] nvme nvme0: I/O 556 QID 3 timeout, completion polled
原因その1
私が使っている M.2 SSDは、Western DigitalのWD Blue SN570 500GB WDS500G3B0C)である。このSSDは、長時間使われないと節電のためにdeep sleepする。sleepから復活できずに、エラーとなるらしい。
- Linux support for WD Black NVME 2018 – WD SSD Products / WD SSD Drives & Software – WD Community
- APST サポートの問題によるコントローラの機能不全 – ソリッドステートドライブ/NVMe – ArchWiki
- Fedora 25以降のRedHat系Linuxで、NVMe搭載PCでインストーラがフリーズする場合
解決案その1
デフォルトでは、APSTE(Autonomous Power State Transition)が有効になっているので、これを無効にする。現在の設定は、以下のコマンドで確認できる。
$ sudo nvme get-feature /dev/nvme0 -f 0x0c -H get-feature:0x0c (Autonomous Power State Transition), Current value:0x00000001 Autonomous Power State Transition Enable (APSTE): Enabled $ sudo cat /sys/module/nvme_core/parameters/default_ps_max_latency_us 100000
SSDのAPSTEを無効にするために、Linux起動時にカーネルパラメーター ’nvme_core.default_ps_max_latency_us=0’ を渡す。VisionFive2ではextlinux.confのAPPEND行に追加する。
## /boot/extlinux/extlinux.conf ## ## IMPORTANT WARNING ## ## The configuration of this file is generated automatically. ## Do not edit this file manually, use: u-boot-update default l0 menu title U-Boot menu prompt 0 timeout 50 label l0 menu label Debian GNU/Linux bookworm/sid 5.15.0-starfive linux /boot/vmlinuz-5.15.0-starfive initrd /boot/initrd.img-5.15.0-starfive fdtdir /boot/dtbs/ append root=/dev/nvme0n1p3 rw console=tty0 console=ttyS0,115200 earlycon rootwait stmmaceth=chain_mode:1 selinux=0 nvme_core.default_ps_max_latency_us=0
設定完了後に再起動。変更されたか、設定を確認。
$ sudo nvme get-feature /dev/nvme0 -f 0x0c -H get-feature:0x0c (Autonomous Power State Transition), Current value:00000000 Autonomous Power State Transition Enable (APSTE): Disabled $ sudo cat /sys/module/nvme_core/parameters/default_ps_max_latency_us 0 $ cat /proc/cmdline root=/dev/nvme0n1p3 rw console=tty0 console=ttyS0,115200 earlycon rootwait stmmaceth=chain_mode:1 selinux=0 nvme_core.default_ps_max_latency_us=0
extlinux.conf を書き換えずに、一時的に確認したい場合は、 /sys/module/nvme_core/parameters/default_ps_max_latency_us を0にする。
$ echo 0 | sudo tee /sys/module/nvme_core/parameters/default_ps_max_latency_us 0 $ sudo cat /sys/module/nvme_core/parameters/default_ps_max_latency_us 0
設定後の問題
default_ps_max_latency_us=0 にすることで、NVMe timeoutは無くなった。これにより、ハングアップは発生しなくなった。
しかし、今度は「ほったらかしているとrebootする」現象が発生していて頭を抱えている。NVMeが原因なのか、他に問題があるのか調査中。ログには特に記録が残っておらず、いきなりrebootしているようだ。
同じく NVMe I/O問題について、rvspaceに 「NVMe I/O timeouts」が本日投稿されていた。default_ps_max_latency_us=0 は共通だが、それ以外のパラメータも変更している。これも試してみます。
default_ps_max_latency_us=0 ではなくて、=5500 という記事もいくつか見かけるので、こちらもそのうち試してみたい。
続く
ディスカッション
コメント一覧
まだ、コメントがありません