時代に追いつくMining Log

マイニングが流行ってから一足遅れて世界に飛び込んだ人の日々の記録と成長を記録していきます

chia plot作成におけるphaseごとのCPU/Memory使用率とhdd書き込み量の測定と考察

はじめに

今回は技術的な考察です。今回新規でplotファイル作成時のlogを取り、解析をかけたので参考になれば幸いです。ある程度しっかり考察を行い、最低スペックに対する考えなどをまとめようと思います。

まずは事前に参考にしたデータとサイト

現状、ネットに上がっているplot作成時の処理能力の変動とファイルサイズの推移などがあります。

www.reddit.com

Redditに一応上がっているやつですね。ただ今回、このデータが本当に正しいか、1.0.4の頃から1.1.7にアップデートして処理などが変わっていないかなどを含めて再度log取りをしてみました。また、このデータはplot作成に9時間弱かかっているのですが、今回1plot作成に7時間ちょいで終わったのでそれに関する比較なども出来たらと思います。他にも、このグラフをplotしたPCのスペックなども書いていなかったので、その辺も記載して比較出来たらと。ただ、データ解析は本職ではないので適当に書き連ねるだけです。

まずはplotLogを

f:id:takaindex:20210609102800j:plain
今回作成したデータはこのようになりました。データを取ったコマンドは以下の物を使っています。

pidstat -udhr -p **** | grep chia
cat /proc/cpuinfo | grep "cpu MHz"

pidstatでメモリーや記録デバイスのRead/Writeを取得しながらcpuinfoのlogファイルから全体のCPUの使用率を取得しています。取得してデータに変えたexcelファイルはこちらになるので、直接データを見て考察して頂いても構いません。

docs.google.com

ログを取った後に適当に平均値や数値を整えてグラフに起こしました。これと以前調べたphaseごとの処理内容を含めて考察していきます。

plot作成に使用したPCのスペックは以下の通りです。
CPU:Ryzen5 2600 (3.4GHz/TC3.9GHz)
Memory:DDR4 2133 16GB
tempFile:ADATA SC6000PNP 1TB NVMe
finalFile:ST4000DM004-2CV104 4.0TB HDD

なお、chiaに対して割り当てた性能は13Thread,13000MBとなっております。

考察

それでは考察をしていこうと思うのですが、各々のグラフに関してそれぞれ書いていこうと思います。

CPU

上から2つのグラフですね。上のグラフは12threadの使用率を平均とってグラフに起こしています。このデータにはchia以外にOSなどの処理も含まれております。そのため、余裕があるタイミングでも最低限回っている量があります。逆に下のグラフはchiaのプロセスのみのグラフになっています。ただ、pidstatでの%CPUの数値なので、要求時間などに関する数値です。そのため、2つのグラフを合わせながらデータを見ていきます。
以前phaseに関して調べた際、phase1のみマルチスレッド対応という記事は出てきました。このデータは公式なので間違っていないでしょう。実際pidstatで使用しているthreadを見ていると複数使用している記録が見れました。
逆にphase2~4はシングルスレッドしか使用していませんでした。ただ、どのthreadを使用するかはOSによる自動割り当てを使用しているらしく、定期的に使用しているthread番号が移動していました。多分余裕のあるthreadに移動しているんだと思います。

CPUを一番使用しているphaseは1なので、結局並列plotをする際はphase1が被らないようにdelayを指定するのは必須だと思われます。実際にphase1を複数同時に回すとCPUの性能的にplot作成時間は3割増しになります。その他のphaseはCPUはかなり余裕がある感じに見えるので、そのタイミングに次のphase1をぶつけるのは問題なさそうです。phase4で一瞬CPUが跳ね上がっているタイミングがあります。正直これは%CPUのグラフと比較すると外れ値だとは思います。考えられる可能性はほかのプロセスが一瞬暴れたとかそんなところだと思います。

phase2~4ではphase1の2割程度の性能しか使ってないので、本当に1threadだけ全力で回っている感じだと思います。

時間的にもphase1とphase3が同等の時間を使っており、その2つが一番時間がかかっているので、並列処理に関してはphase1を基準にずらしていくのが正解に思えます。
設定するthreadの量は全体の9割程度でいいと思われます。他のphaseではあまり使用しませんし、結局はphase1以外は1threadしか使わないため、1~2thread開けておけば余裕はありそうです。

