はじめに
技術顧問のsatです。サイボウズはAMDの最新サーバ用プロセッサEPYCを搭載したマシンを最近購入しました。EPYCは各種技術サイトのベンチマークにおいて優れた性能を示しているにもかかわらず、同プロセッサを搭載する製品が少ないこともあり、現物についての情報をあまり見かけないのが現状です。そんなEPYCマシンに対するサイボウズによる様々な検証について、数回に分けて連載形式でお伝えしたいと思います。
SEGV問題
EPYCと同じマイクロアーキテクチャを採用したPC用プロセッサRyzenには、いわゆる「SEGV問題」という問題が存在しました。第一回では、この問題が手元のEPYCにおいても発生するかどうかを確認した結果についてお伝えします。筆者は幸か不幸か私用PC(Ryzen1800x)においてSEGV問題に遭遇して複数個体を検証しましたので、今回はその経験に基づいて検証をしました。
事象
Ryzen1000系のCPU(Ryzen ProやThread Ripperについては未確認)において、特定の負荷(はっきりしているのはgccやclangによるビルド負荷)をかけるとプログラムがSIGSEGVを受信する。通常はそのまま異常終了する
これまでに明らかになっていること
- AMDはRyzenの一部の個体においてSEGV問題があることを認めつつも、ハイエンドPC用のRyzen Thread Ripper、およびサーバ用のEPYCでは起きないとPhoronixにコメントしている
- 最近製造された個体では問題は解消されているらしい。少なくとも筆者が持っていた個体については交換によって問題が解消した
- 本来のものよりも64バイト(キャッシュラインサイズに等しい)前にある命令を誤って実行したことがきっかけと考えれば説明がつく場合がある。それ以外の場合があるかは不明。
- 個体や各種HW/SWの構成によって発生確率が変動すること、および、起きない個体ではまったく起きないことから、恐らくは設計の問題ではなく製造の問題
ここに記載したことについての詳細が気になるかたは、記事の末尾に記載したリンクを参照ください。
検証結果
検証したEPYCマシンにおいてはSEGV問題は発生しませんでした。
検証環境
- サーバ: Super Micro AS-1023US-TR4
- CPU: EPYC 7451 x 2 (48コア、96スレッド)
- メモリ: MEM-DR432L-HL01-ER26 (32GB * 16, 合計 512GB)
- OS: Ubuntu 16.04.4
- カーネル: v4.4.0-116-generic
検証方法
1) linuxカーネルをダウンロードしてビルド用の設定をする
$ wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.15.7.tar.xz $ tar xf linux-4.15.7.tar.xz $ cd linux-4.15.7 $ make defconfig ... $
ここではlinuxのバージョン4.15.7を使っていますが、バージョンは何でもいいです。他のプログラムのビルドにおいても問題が発生した事例もありますが、ここでは筆者が再現確認に使っていたlinuxカーネルを用います。
2) 次のような再現スクリプトの実行によって、linuxカーネルビルドを2日間繰り返す
#!/bin/bash NCPU=96 for ((i=0;1;i++)) ; do if make -j$(NCPU) >/dev/null 2>>log.txt ; then echo "$i: $(date): OK" >>log.txt else echo "$i: $(date): NG" >>log.txt fi make clean >/dev/null 2>>log.txt done
これまで筆者が5つのRyzen1800xを検証した結果、問題のある個体(5つ中3つ)は最長でも2時間に一回は問題が発生していたため、検証結果を2日もとればよいだろうと判断しました。
3) log.txtにNGを含む行がひとつもなければ成功。そうでなければ失敗
検証結果
再現スクリプトを約26時間動かしても問題は発生しませんでした。AMDがSEGV問題についての詳細を明らかにしていないことより、AMDの関係者ではない私にはこの検証結果をもって「すべてのEPYCではSEGV問題は発生しない」とは言えませんが、少なくとも検証対象となったマシンにおいては恐らく問題ないだろうということがわかりました。
余談ですが、上記私用PCでは平均78秒かかっていたlinuxカーネルビルドがEPYCマシンでは約1/3の平均25秒で済むようになりました。凄まじい計算能力ですね。