CentOS7でBitcoindやMonacoindがディスクI/Oやメモリ、CPUを食いつぶさないようにするための設定 その2

CentOS7でBitcoindやMonacoindを起動すると、ディスクI/Oやメモリ、CPUを根こそぎ食われてサーバーが激重になる場合があります。このページでは、そのような事態を防ぐための設定について解説します。

もくじ

  • 使用するもの・前提条件(別記事)
  • ディスクI/Oを食いつぶさないようにするための設定(別記事)
  • メモリを食いつぶさないようにするための設定(別記事)
  • CPUを食いつぶさないようにするための設定

CPUを食いつぶさないようにするための設定

CPUの計算時間がBitcoindなどに独占されることを防ぐ設定については、2通りのやり方があります。やり方の選択で設定の難易度と制御のレベルが変わってくるので、好きな方を選んでください。…最も、ディスクI/Oとメモリの使用量を適切に制御すれば自ずとCPU使用率とネットワーク帯域の占有度も低下するので、個人レベルならそこまで神経質にならなくても大丈夫と思われます。選択肢は以下

  • CPU使用率に関する設定をしない
  • CPU使用率を緩く制御する(設定難易度…仏 制御レベル…あらめ)
  • CPU使用率を厳密に制御する(設定難易度…鬼 制御レベル…細かめ)

CPU使用率を緩く制御する(設定難易度…仏 制御レベル…あらめ)

このやり方では、CPU使用率をゆる~く制御します。細かく「1秒につき○ミリ秒までCPUを使ってよし」という設定はしません。例によってroot権限で/etc/cgconfig.confを編集します。

[VIM] sudo vim /etc/cgconfig.conf #ここから下は書き込み済み group monacoind { perm{ task { uid=”hoge”; gid=”hoge”; } admin { uid=”hoge”; gid=”hoge”; } } blkio { blkio.throttle.read_bps_device=”8:0 20971520″; blkio.throttle.write_bps_device=”8:0 10485760″; } memory { memory.limit_in_bytes=”512M”; memory.memsw.limit_in_bytes=”512M”; } #ここから上は書き込み済み #ここから下を追記 cpu { cpu.shares=”250″; } #ここから上を追記 } [/VIM]

「cpu.shares」は、制御対象となるプログラムに対してCPUを(相対的に)どれくらい優先配分するかを決めるパラメーターです。デフォルト値は1024なので、1024より小さな値をセットすればCPU資源配分の優先度を下げることができ、CPU使用率をある程度セーブできます。厳密に「CPU使用率○パーセント」という形で制御することは難しいですが、設定は楽です。なお、マルチコアCPUで使用するコアを制限したい場合の手順は次節で解説します。

/etc/cgconfig.confを編集したら、/etc/cgrules.confも編集します。2つ以上のサブシステムを利用する場合はカンマで区切って追記します。 [VIM] sudo vim /etc/cgrules.conf hoge blkio,memory,cpu monacoind/ [/VIM]

両ファイルの編集が完了したら、以下のコマンドで設定を反映させましょう。 [VIM] sudo systemctl restart cgconfig sudo systemctl restart cgred [/VIM]

CPU使用率を厳密に制御する(設定難易度…鬼 制御レベル…細かめ)

こちらでは厳密に「1秒あたり○ミリ秒までCPUを使用してよし」というラインを設定してCPU使用率の上限を決めます。設定難易度は上がりますが、BitcoindなどにCPUを占有されず、他のプログラムにCPUを確実に割り振れるようになります。例によってroot権限で/etc/cgconfig.confを編集します。

[VIM] sudo vim /etc/cgconfig.conf #ここから下は書き込み済み group monacoind { perm{ task { uid=”hoge”; gid=”hoge”; } admin { uid=”hoge”; gid=”hoge”; } } blkio { blkio.throttle.read_bps_device=”8:0 20971520″; blkio.throttle.write_bps_device=”8:0 10485760″; } memory { memory.limit_in_bytes=”512M”; memory.memsw.limit_in_bytes=”512M”; } #ここから上は書き込み済み #ここから下を追記 cpuset { cpuset.cpus=”0-2″; cpuset.mems=”0″; } cpu { cpu.cfs_period_us=”1000000″; cpu.cfs_quota_us=”200000″; } #ここから上を追記 } [/VIM]

cpusetセクションでは、プログラムグループで使用するCPUとメモリの設定を行います。「cpuset.cpus」では、使用するCPUのコア番号を設定します。コア番号を列挙する際はカンマで区切り、ある番号からある番号の間のコアすべてを使用する場合は開始番号の後ろにハイフンを打ち込み、その後ろに終了番号を打ち込めばいいです。なお、CPUのコア番号は0からスタートすることがあるので気をつけましょう。例えば4コアあるCPUで2つのコアを使いたい場合は「0,1」などと打ち込み、4コアすべて使用する場合は「0-3」と打ち込むことになります。CPUのコア数などの情報の調べ方はこちらで解説しているので、必要であれば活用してください。

「cpuset.mems」では、使用するメモリ番号を指定します。こちらのページで解説している手順でメモリが刺さっているメモリースロット番号を調べ、出てきた番号を書き込んでください(メモリ1枚だけの場合は上の例のように「0」と書くことになると思います)。番号指定の書式は「cpuset.cpus」と同じです。

cpuセクションでは、プログラムグループに割り当てるCPU時間の上限を設定します。「cpu.cfs_period_us」の公式説明は「cgroup による CPU リソースへのアクセスを再割り当てする一定間隔をマイクロ秒単位で設定する」というものですが、ここで設定する値は後述する「cpu.cfs_quota_us」で実際に割り当てられるCPU時間の上限を設定する際、「○マイクロ秒のうちXマイクロ秒だけCPUを使える」とするときの「○マイクロ秒」に当たる部分となります。マイクロ秒単位で設定しますが、基本的には1秒(=1000000マイクロ秒・上限値)をセットしておけば大丈夫だと思います。ちなみに下限は1000マイクロ秒です。

「cpu.cfs_quota_us」では、「cpu.cfs_period_us」で設定された秒数の中でどれくらいの秒数をプログラムグループに割り当てるかを決定します。こちらも単位はマイクロ秒で、上の例では「1秒のうち0.2秒まではこのプログラムグループが(1個の)CPUを使って良い」という設定をしています。


ただし、ここで設定した秒数だけ割り当てられるのはあくまでも「1コア」です。上の画像のように、CPUが4コアあるときに「1秒のうち0.5秒までは(=CPU時間の50%までは)このプログラムグループが(1個の)CPUを使って良い」という設定を施しても、実際に使えるのは1コアの0.5秒であり、全体の数値に直すと12.5%になってしまいます。そのあたりも考慮して「cpu.cfs_quota_us」で割り当てるCPU時間を決めましょう。上の例で4コアのうち2コアをすべて使ってよしとしたい場合は、「cpu.cfs_quota_us」に「2000000」(=2秒)をセットすれば良いことになります。

/etc/cgconfig.confを編集したら、/etc/cgrules.confも編集します。2つ以上のサブシステムを利用する場合はカンマで区切って追記します。 [VIM] sudo vim /etc/cgrules.conf hoge blkio,memory,cpuset,cpu monacoind/ [/VIM]

両ファイルの編集が完了したら、以下のコマンドで設定を反映させましょう。 [VIM] sudo systemctl restart cgconfig sudo systemctl restart cgred [/VIM]

このブログを応援する・寄付する

当ブログでは暗号通貨による寄付を募っております。

モナゲボタン モナゲボタン

Bitcoin:

Monacoin:

Litecoin: