モネロのマイニングと最適化なスレッド数について


日付: 2021-05-01 閲覧数: 309



仮想通貨技術の進歩とともに、採掘ソフトの開発も積極的に行われているおり、暗号化技術と情報の分野も活性化されているようです。近年、73億ドルの時価総額を誇るモネロの相場上昇がビットコインとイーサリアムをめぐる熱狂によって後押しされ、注目を集めています。現にモネロのマイニングがグラフィックボードで効率よく行うことが難しいところがあり、CPU向けの採掘ソフトの方が開発されています。CPU向けの採掘ソフトに関して言えば、高価なグラフィックボードを搭載するマイニングリグを組む必要がなくコンシューマ向けのCPUでも実行できることが最大の特徴です。今回は、Intel(R) Core(TM) i5-8265U CPUを使ってモネロをマイニングし、モネロの採掘ソフトの最適化に触れて、最適なスレッド数の選び方についてご解説したいと思います。


XMRIGとはモネロのマイニングの為に開発された1つの人気なソフトです。今回はxmrigを使ってモネロを採掘したいと思います。xmrigのソースコードはGithubからダウンロード出来、xmrigの導入は以下の様に行います:


$ sudo apt-get install git build-essential cmake libuv1-dev libssl-dev libhwloc-dev
$ git clone https://github.com/xmrig/xmrig.git
$ mkdir xmrig/build && cd xmrig/build
$ cmake ..
$ make -j$(nproc)


実行可能なバイナリが現れるとモネロのマイニングを初めていいです。マイニングする前に構成ファイルを作成し、電子ウォレットのアドレスとマイニングプールのアドレスを設定する必要があります。./srcの下に記入済みの構成ファイルが用意されています。


今回は構成ファイルの最適な設定を見つけ出し、ノートパソコンからできるだけ性能を絞り出すことは目的でした。まずは、CPUのスペックを確認します:


$ lscpu


このような出力になりました:


Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
Address sizes: 39 bits physical, 48 bits virtual
CPU(s): 8
On-line CPU(s) list: 0-7
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 142
Model name: Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz
Stepping: 12
CPU MHz: 800.201
CPU max MHz: 3900,0000
CPU min MHz: 400,0000
BogoMIPS: 3600.00
Virtualization: VT-x
L1d cache: 128 KiB
L1i cache: 128 KiB
L2 cache: 1 MiB
L3 cache: 6 MiB


ここで何を確かめるかというと、このノートパソコンのCPUにコア4つ、1つのコアあたり2つのスレッド(マルチスレッド化)に対応しているところがポイントです。マルチスレッドを利用し、モネロを8のスレッドでマイニングするとハッシュレートが一番高くなると期待しました。スレッド数を構成ファイルで次の行を書き換えることで設定できます。以下はスレッド数1の場合の設定です:


"rx/0": [0],




そして、スレッド数を8にしたい場合は次の様に書き換えましょう:


"rx/0": [0, 1, 2, 3, 4, 5, 6, 7],


すると、ハッシュレートは1085.6 Hs/sになりましたが、これは最適なのか分かりませんでした。なので、次にハッシュレートとスレッド数の関係を明らかにする為にスレッド数を1から8までと増やしていき、ハッシュレートを計測しグラフを作りました。以下に貼り付けます:


ハッシュレートとスレッド数の関係

ここで、最適なハッシュレートはスレッド数である時に得るという予測が間違っていたことが分かりました。スレッド数1から4までの領域でハッシュレートが線形的に増える傾向を見せていますが、スレッド数は4以上になると性能が著しく下がることが明らかになりました。


ハッシュレートの低下を少し不思議に思い、インターネットでリサーチしてみました。ハッシュレートはスレッド数だけではなく、L3キャッシュの大きさとメモリの周波数にも左右されると分かりました。効率よく採掘したい場合は機材を綿密に調べる気がなければ物理コアの数に相当するスレッド数を設定すると良いです。大量のデータの処理を行う時にマルチスレッドの効果が見込まれるが、メモリからの情報通信をあまり必要としない仮想通貨マイニングの場合はマルチスレッドによる性能校を期待出来ません。上記の出力を見てみると分かる通り、最適なスレッド数は4であり、スレッド数を4以上に増やして行くと計算速度がむしろ下がると結論づけます。


キャッシュミス(キャッシュメモリからデータを読み込むことができないこと)の頻度を計測することでマルチスレッド化による性能低下の原因が分かります。CPUキャッシュに乗っかっていないデータをアクセスする時にメインメモリで探してCPUキャッシュに持ってくる必要があるので時間がかかり、キャッシュミスの頻度が上がればあがるほど計算性能が下がります。今回はperfコマンドを使って、スレッド数を1から増やしていってキャッシュミスイベントの数を計測しました。採掘ソフトを検知するツールを設計する為にこの方法が次の論文で採用されているようです: Detecting Covert Cryptomining using HPC。そして次のコマンドを使ってスレッド数を4にした時に実行したxmrigをベンチマークしました。


$ sudo perf stat -e cache-misses -a -I 1000 -o thread_4 -x, ./xmrig


これで、キャッシュミスを記録し、出力ファイルを作りました。そしてスレッド数を8まで増やして以下のようなグラフを得ました:


モネロのマイニングとキャッシュミスの頻度

グラフから一目瞭然でキャッシュミスの数がスレッド数を1か2に設定しても変わらないが、スレッド数を3にするとキャッシュミスの頻度がやや増えます。


スレッド数を更に増やしていくとキャッシュミスの数が著しく増加し、計算性能が下落してしまいます。一方ではハッシュ関数の計算を並列化するとハッシュレートがあがるはずです、他方では、スレッド数が多すぎるとCPUキャッシュメモリに存在しないデータをアクセスする頻度が爆発的に増え、有意義な計算をしなくなるので今回の最適なスレッド数が4あたりに飽和することが分かります。


モネロの採掘ソフトを本当に最適化したいのであれば、2つのことを考慮しましょう。だいいち、物理コアの数、そしてL3キャッシュのサイズです。多数のCPUコアを持っていても、L3キャッシュが小さければハッシュレートが高くなると期待出来ません。従って、特定の機材をベンチマークするか、マイニングの公式サイトでハッシュレートを確認するというやり方もあります:https://monerobenchmarks.info/


以上です。たくさんのモネロをマイニングできますように〜


出典:Investigating monero mining on a notebook




コメント (0)


記事特選