cgroupsの利用方法
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
Posted by yujiro このページの先頭に戻る
- VMをundefineできない場合の対処
- cpanflute2でエラーになる場合の対処
- シェルスクリプトをバイナリ化する「shc」
- OpenSSLで文字列を暗号化・複号化する方法
- sshログインに時間がかかる場合の対処
- vi/vimで範囲指定して置換する方法
- vi/vimでマークした行に移動する方法
- vi/vimで複数行を一括削除する方法
- LinuxでOSキャッシュをクリアする方法
- lessで検索文字列だけを表示する方法
- tailコマンドでファイルがローテートされても追従する方法
- svnでファイルやディレクトリを削除する方法
- phpMyAdminで「unknown system variable 'lc_messages'」となる場合の対処
- Linux(CentOS)でapxsがみつからない場合の対処
- PHP7.3とApacheを連携させる方法
トラックバックURL
コメントする
greeting