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 → 書き込めなくて死ぬ、ということらしい。
[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から復活できずに、エラーとなるらしい。
- 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)が有効になっているので、これを無効にする。現在の設定は、以下のコマンドで確認できる。
[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 という記事もいくつか見かけるので、こちらもそのうち試してみたい。
続く
ディスカッション
コメント一覧
まだ、コメントがありません