ただのプロセスならKillでもいいけど、qemuをKILLはいかんざき
かまいたちの夜っていうゲームで、ゲームの中でもかまいたちの夜をやって、ゲームの中のゲームの中で次々と電源を切っていって、振り返ったら電源を切ろうとしている手が!!みたいなバッドエンドがありましたね。
では本題に。
LoadAverageとCPU使用率の監視プログラムのDaemon化はうまくいきました。つぎの段階に進もうと思うけど、ちょっと横道に逸れた話かもしれない。
ただのプロセスに興味ありません。という事でプロセスを管理する方法を考えてみたんですけど、やっぱりプロセスだし、基本に沿うのであればreniceかな?で試してみました。
VPSの構築は何回かやってるので、時間はかかるけどもそれほど大変ではないけどお、過去にやってからだいぶ時間が経っているので、エラーメッセージなんかはすっかり忘れている。
エラーメッセージでググると自分のサイトが出てきて、まぬけだなぁ(笑)とか書いてあった
libvirtdを起動してなかった時に出るエラーなんだが、さすがに自分にまぬけだなぁ(笑)って言われるとちょっときれそうになるね。
軽く自爆しながらもさくっと構築は完了する。
2012 qemu 20 0 1366m 841m 5128 S 53.0 22.5 0:53.43 qemu-kvm 2135 qemu 20 0 1366m 722m 5124 R 26.5 19.3 0:37.87 qemu-kvm 2553 qemu 20 0 1366m 733m 5128 S 22.7 19.6 0:31.67 qemu-kvm 2761 qemu 20 0 1366m 732m 5128 S 18.9 19.6 0:27.01 qemu-kvm
作ったVMは合計4個。
3個の各VM内ではYes攻撃をしておいて、LoadAverage20くらいをキープさせておき、残りの1個のVMでnice値を何回か変えてベンチマークを試してみたんだけど、まったくそれらしい効果は得られなかった。
残念。
I/Oテスト
write: io=409600KB, bw=47539KB/s, iops=46, runt= 8616msec write: io=409600KB, bw=52995KB/s, iops=51, runt= 7729msec Run status group 0 (all jobs): WRITE: io=409600KB, aggrb=47539KB/s, minb=47539KB/s, maxb=47539KB/s, mint=8616msec, maxt=8616msec Run status group 0 (all jobs): WRITE: io=409600KB, aggrb=52995KB/s, minb=52995KB/s, maxb=52995KB/s, mint=7729msec, maxt=7729msec
CPUテスト
System Benchmarks Index Score 619.0 System Benchmarks Index Score 621.0
どっちがどっちか忘れてしまうくらい、reniceでは無理ぽ。
となるとcontrol groupしかないかな。どんな機能なのかというと、カーネル2.6.24から利用できるらしく、CPU時間、ネットワーク、メモリ、I/O、などなどリソースをグループ単位で割り当てや制限ができるというもの。
control groupを試してみた
情報が少ない系で、実行結果が参考サイトに載ってないのでちょっと怖かったけど仮想環境だし関係ないね!ってことでやってみよう。
実行する方法は2通りあり、/etc/cgconfig.confを書き換えてcgconfigを再起動する方法と、echoやcatでコマンドラインから数値を書き換える方法があるようだが、今回はコマンドラインから書き換えてみた。
まずは参考サイトでも見本があるグループの一時停止をやってみよう。
一応インストールから記載します。
グループの一時停止といっても、グループに登録するプロセスが1個だったら、1個のプロセスの一時停止です。
ScientificLinuxの場合だどん。 [root@localhost ~]# yum install libcgroup-devel libcgroup
[root@localhost ~]# chkconfig cgconfig on [root@localhost ~]# service cgconfig start Starting cgconfig service: [ OK ] [root@localhost ~]# ls /cgroup/ blkio/ cpu/ cpuacct/ cpuset/ devices/ freezer/ memory/ net_cls/
ディレクトリを作るどん。 [root@localhost ~]# mkdir /cgroup/freezer/yes yes攻撃でプロセスを作るどん。 [root@localhost ~]# yes > /dev/null & [1] 13598 最初はtaskに登録されるどん。 [root@localhost ~]# grep 13598 /cgroup/freezer/tasks 13598 別のグループに書き込むと動的にグループから外れるみたいだどん。 [root@localhost ~]# echo 13598 > /cgroup/freezer/yes/tasks [root@localhost ~]# grep 13598 /cgroup/freezer/tasks 今の状態だどん。 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13598 root 20 0 98.5m 588 500 R 99.9 0.1 4:40.12 yes 一時停止してみるどん。 [root@localhost ~]# echo FROZEN > /cgroup/freezer/yes/freezer.state [root@localhost ~]# cat /cgroup/freezer/yes/freezer.state FROZEN おおお、これおもしろいどん。 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 7 root 20 0 0 0 0 S 0.3 0.0 4:11.59 events/0 1 root 20 0 19232 1528 1292 S 0.0 0.2 0:01.95 init 静止画なのが残念だとん。 [root@localhost ~]# echo THAWED > /cgroup/freezer/yes/freezer.state [root@localhost ~]# cat /cgroup/freezer/yes/freezer.state THAWED PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13598 root 20 0 98.5m 588 500 R 99.9 0.1 5:30.76 yes
では続いて、参考サイトではconfigをいじってるけども、echoでCPUの利用率を変えてみる。
細かいところは端折るどん。 これならcgconfigの再起動が不要で、うれしいどん。 [root@localhost ~]# cat /cgroup/cpu/test/cpu.cfs_quota_us -1 [root@localhost ~]# echo 250000 > /cgroup/cpu/test/cpu.cfs_quota_us [root@localhost ~]# cat /cgroup/cpu/test/cpu.cfs_period_us 100000 [root@localhost ~]# echo 1000000 > /cgroup/cpu/test/cpu.cfs_period_us Cpu0 : 24.4%us, 0.3%sy, 0.0%ni, 75.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1012548k total, 594388k used, 418160k free, 74112k buffers Swap: 2031608k total, 676k used, 2030932k free, 379292k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13792 root 20 0 98.5m 588 500 R 25.3 0.1 11:09.50 yes 7 root 20 0 0 0 0 S 0.3 0.0 4:12.69 events/0 1 root 20 0 19232 1528 1292 S 0.0 0.2 0:01.97 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd 3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 アクセス頻度を1/4に抑えることで、結果25%までの使用率となる。のだどん。
ただし、configファイルを直接さわらずmkdirでテストディレクトリを作成する方法だと、cgconfigを再起動したら消えてしまうので気を付けよう。
Daemon化したことだし、initスクリプトで起動とかしたいよ!
これは参考サイトのスクリプトを拝借してちょっと加工してみました。
いちおう、サーバー内の/etc/init.d/ntpdとかも参考に見てみて、ほ~っと頷いてみたりとかはしたんだからね!
参考コード
yoshifumi1975’s diary
C言語でprefork型のデーモンを書く(4): init スクリプト
/etc/init.d/my_prefork_daemon
実行結果
[root@localhost ~]# /etc/init.d/pre_sig_2 status pre_sig_2 is not running. [root@localhost ~]# /etc/init.d/pre_sig_2 start pre_sig_2 を起動中: [ OK ] [root@localhost ~]# ps -U root | grep pre_sig_2 13877 ? 00:00:00 pre_sig_2 13878 ? 00:00:00 pre_sig_2 13880 ? 00:00:00 pre_sig_2 13881 ? 00:00:00 pre_sig_2 [root@localhost ~]# /etc/init.d/pre_sig_2 stop pre_sig_2 を停止中: 終了しました [root@localhost ~]# ps -U root | grep pre_sig_2 [root@localhost ~]#
問題なしです。
今回は本題からちょっと離れてVPSの話になっちゃったけど、とりあえずサーバー単体での監視を考えるべきなので、control groupはまた今度検証するべしべし。
個人でのレンタルサーバー利用者(管理者権限があるにしろないにしろリソースを共有するサーバーを使っている)が使えるツールを作ってみるのもおもしろいかもしれない。
今回の参考サイト
いますぐ実践! Linux システム管理
cgroup について理解する
海馬のかわり
cgroupで、お手軽CPU使用率制限