煽ったタイトルつけたら debian cgroupで検索かけると上の方に来てたので追加実験 [Linux]
早速会社でやってみた。以下はrootfsはDeibanだがカーネルは2.6.31という微妙なバージョンで試したのでそこは注意。
まず、Debian cgroupで検索するとLXCなるものがひっかかるがfstabに以下のようにしてもだめだった
none /cgroup cgroup default 0 0
独自ビルドカーネルなので素直にDocumentation/cgroups/cgroups.txtを見たら書いてあった。
debian:~# dmesg | grep cgroup
[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.081085] Initializing cgroup subsys ns
[ 0.081091] Initializing cgroup subsys cpuacct
[ 0.081096] Initializing cgroup subsys freezer
カーネルには入っているのを確認した。一応カーネルのコンフィグも確認したが、上の方のgeneric setupなんちゃらあたりにある。
で、Document通りにやってみる。
1) mkdir /dev/cgroup
2) mount -t cgroup -ocpuset cpuset /dev/cgroup
とやってみると、たしかにサブシステムが出来ているのを確認。
debian:~# ls /dev/cgroup/
cpuset.cpu_exclusive cpuset.memory_migrate cpuset.memory_spread_slab notify_on_release
cpuset.cpus cpuset.memory_pressure cpuset.mems release_agent
cpuset.mem_exclusive cpuset.memory_pressure_enabled cpuset.sched_load_balance tasks
cpuset.mem_hardwall cpuset.memory_spread_page cpuset.sched_relax_domain_level
最初にmkdirが必要というのがこの手のsysfsの罠。組み込まれているなら最初から出してくれてもいいのに・・・
で、2行目のmountを毎回やるのは面倒というか問題があるのでfstabに書く・・・と思ったがdevの下のmkdirは再起動すると消される(というか最初からファイルシステムに書いてるわけではない)のでmkdirとmountは毎回やらなくてはいけない、しかしsu権限は必要
ということで、/etc/rc.localに書く
とりあえず有効にするだけならば、以下のようにすることで可能
if [ "$PS1" ] ; then
mkdir -m 0700 /dev/cgroup/$$
echo 0 > /dev/cgroup/$$/cpuset.cpus
echo 0 > /dev/cgroup/$$/cpuset.mems
echo $$ > /dev/cgroup/$$/tasks
fi
echo $$とやってみたが、自分のttyのPIDであることを確認した。
が、Redhatの人のいうような方法のようにいきなりPIDを追加するとecho $$ ~~tasksで失敗する。
CPUやメモリを前もって割り当てておく必要があるようだ。これは2.6.31だからという可能性はある。
そして、この設定だと、メモリはともかく、CPU0を常に使うように制限をかけてしまうのでまったくよろしくない。QuadCPUの場合は
echo 0-3 > /dev/cgroup/$$/cpuset.cpus
とするのがよい。
CPUの個数を調べて設定する方法もあるにはある
メモリノードは通常のPCでは1つしかない。多分NUMA用。
if [ "$PS1" ] ; then
CPUN=`cat /proc/cpuinfo | grep processor | tail -n1 | awk '{ print $3 }'`
mkdir -m 0700 /dev/cgroup/$$
echo 0-$CPUN > /dev/cgroup/$$/cpuset.cpus
echo 0 > /dev/cgroup/$$/cpuset.mems
echo $$ > /dev/cgroup/$$/tasks
fi
で、結局これっていつも通りの設定なんじゃ?と思う。
一応今のコンソールから派生したプロセスはログイン時に作ったグループから派生してくれるようになるが、制限にはならない。
この後システムリソースを枯渇させないような設定が必要と思われる。
Documentをさらっと読んだ感じ、以下今のPIDから派生したプロセスは全部子供として扱われるようになるらしい。だから親子関係を作るだけでもスケジューラに対しては最適解を教えることになる?
このシェルだけだと、使用するCPUやメモリに制限がかかるわけではないし、普段は制限をかけてほしくない。cgroupに追加するだけでスケジューラの処理が最適化されるのだろうか?
あと、昨日のうぶんつのやりかたのところで、シェルを用意してログオフ時のリリースもやるようにしてあった。
上の今のやり方だと最初の1回はいいが、2回目にログインしたりすると問題がある可能性はある。副作用が無ければゴミがちょっと残ってても気にしなくていいとは思うが。
そして、やっとヨドバシでパーツを買って、サブマシンを動かせそうになったので休日にでも実験しようと思う。
まず、Debian cgroupで検索するとLXCなるものがひっかかるがfstabに以下のようにしてもだめだった
none /cgroup cgroup default 0 0
独自ビルドカーネルなので素直にDocumentation/cgroups/cgroups.txtを見たら書いてあった。
debian:~# dmesg | grep cgroup
[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.081085] Initializing cgroup subsys ns
[ 0.081091] Initializing cgroup subsys cpuacct
[ 0.081096] Initializing cgroup subsys freezer
カーネルには入っているのを確認した。一応カーネルのコンフィグも確認したが、上の方のgeneric setupなんちゃらあたりにある。
で、Document通りにやってみる。
1) mkdir /dev/cgroup
2) mount -t cgroup -ocpuset cpuset /dev/cgroup
とやってみると、たしかにサブシステムが出来ているのを確認。
debian:~# ls /dev/cgroup/
cpuset.cpu_exclusive cpuset.memory_migrate cpuset.memory_spread_slab notify_on_release
cpuset.cpus cpuset.memory_pressure cpuset.mems release_agent
cpuset.mem_exclusive cpuset.memory_pressure_enabled cpuset.sched_load_balance tasks
cpuset.mem_hardwall cpuset.memory_spread_page cpuset.sched_relax_domain_level
最初にmkdirが必要というのがこの手のsysfsの罠。組み込まれているなら最初から出してくれてもいいのに・・・
で、2行目のmountを毎回やるのは面倒というか問題があるのでfstabに書く・・・と思ったがdevの下のmkdirは再起動すると消される(というか最初からファイルシステムに書いてるわけではない)のでmkdirとmountは毎回やらなくてはいけない、しかしsu権限は必要
ということで、/etc/rc.localに書く
とりあえず有効にするだけならば、以下のようにすることで可能
if [ "$PS1" ] ; then
mkdir -m 0700 /dev/cgroup/$$
echo 0 > /dev/cgroup/$$/cpuset.cpus
echo 0 > /dev/cgroup/$$/cpuset.mems
echo $$ > /dev/cgroup/$$/tasks
fi
echo $$とやってみたが、自分のttyのPIDであることを確認した。
が、Redhatの人のいうような方法のようにいきなりPIDを追加するとecho $$ ~~tasksで失敗する。
CPUやメモリを前もって割り当てておく必要があるようだ。これは2.6.31だからという可能性はある。
そして、この設定だと、メモリはともかく、CPU0を常に使うように制限をかけてしまうのでまったくよろしくない。QuadCPUの場合は
echo 0-3 > /dev/cgroup/$$/cpuset.cpus
とするのがよい。
CPUの個数を調べて設定する方法もあるにはある
メモリノードは通常のPCでは1つしかない。多分NUMA用。
if [ "$PS1" ] ; then
CPUN=`cat /proc/cpuinfo | grep processor | tail -n1 | awk '{ print $3 }'`
mkdir -m 0700 /dev/cgroup/$$
echo 0-$CPUN > /dev/cgroup/$$/cpuset.cpus
echo 0 > /dev/cgroup/$$/cpuset.mems
echo $$ > /dev/cgroup/$$/tasks
fi
で、結局これっていつも通りの設定なんじゃ?と思う。
一応今のコンソールから派生したプロセスはログイン時に作ったグループから派生してくれるようになるが、制限にはならない。
この後システムリソースを枯渇させないような設定が必要と思われる。
Documentをさらっと読んだ感じ、以下今のPIDから派生したプロセスは全部子供として扱われるようになるらしい。だから親子関係を作るだけでもスケジューラに対しては最適解を教えることになる?
このシェルだけだと、使用するCPUやメモリに制限がかかるわけではないし、普段は制限をかけてほしくない。cgroupに追加するだけでスケジューラの処理が最適化されるのだろうか?
あと、昨日のうぶんつのやりかたのところで、シェルを用意してログオフ時のリリースもやるようにしてあった。
上の今のやり方だと最初の1回はいいが、2回目にログインしたりすると問題がある可能性はある。副作用が無ければゴミがちょっと残ってても気にしなくていいとは思うが。
そして、やっとヨドバシでパーツを買って、サブマシンを動かせそうになったので休日にでも実験しようと思う。
コメント 0