Memory

モリーは3番目のグラフですね。メモリーも結局phase1が1番使ってますね。ただ、意外なのはphase3でもそこそこ使っていました。それに比べて、phase2では意外にも使用率が減っていました。メモリはphase1とphase3で使用していると考えると、遅延の時間を考えると使用率は1jobに対して全体の6割程度で収めておくとphase1とphase3がぶつかったタイミングでちょうど9割超えになりそうですね。phase2は処理時間が比較的短めのため、あまり他のphaseと重なることは考慮しなくて良さそうです。

plotファイル作成に関してメモリーは快適な最低限量などはありそうですが、無理に増やしても処理速度が上がるという訳ではなさそうですね。合わせて8~12GB程度あれば十分そうです。

read/write

読み込みに関しては、phase1ではそんなに行っていません。ただ計算結果を淡々と書き込んでいるだけっぽです。phase1の開始直後のWriteと終わり間際のReadのスパイクはredditの方のグラフでも同様のスパイクを起こしています。多分最初の書き込みのスパイクは書き込み用のファイルを量産している所でしょう。その後に順番に中身を書き込んでいるので、その後のWriteはある程度の量を維持しながら移動しています。
Readのスパイクに関しては何が起こっているのかわかりませんでした。ただ、phase1の最後に行ってからphase2に突入しているため、phase1が終わってから次のjobのphase1が開始するようにすればNVMeへの負荷が減るはずです。
phase2に関してはちょっと面白く、読み込みと書き込みを交互に行なっているっぽいです。phase2は末尾から逆方向に内容の確認と編集を行なっているため、部分ごとに読み込んで確認して書き込みを行なっているのでしょう。
phase3に関しては、データの圧縮を行なっているため、定期的に書き込みへのアクセスが発生しています。圧縮と書き込みを交互に行なっているのでしょう。phase1とphase3を同時に行うと書き込みの帯域が足りなくなる可能性が出てきそうですね。raid0で一応対応はできそうですが、コストに見合った速度が出るか疑問です。
phase4では特に何もして無いですね。最後に少し読み書きしているぐらいです。むしろ最初はアクセスをしていなさそうです。メモリー内のbufferだけで処理しているんでしょうね。
phase5はデータの移行phaseなので読み書き両方がしっかり出てきます。ここの速度はhddの方に引っ張られるためそこまで高い数値は出なかったです。

結局何が足を引っ張ってるのか

実際に実機でグラフを作ってみて分かった事ですが、NVMeに変えたことでボトルネックはCPUとなっていました。thread数はphase1にしか効かないため、1threadの処理能力がphase3で時間をかけてしまっているっぽです。そのため、chiaに合っているCPUはintel i3の第10世代などの低Coreで高周波数出るタイプなのでしょう。どうしてもphase1は時間がかかってしまいますが、phase3の時間を縮められると思います。あとは、正直plot作成用のPCを数用意するのが1番早いと思います。結局CPU1個の速度限界があるため、並行して複数PCを回すのが1番早そうです。最終的にできるplotファイルはネットワーク越しに別のPCに飛ばすようにすればplot作成用のPCはコンパクトに済みます。ただPC自体の寿命はどうしても縮むので、中古で買って使い捨てるのが良さそうですね。
あとは、OCをして無理やり高周波数を出す方法もありそうです。ただ、Ryzen系列はOCをした際に指数的に消費電力と発熱が上がるという欠点が昔からあります。そう考えると、OCをした際の排熱対策と電源容量の観点からOCしてまでやることかなぁって思います。

最後に

実際にLogを取ってグラフにした事で、ボトルネックが分かったり、遅延をどれぐらい入れれば最適かはわかった気がします。また、今後このログ作成に使ったshellスクリプト関係はgithubにあげて公開しようと思います。他にも、ログファイルからグラフを作るようにpythonでソフトも書こうかなぁと思っています。暇だったらですが。
自分の機材でログを取ることで、頭打ちになっている項目がわかるので機材の調整がしやすくなりました。今後どういう方向で機材の追加をしていくかなんとなくですがビジョンが見えたので良かったです。
ただ、plot作成が一時的にでも止まったのでちょっと今後は控えたいですね。作業量が増えました。

それではまた。