[解決済] AMD Ryzen 1700 + Linux Kernel 4.11 でカーネルがフリーズする問題
この問題は無事解決した。
- AMD Ryzen 7 1700 + Linux でカーネルのクラッシュと SEGV が起きる問題が解決しました → していませんでした
- AMD Ryzen 7 1700 + Linux カーネル 4.13 以降でカーネルがクラッシュする問題
- AMD Ryzen 向け一部マザーボードでは UEFI から C6 ステートを disabled にできない件
我が家の自宅サーバは 10 年近く Xeon X3350 で稼働していたが、
- さすがに 10 年も経つと HDD のセクタ置換済みが結構増えてきた。
- 別に Phenom II 1065T で稼働する KVM マシンがあるが、電気代の関係で 1 台にまとめたい。
- 1.5TB が溢れそうになってきた。
こともあって、最近リリースされた Ryzen 1700 でリプレイスすることにした。
しかし、実際に稼働させてみると 24 時間も経たずにカーネルがクラッシュしてしまう問題がある。
Table of Contents
問題
概要
Ryzen 上の Linux で少しでも負荷がかかるとカーネルごとクラッシュする。ほとんどのケースでは Kernel Panic すら吐かないが、一度だけ以下が表示されていた。
なお、全コアを回してコンパイルするといった高めの負荷をかけなくても再現する。
稀にプロセスが Segmentation Fault で落ちたり gcc が Internal Error で落ちる程度で済むことがある。
gcc の Internal Error
上で書いたとおり、稀に gcc が Internal Error で落ちることはある。ただ、確実に落ちる状況もあって、それはカーネルが 4.11 未満で gcc 6.3 をコンパイルするタイミングになる。この場合は ACCEPT_KEYWORDS="~amd64"
で /usr/portage/scripts/bootstrap.sh
から始めたりemerge -e system
せずにまずは最新のカーネルでインストールし、再起動後にやればほぼ上手くコンパイルが通るようになる。
環境
稼働させている環境は以下。「→」は検証のために交換しているが、交換前後で問題が解消することはなかった。
- ハードウェア
- CPU: AMD Ryzen 1700
- マザーボード: Asrock AB350M Pro4 → ASUS PRIME B350M-A
- メモリ: SANMAX SMD4-U8GM-24R x 4 枚 → CORSAIR DDR4-2666 VENGEANCE LPX CMK32GX4M2A2666C16
- ストレージ: Areca ARC-1214-4i + HGST Deskstar NAS 3TB 0S03663 x 4 本
- OS
- ディストリビューション: Gentoo Linux
- カーネル: 4.11.3 (gentoo-sources-4.11.3)
- コンパイラ: gcc 6.3
リソース
改めて関係しそうなサイトを検索してみるといくつか見つかった。
- gcc segmentation faults on Ryzen / Linux | Community
- Ryzen – Gentoo Wiki
- Gentoo Forums :: View topic – AMD Zen/Ryzen thread
- Gentoo Forums :: View topic – Segfaults during compilation on AMD Ryzen.
- Ryzen上でlinuxカーネルをテストしようとしたら問題が出た(未解決) – 覚書
切り分け
ハードウェア
当然だが最初はメモリの相性を疑った。実際、AGESA 1.0.0.4 で DDR4-2400 8GB x 4 枚構成だと DDR4-2400 では動作せず、DDR-2166 に落として動作させる必要がある。だがしかし、hynix 製チップ搭載の CORSAIR DDR4-2666 VENGEANCE LPX CMK32GX4M2A2666C16 に差し替えても改善しなかった。
次に疑ったのはマザーボードだが、Ryzen はメモリコントローラを内蔵しているので、ここはそんなにいうほど可能性はない。あり得るとしたらメモリまでの配線でノイズを拾うことだが、もしそうならそもそも起動しないレベルになるだろう。実際、交換しても改善はしなかった。
コンパイルオプション
gcc 6.x 以降では --mtune=znver1 --march=znver1
で Ryzen 向けの最適化が可能だが、Ryzen では FMA3
命令セットを食わせると落ちる問題があったので、Ryzen 向けに最適化することでそういった地雷を踏んだことを考えた。
しかし、実際に --mtune=generic
で一般的な amd64 CPU 向けにコンパイルしても問題が解消することはなかった。
KVM
今回は、
- ホスト側で libvirt などの KVM 管理環境と PostgreSQL / MySQL / Samba などのストレージ回り
- WordPress や各 Web サービスのバックエンドは KVM 上の仮想環境で
という切り分けを考えていた。KVM 側で地雷コードを踏む可能性もあったので、
- KVM 側で
--march=generic
ですべて再コンパイル - Gentoo Linux のようなエッジの効いたディストリビューションではなく、CentOS で稼働する仮想環境に換える
- そもそも KVM を起動しない
を試してみたが、3. で何も負荷をかけない限りはすべて改善しなかった。
PostgreSQL / MySQL を止めてみる
新サーバでは WordPress 向けの MySQL, 各種サービス向けの PostgreSQL 双方が稼働している。そこで、
- PostgreSQL / MySQL 両方とも走らせる
- PostgreSQL のみ走らせる
- MySQL のみ走らせる
- PostgreSQL / MySQL 両方とも止める
で試してみたが、4. で何も負荷をかけない限りはすべて改善しなかった。
フォーラムなどで出ていた workaround
フォーラムを見た限り、以下がワークアラウンドとして挙げられていた。
- SMT を off
- C’n’Q を off
- μOP Cache を off
すべて試したが、最終的にクラッシュする事象に変化はなかった。
現状と考えられる原因
今回、本当に色々と試してみた。
Ryzen でリブートや Internal Error でコンパイルが転けるのはこれかな。早朝にまた落ちたので SMT を切って再起動してみた。 – gcc segmentation faults on Ryzen / Linux: https://t.co/z4mDtiHHQg
— めいほん (@meihong) 2017年5月17日
だめだ、SMT を切ったけど落ちた
— めいほん (@meihong) 2017年5月17日
Gentoo forum で Power Now! と CnQ を切ると安定するとあったので試したが 5 時間でパニクった。uOP Cache を切ると安定すると AMD forum にあったので試したが 10 時間もたなかった。
— めいほん (@meihong) 2017年5月17日
いまのところ、–march=generic でビルドしたのが一番長生きしてるなー。それでも 24 時間もたないけど。
Gentoo minimal install CD は 72 時間ほど問題なく動いていたから何かしらあるはずだが……— めいほん (@meihong) 2017年5月17日
あまりに新マシンが落ちるので、いったん旧環境に戻した上で、メモリを SanMax DDR4-2400 x 4枚から CORSAIR Vengeance DDR4-2666 x 2枚に換えてみた。今のところ mentest86 は 3 周回ったけど、前のも 4 周回ったからなー。
— めいほん (@meihong) 2017年5月21日
うちの Ryzen ちゃん、とりあえずメモリの相性を疑った結果、メモリを CORSAIR Vengeance LPX 16GB x 2 に換装して memtest86+ が 5 周回ったので、再度サービスを新サーバに移してみた。
バージョンからするとチップは Hynix かな。 pic.twitter.com/TOv8yUlzBh— めいほん (@meihong) 2017年5月21日
CORSAIR Vengeance LPX 16GB x 2 でも Ryzen 7 ちゃんは討ち死。メモリ以外で爆死しているんだろうか。
— めいほん (@meihong) 2017年5月21日
電力計を買ってサーバの消費電力を測ってみたけど、gcc をコンパイルした状態で 175W ほど。SMT を止めているのでフルパワーではないが、例え古いとはいえ Seasonic の 550W で十分電力供給できているはず。
— めいほん (@meihong) 2017年5月27日
マザーボードを換えても Ryzen 1700 ちゃんはフリーズし続けるでござる…… あとはもう電源か CPU そのものか AGESA なのか。
— めいほん (@meihong) 2017年5月31日
あまりに新マシンが落ちるので、いったん旧環境に戻した上で、メモリを SanMax DDR4-2400 x 4枚から CORSAIR Vengeance DDR4-2666 x 2枚に換えてみた。今のところ mentest86 は 3 周回ったけど、前のも 4 周回ったからなー。
— めいほん (@meihong) 2017年5月21日
だが結局のところ問題は解決していないので、この blog も含め旧ファイルサーバにすべて突っ込んで対応している。
考えられる問題としては
- Ryzen CPU そのもののハードウェアに起因するバグで回避不可能
- Ryzen CPU そのもののバグだが、マイクロコードの改修で回避可能
- メモリ回りの問題
- カーネルそのもののバグ
といったところだろうか。フォーラムは割と深刻に捉えていなさそうなので軽くコメントしておいたが、解決するのか非常に心配ではある。
が、Twitter で
おっと、FreeBSD だと安定しています?
うちも KVM がなければそのオプションがあるんですが……
— めいほん (@meihong) 2017年6月3日
こういう話もあるので、Linux カーネル側のバグの可能性もある。
いずれにしても、AMD のフォーラムにあるスレッドをウォッチしていこうと思うが、この状況で Threadripper をリリースしてもいいのか心配ではある。
最後の方で Gentoo Linux のせいにされかねない認識を持たれているけど、Gentoo はほぼバニラなカーネルだし、つまり Gentoo 単品の問題じゃない。
Threadripper でも同様の問題があるだろうし、そうなったらエンタープライズでは使えないことになる。 https://t.co/Fa8h2zwh4y
— めいほん (@meihong) 2017年6月3日
Twitter にもこう書いたが、アーキテクチャそのものにはほとんど差はないだろうし、この状況で Linux が多用されるであろうエンタープライズに投入すると悲劇が起きると思うのだが……