cgroupsの利用方法

cgroupsの利用方法

Posted at February 20,2020 11:55 PM
Tag:[cgroups, Linux]

cgroupsの利用方法を紹介します。

1.はじめに

cgroups(コントロールグループ)は、Linuxにおける、

  • CPUコア
  • CPU使用率
  • メモリ使用量
  • ディスクI/O
  • ネットワークI/O

などのプロセス資源を管理するためのサブシステムです。

ここではcpusetというサブシステムを利用して、

test1.sh
test2.sh

の2つのサンプルプログラムを、特定のCPUコアに割り当てる方法を紹介します。

なお、cgroupsが利用できるかどうかは、

# dmesg | grep cgroup
Initializing cgroup subsys cpuset
Initializing cgroup subsys cpu
Initializing cgroup subsys ns
Initializing cgroup subsys cpuacct
Initializing cgroup subsys memory
Initializing cgroup subsys devices
Initializing cgroup subsys freezer
Initializing cgroup subsys net_cls
Initializing cgroup subsys blkio
Initializing cgroup subsys perf_event
Initializing cgroup subsys net_prio

で確認できます。

上記の例では、

  • cpuset
  • cpu
  • ns
  • cpuacct
  • memory
  • devices
  • freezer
  • net_cls
  • blkio
  • perf_event
  • net_prio

のサブシステムが利用できます。

2.cgroupを使うための仮想ファイルシステムマウント

サブシステムのための仮想ファイルシステムをマウントします。

# mkdir /dev/cgroup
# mount -t cgroup -o cpuset cgroup /dev/cgroup

これで/dev/cgroup配下にcpusetというサブシステムが生成されます。

# cd /dev/cgroup
# ls -1
cgroup.event_control
cgroup.procs
cpuset.cpu_exclusive
cpuset.cpus
cpuset.mem_exclusive
cpuset.mem_hardwall
cpuset.memory_migrate
cpuset.memory_pressure
cpuset.memory_pressure_enabled
cpuset.memory_spread_page
cpuset.memory_spread_slab
cpuset.mems
cpuset.sched_load_balance
cpuset.sched_relax_domain_level
notify_on_release
release_agent
tasks

なお、デフォルトの設定では、ルートディレクトリに

/cgroups

があるようですが、コンフィグを利用して設定する回で解説するので今回は使用しません。

3.コントロールグループ作成

次にコントロールグループを作成します。

# cgcreate -g cpuset:/cpuset

これで

/dev/cgroup/cpuset

というコントロールグループが作成されます。

本当はcpuset配下にサブコントロールグループを作成したのですが、以降のコマンドでエラーになるため断念しました。

4.コントロールグループにCPU割り当て設定

CPU0を割り当てる設定を行います。

# cgset -r cpuset.mems=0 cpuset
# cgset -r cpuset.cpus=0 cpuset

これで、

/dev/cgroup/cpuset/cpuset.cpus

に"0"が設定されます。

cpuset.memsの設定を行わないと、次項のcgexecで

cgroup change of group failed

というエラーになります。

5.サンプルプログラムの実行(=CPUの割り当て)

前のメールではプログラム実行後にCPU割り当てを変更してますが
この方法であれば実行直後からCPU割り当てを変更できるようです。

# cgexec -g cpuset:/cpuset /root/test1.sh
# cgexec -g cpuset:/cpuset /root/test2.sh

この方法では、実際のcpコマンドも

# cgexec -g cpuset:/cpuset cp xxx xxx

のようになります。

6.top結果

このサーバではCPU0・CPU1の2コアがありますが、CPU0だけが使われていることが分かります。

top - 13:57:43 up 108 days,  7:03,  4 users,  load average: 2.00, 2.20, 2.19
Tasks: 157 total,   3 running, 154 sleeping,   0 stopped,   0 zombie
Cpu0  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   7510584k total,  3404032k used,  4106552k free,   326780k buffers
Swap:  3833848k total,        0k used,  3833848k free,  2333140k cached
関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)