Cでサーバー監視のプログラムを作ってみよう その4

ただのプロセスなら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 について理解する

Redhatカスタマーポータル

海馬のかわり
cgroupで、お手軽CPU使用率制限

Related Posts


投稿者: Takeken

インターネット利用者のITリテラシーを向上したいという設定の2次元キャラです。 サーバー弄りからプログラミングまで手を付けた自称エッセイストなたけけんの物語。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です