自作マシン2号組んだ

κeenです。前回に続いて自宅用のデスクトップマシン2号を組んだのでメモします。

新調しようと思ったのは64コア/128スレッドのRyzen Threadripper 3990Xが発売されたから。Zen 2アーキテクチャが発表されたときからThreadripperの最上位モデルを買うと決めてたので発売当日に買いにいきました。 1号機も稼動してから2年弱しか経ってないのですがソフトウェアエンジニアがパソコンにお金使ってもバチは当たらないだろうということで気にせず買うことにします。

元々、石だけ買って1号機に換装するつもりだったのですがソケットの規格が代わっててマザボも買い替える必要がでてきましたし、スレッド数が増えたということはメモリも増やさないとなーとか、TDP上がってるから電源もアップグレードした方がいいかなーとか考えて筐体まるごと新しくすることにしました。

構成は1号機とあまり変わらず、Threadripper 3990XにASRockのTRX40 Taichi、あとはメモリを128GiB(1スレッド1GiB計算)と、それっぽい電源と、簡易水冷のファン。GPUは後述しますがRadeonのSapphireを買って後悔しました。ケースは1号機よりひとまわり小さいものにしました。1号機で多少経験を積んだので2号機はもう少し難易度が高くてもいけるだろうという判断です。あとストレージがNVMeのSSDを6本です。

CPU

異常なスレッド数のCPUを選んだのは、面白いからというのとソフトウェア的にチャレンジングな環境にしたかったからです。 並列スケールすると謳っているソフトウェアでも異常なコア数のマシンに載せてみると意外と性能が出ないことがあるらしい、という話を同僚から聞いたので試してみたくなりました。 視点を変えると自分もそういう風にメニーコアでスケールするプログラムを書かないといけないのでその練習の意味もあります。 あとは一応、最近Rustとかのビルドが重い言語を触ってるのでビルド速度改善の意味もあるのですがRustのコンパイルはコア数であんまりスケールしないのでそんなに効果はないです。

メモリ

特に何も考えずにDDR4-2666を選びましたがマザボ的にはもうちょっと上の規格までサポートしてるっぽい(?)ので気が向いたら試してみたいなと思います。 実験してないので推測ですがRustのコンパイルはメモリ速度が効く気がするんですよね。

GPU

GPUに「画面が映るだけ」程度の機能を持つ3000円くらいのものを選んだのですが、失敗でした。 うちのディスプレイとの相性の問題もあるかもしれませんが、4Kで出力できませんでした。 あと音響機能がないので音が出ない。 うちのディスプレイが4Kで出力するにはHDMI 2.0接続が必要なのですがGPU側がHDMI 2.0未対応のようでした。 4K自体はHDMI 1.4から使えるらしく、世の中にはSapphireで4K出力に成功した報告もあるのですが、うちでは使えず。 結局、ここだけ1号機のGPUを移植することにしました。

ストレージ

せっかく高性能なCPUなのでコア数以外にもそれを生かせる構成にしようと思い、SSDをNVMeで6本用意しました。 3990XはPCIe 4.0のピン数が多くて、6本までPCIeでSSDを接続できるのです。

NVMe SSD 6本

このあたりややこしくて買うときに混乱したのですが、NVMeプロトコルでPCIe接続する、M.2端子のSSDを買いました。 マザボにM.2が直接刺さる箇所が2つあります。

グラボに刺さる2本

あとはグラボとかと同じようなPCIeスロットに刺さるケースが用意されていて、その中に4本のSSDを入れてPCIeスロットに差し込みます。

ケースに入れる4本 ケースの外観

マザボの規格的にハードウェアRAIDも組めるっぽいですが、私はソフトウェアエンジニアなのでソフトウェアRAIDを試してみます(???)。 まずUbuntu 19.10から実験的にZFSルートで動く機能が入ったので試してみましたが、ダメでした。 RAIDZを試そうとしましたがZFSはあとからストレージを増減させる機能に制約が多く、思った通りの構成にできませんでした。

今のところ、Root ZFSをあきらめて前回と似たような形でbtrfsとmdadmの混成でRAIDを組んでます。 4本を本体用に、2本をバックアップ用に使う予定です。 本体は/bootをmdadmで4ミラーのRAID1でext4に、/を4本構成のRAID5にしました。 2本のバックアップはZFSのミラー構成にできないかなと思いつつ、まだ初期化していないです。

あ、そうそう。NVMeストレージを4本刺してあるPCIeスロットはBIOSの設定でPCIe x16からPCIe x4 x4にする必要があります。 これをしないとストレージをBIOSレベルで認識してくれなくなるので注意。

NVMeの利点としてコマンドキューが長くて帯域をきっちり埋められる点があるらしい(?)ですがまだそういうプログラムを書いてないのでよく分かってません。 いつかちゃんと性能を引き出せる方法を勉強したいですね。

ケース

ケースを小さいやつにしたのは正解だった気がします。 大きいやつより軽くて取り回しが楽ですし、ケーブル長が足りないこともありません。 とりわけ今回はストレージをPCIeにしたのでSATAケーブルや電源ケーブルが必要なくなり、かなり手順が楽になりました。 エアフローとかそういう難しい話はよく分かりません。 CPUの温度は /sys/class/thermal/thermal_zone0/temp によると40℃ちょっとで安定してるみたいです。

OSのインストール

2号機にUbuntu 19.10をインストールしようとしましたが、インストーラが起動せずに失敗しました。 最初は組立不良かなと思ったのですが他のOS (FreeBSD) のインストーラだと起動するので19.10のインストーラの問題とあたりがつきました。

色々調べた結果、Linux 5.0.0では問題なくてLinux 5.3.0だとカーネルパニックすることが分かりました。 なのでUbuntu 18.04のインストーラだと起動します。 しかし私はZFSのために19.10をのインストーラを使いたかったので19.10を使えるようにします。

DuckDuckGoで調べるとカーネルの起動オプションに mce=off を渡せばひとまずカーネルパニックを回避できることが分かります。 それならば、とgrubが起動しているあたりで Esc を連打して起動メニューに入って F6 で起動オプションをいじって mce=off を足してから起動します。 これでインストールまでできるので、あとはインストール後の起動時にも同様のことをして立ち上げます。 最後に /etc/default/grub をいじって GRUB_CMDLINE_LINUX_DEFAULTmce=off を追記して update-grub か何かでこの設定を永続化します。

最後に

OSのインストールで苦戦しましたがなんとかハイスペックマシンを動かせてよかったです。ハイスペックマシンでも性能を引き出せるソフトウェアを書けるように頑張ります。

Written by κeen