Starfive VisonFive2(RISC-V SBC) で遊ぶ – その7 NVMeエラー対策のメモ1

RISC-V, VisionFive-2

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 → 書き込めなくて死ぬ、ということらしい。

[code lang="shell"]
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
[/code]

原因その1

私が使っている M.2 SSDは、Western DigitalのWD Blue SN570 500GB WDS500G3B0C)である。このSSDは、長時間使われないと節電のためにdeep sleepする。sleepから復活できずに、エラーとなるらしい。


解決案その1

デフォルトでは、APSTE(Autonomous Power State Transition)が有効になっているので、これを無効にする。現在の設定は、以下のコマンドで確認できる。

[code lang="shell"]
$ 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
[/code]


SSDのAPSTEを無効にするために、Linux起動時にカーネルパラメーター ’nvme_core.default_ps_max_latency_us=0’ を渡す。VisionFive2ではextlinux.confのAPPEND行に追加する。

[code lang="text"]
## /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
[/code]


設定完了後に再起動。変更されたか、設定を確認。

[code lang="js"]
$ 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
[/code]


extlinux.conf を書き換えずに、一時的に確認したい場合は、 /sys/module/nvme_core/parameters/default_ps_max_latency_us を0にする。

[code lang="shell"]
$ 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
[/code]

設定後の問題

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 という記事もいくつか見かけるので、こちらもそのうち試してみたい。


続く

参考記事へのリンク

RISC-V, VisionFive-2

Posted by ず@沖縄