Ryzen CPU環境で高負荷な処理を行うと、セグメンテーション違反が発生する
Ryzen CPU(Zenアーキテクチャー)+ Linux環境で高負荷な処理を行うと、セグメンテーション違反が発生する現象が報告されています。セグメンテーション違反が発生すると、その違反が発生したソフトウェアがクラッシュします。
本現象に関する情報は、以下で参照できます。
- gcc segmentation faults on Ryzen / Linux
- Segfaults during compilation on AMD Ryzen.
- Gentoo Ryzen Mobo in-use (Responses)
「Phoronix」では、本現象が発生するかテストを行い、現象の発生を確認したとのことです。
テスト環境
テスト環境は、以下の通りです。項目 | 内容 |
---|---|
CPU | AMD Ryzen 7 1800X 8コア/16スレッド @3.60GHZ |
BIOS/UEFI | 7A31v17(最新版) AGESA 1.0.0.6 |
マザーボード | MSI X370 XPOWER GAMING TITANIUM (MS-7A31) v1.0 |
チップセット | AMD Device 1450 |
メモリー | Corsair DDR4-3200 16384MB |
ストレージ | 25GB Crucial_CT525MX3 256GB INTEL SSDPEKKW256G7 |
GPU | NVIDIA GeForce GTX 1070 8192MB (1506/4006MHz) |
GPUドライバー | NVIDIA 384.59 |
サウンド | NVIDIA GP104 HD Audio |
ネットワーク | Intel I211 Gigabit Connection |
OS | Ubuntu 17.04 |
Linux Kernel | 4.13.0-999-generic (x86_64) 20170802 |
GCC | GCC 6.3.0 20170406 |
その他 | Unity 7.5.0 X Server 1.19.3 |
詳細は上記リンク先を参照してください。
Linux Kernelのバージョンは、「Ubuntu 17.04」が採用しているバージョン(4.10)よりも新しいバージョン(4.13)になっています。
ryzen-testでテスト
「ryzen-test」を利用すると、簡単に本現象を再現できます。ryzen-testで簡単に現象を再現できる
「ryzen-test」は、GCC 7.1をダウンロードし、GCCを並列ループでビルドするスクリプトであり、圧縮されたRAMディスク上でビルドを実行します。これにより簡単にCPUに負荷をかけることができます。
このスクリプトをDDR4-3200の設定で実行すると、最初のセグメンテーション違反が88秒後に発生したとのことです。
次にDDR4-2133設定で実行すると、最初のセグメンテーション違反が83秒後に発生したとのことです。
SMTを無効化してテスト
SMTを無効化してテスト「ryzen-test」を実行したところ、しばらくは問題が発生しなかったが、30分後に最初のセグメンテーション違反が発生したとのことです。SMTの無効化は本現象の回避策としてよく挙げられる回避策ですが、SMTを無効化するとスレッド数が半分になってしまいます。
またSMTの無効化及びDDR4-2133の設定でも、本現象が発生しています。
Intel CPUでは起きない
同じテストをIntel CPU環境で行っても、本現象は発生しなかったとのことです。phoronix-test-suiteでテスト
次に「Phoronix Test Suite」でCPUに負荷をかけ、本現象が発生するかどうかテストが行われました。stress-runで負荷をかけたテスト
同ソフトウェアで利用できるstress-runコマンドは、ハードウェアに負荷をかけ、安定性をチェックするために利用されます。stress-runは複数のテストプロファイルを並列に実行し、システム全体に負荷をかけテストすることが可能です。
以下のコマンドで本テストが実行されました。
PTS_CONCURRENT_TEST_RUNS=4 TOTAL_LOOP_TIME=60 phoronix-test-suite stress-run build-linux-kernel build-php build-apache pgbench apache redis
これは4種の異なるベンチマークを60分間同時に実行するコマンドです。
あるテストの実行が完了すれば、即座に次のテストが実行されます。
stress-runはランダムにテスト内容を選択しますが、複数のサブシステムに常に負荷がかかるようにするため、テストプロファイルの内容を参照してテストの選択が行われます。
この結果、マルチプロセスによるコードのコンパイル、PostgreSQL、Apache、及びRedisのテストでは、即座に問題が発生したとのことです。
SMTを無効化してテスト
次にSMTを無効化してテストが行われました。「ryzen-test」では30分後に最初のセグメンテーション違反が発生しましたが、こちらはシステムが起動して229秒後、最初のセグメンテーション違反が発生し、その後高負荷な状況と共に数分毎にセグメンテーション違反が発生したとのことです。