SSD/NVMeフリーズ問題(サスペンド時)

問題

サスペンド時のフリーズのため、ウェイクアップしないトラブル。ウェイクアップトラブルではありません。

OS:Ubuntu 24.04
Silicon Power製SSD P34A60で発生

対策

NVMeのAPST (Autonomous Power State Transition)の遅延時間の変更

問題の原因

  1. 同期の問題:
  • サスペンド(スリープやハイバネート)時には、システムの各デバイスが適切に低電力状態に移行し、復帰時には再び正常に動作する必要があります。
  • nvme_core.default_ps_max_latency_usの値を大きくすると、NVMeデバイスが低電力状態に遷移するまでの時間が長くなり、この間にシステム全体のサスペンドプロセスが同期できなくなる可能性があります。
  1. 電源管理の不整合:
  • 他のデバイスやシステムの電源管理設定とNVMeデバイスの遅延時間設定が一致しない場合、サスペンド時にフリーズすることがあります。これは、各デバイスが適切に低電力状態に移行するまでのタイミングがずれるためです。

対策の詳細

遅延時間の変更をするため、デフォルトの100000μsから15000μsへ変更。
下記ファイルのGRUB_CMDLINE_LINUX_DEFAULTの項目に以下を追加します。

注)0に設定するとAPSTが無効となり、APSTに関わるトラブルは完全に回避できますが、消費電力・製品寿命との兼合いから0にはしない方がいいでしょう。

nvme_core.default_ps_max_latency_us=15000

/etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nvme_core.default_ps_max_latency_us=15000"

設定を反映させて再起動

$ sudo update-grub
$ sudo reboot

Solid state drive/NVMe - ArchWiki

https://askubuntu.com/questions/1099048/18-04-and-18-10-fail-to-boot-nvme0-failed-to-set-apst-feature-19


OS起因のサスペンドバグ:Ubuntu 24.04

https://askubuntu.com/questions/1513210/suspend-bug-for-ubuntu-24-04lts

 GRUB_CMDLINE_LINUX="intel_iommu=off"

または

 GRUB_CMDLINE_LINUX_DEFAULT="text quiet init_on_alloc=0 intel_iommu=off"

$ sudo nano /etc/default/grub
# 以下のように編集(他のオプションがあればそのまま維持)
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash iommu=soft"
$ sudo update-grub
$ sudo reboot

dmesgやjournalctlでスタック時のログを確認

$ sudo dmesg | grep -i nvme
$ sudo journalctl -b -1 | grep -i suspend

kernelパラメータでAPST機能そのものを無効化

nvme_core.default_ps_max_latency_us=0 nvme.noacpi=1
  • nvme.noacpi=1 : ACPI経由のパワー制御を無効

BIOSのASPMの見直し

PCIe ASPM (Active State Power Management) → DisabledまたはL1 only

ASPM(Active State Power Management)とは?

PCIe デバイスとリンクのアイドル時の電力消費を抑えるための機構で、主に以下の2つのモードがあります:

モード 説明
L0s 非常に短い遅延で復帰できる軽いスリープ状態。消費電力は中程度に減少。
L1 より深いスリープ状態で、電力削減効果は大きいが復帰に時間がかかる。
特性 L0s L1
スリープの深さ 浅い(短時間の省電力) 深い(長時間の省電力)
復帰速度 非常に高速(サブマイクロ秒) 遅い(数マイクロ秒~ミリ秒)
安定性傾向 不安定になることがある 比較的安定している

Ubuntu 23.04 suspention or sleep doesn’t wake up after power again the system or can not login(and still not working)

$ cat /sys/power/mem_sleep
s2idle [deep]
  • deep :サスペンドフリーズ頻度多い
  • s2idle :サスペンド時のフリーズ無いがパワーLEDが点灯モードがスリープ状態に移行しない。

以下のファイル内で、どちらかを指定して $ sudo update-grub を実行し再起動

/etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT=“quiet splash mem_sleep_default=s2idle”
GRUB_CMDLINE_LINUX_DEFAULT=“quiet splash mem_sleep_default=deep”


<参考>

1. GRUBカーネルパラメータ総合ガイド

(1) 公式ドキュメント

サイト 説明
Kernel Parameters (kernel.org) Linuxカーネル公式ドキュメント。全パラメータの詳細な説明あり。
Ubuntu Boot Parameters (Help Wiki) Ubuntu固有のパラメータを解説。

(2) コミュニティガイド

サイト 説明
GRUBカーネルオプション (Arch Wiki) Arch LinuxのWikiだが、汎用的な情報が豊富。

2. カーネルパラメータの適用方法

(1) Ubuntu/Debian

$ sudo nano /etc/default/grub  # 編集
$ sudo update-grub            # 適用
$ sudo reboot                # 再起動

(2) 変更の確認

$ sudo cat /proc/cmdline  # 現在のパラメータを表示
$ sudo dmesg | grep -i "acpi\|i915"  # ログで効果を確認

サスペンド問題対策

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi=noirq mem_sleep_default=deep i915.enable_dc=0 pci=noacpi"