AMD Ryzen 7 1700 + Linux カーネル 4.13 以降でカーネルがクラッシュする問題


AMD RYZEN 7 1700 + LINUX でカーネルのクラッシュと SEGV が起きる問題が解決しました」で Ryzen 7 の SEGV 問題と RMA で解消したことを書いた。が、カーネル 4.12 で数週間ごとにクラッシュすること、4.13 以降だと数時間でクラッシュする問題に悩まされていた。


問題

4.12 までは CONFIG_RCU_NOCB_CPU_ALL=y にしたカーネルを使っていたが、何も考えずに config を引き継いでビルドした 4.13 以降を使うと

  • 数時間以内にカーネルがクラッシュする
  • gcc 7.2 やカーネルをコンパイルすると internal compiler error が出る

という問題があった。

ただ、クラッシュするといっても、完全にクラッシュするときもあればコンソールやネットワークがクラッシュするもののカーネルログは問題なく吐かれたりすることもある。実際、このようなログが記録されていた。

Nov 29 05:42:22 artemis kernel: INFO: rcu_sched detected stalls on CPUs/tasks:
Nov 29 05:42:22 artemis kernel: \x096-...: (1 GPs behind) idle=79e/140000000000000/0 softirq=1452606/1452847 fqs=984036
Nov 29 05:42:22 artemis kernel: \x097-...: (1 GPs behind) idle=a06/140000000000000/0 softirq=921906/921907 fqs=984036
Nov 29 05:42:22 artemis kernel: \x09(detected by 11, t=5754457 jiffies, g=708155, c=708154, q=0)
Nov 29 05:42:22 artemis kernel: Sending NMI from CPU 11 to CPUs 6:
Nov 29 05:42:22 artemis kernel: Sending NMI from CPU 11 to CPUs 7:
Nov 29 05:42:22 artemis kernel: rcu_sched kthread starved for 3028 jiffies! g708155 c708154 f0x0 RCU_GP_DOING_FQS(4) ->state=0x0
Nov 29 05:42:22 artemis kernel: rcu_sched       R  running task    14952     8      2 0x00000000
Nov 29 05:42:22 artemis kernel: Call Trace:
Nov 29 05:42:22 artemis kernel:  ? _raw_spin_unlock_irqrestore+0xc/0x20
Nov 29 05:42:22 artemis kernel:  ? force_qs_rnp+0x180/0x1a0
Nov 29 05:42:22 artemis kernel:  ? _synchronize_rcu_expedited.constprop.88+0x5b0/0x5b0
Nov 29 05:42:22 artemis kernel:  ? _cond_resched+0x26/0x40
Nov 29 05:42:22 artemis kernel:  ? rcu_gp_kthread+0x4fd/0xdd0
Nov 29 05:42:22 artemis kernel:  ? __switch_to+0x202/0x460
Nov 29 05:42:22 artemis kernel:  ? kthread+0x104/0x140
Nov 29 05:42:22 artemis kernel:  ? force_qs_rnp+0x1a0/0x1a0
Nov 29 05:42:22 artemis kernel:  ? kthread_create_on_node+0x40/0x40
Nov 29 05:42:22 artemis kernel:  ? ret_from_fork+0x25/0x30
Nov 29 05:43:25 artemis kernel: INFO: rcu_sched detected stalls on CPUs/tasks:
Nov 29 05:43:25 artemis kernel: \x096-...: (1 GPs behind) idle=79e/140000000000000/0 softirq=1452606/1452847 fqs=994676
Nov 29 05:43:25 artemis kernel: \x097-...: (1 GPs behind) idle=a06/140000000000000/0 softirq=921906/921907 fqs=994676
Nov 29 05:43:25 artemis kernel: \x09(detected by 9, t=5817462 jiffies, g=708155, c=708154, q=0)
Nov 29 05:43:25 artemis kernel: Sending NMI from CPU 9 to CPUs 6:
Nov 29 05:43:25 artemis kernel: Sending NMI from CPU 9 to CPUs 7:
Nov 29 05:43:25 artemis kernel: rcu_sched kthread starved for 19982 jiffies! g708155 c708154 f0x0 RCU_GP_DOING_FQS(4) ->state=0x0
Nov 29 05:43:25 artemis kernel: rcu_sched       R  running task    14952     8      2 0x00000000
Nov 29 05:43:25 artemis kernel: Call Trace:
Nov 29 05:43:25 artemis kernel:  ? _raw_spin_unlock_irqrestore+0xc/0x20

また、クラッシュするときも再起動する場合もあればクラッシュしたままのときもある。場合によってはクラッシュログが出るときもあるが、こんな感じだった。

ハードウェア検証

Ryzen 7 1700 は 25 週製造で CPU 側に問題がある可能性もあるので 28 週製造の Ryzen 7 1700X と交換してみたが問題が改善しなかった。もちろん
memtest86 も回してみたが、どちらの CPU で問題は出ない。

そのため、ハードウェアに問題がある可能性も考えて、マザーボードも手持ちのものと入れ替えたりもしてみた。また、前回、電源については Seasonic SS-520GB 以外の電源で検証しなかったため、新しく買った SSR-650RMS に変えてみたものの問題は改善しなかった。BIOS も Asrock AB350M Pro4 最新の
3.30 にしているがそれで解消はしていない。

RCU callback 問題と workaround

ログを見た感じ、どうも RCU 周りで落ちることが多いのでググってみたところ、

と、うちだけの問題ではないことが分かる。

あわせて考えてみると、

  • 前回の SEGV 祭りのときに CONFIG_RCU_NOCB_CPU_ALL=y にすると落ちないというのを AMD 公式フォーラムでみて設定していた。
  • CONFIG_RCU_NOCB_CPU_ALL=y は他のコンパイルオプションとかぶっているのでこのコミットで削除された。
  • 4.13 以降は CONFIG_RCU_NOCB_CPU=y でコンパイルしてカーネルオプション rcu_nocbs ですべての CPU を指定する必要がある。(7 の場合は rcu_nocbs=0-15)

ことに気づいたので試してみたところ、今のところ 1 週間ほどは何もエラーも出ないまま稼働していたが、1 週間ほどでやはり落ちてしまった。

雑感

この問題がハードウェア起因なのか Linux カーネル側の問題なのかは正直全く分からない。だが、気になるのはやはり EPYC や Threadripper でこの問題が起きるかということ。Intel の CPU が問題レスだとは言わないが、Phenom のときもそうだったし今回の Ryzen のときもそうだし、結構大きめの問題があるのが非常に気になるところではある。