Tomcatのメモリとスレッド監視

Tomcat の managerをたたいて、スレッド状態とメモリ状態を監視するためのスクリプト
適当につくったけど、こんなんでいいのかな。

#!/bin/bash

XML_FILE=test.xml
JK_PORT=8009
MANAGER_HOST=localhost
MANAGER_PORT=8080
MANAGER_USER=tomcat
MANAGER_PASS=tomcat

manager_url=`printf http://%s:%d/manager/status?XML=true $MANAGER_HOST $MANAGER_PORT`
curl --silent --basic --user $MANAGER_USER:$MANAGER_PASS  $manager_url > $XML_FILE

# memory
memtotal=`xmllint --xpath "string(/status/jvm/memory/@total)" $XML_FILE`
memfree=`xmllint --xpath "string(/status/jvm/memory/@free)" $XML_FILE`
memmax=`xmllint --xpath "string(/status/jvm/memory/@max)" $XML_FILE`

printf "memtotal=%d memfree=%d memmax=%d\n" $memtotal $memfree $memmax

# Thread 
xpath_str_maxThreads=`printf /status/connector[@name=\'jk-%d\']/threadInfo/@%s $JK_PORT 'maxThreads'`
maxThread=`xmllint --xpath "string($xpath_str_maxThreads)" $XML_FILE`

xpath_str_threadBusy=`printf /status/connector[@name=\'jk-%d\']/threadInfo/@%s $JK_PORT 'currentThreadsBusy'`
busyThread=`xmllint --xpath "string($xpath_str_threadBusy)" $XML_FILE`

xpath_str_currentThread=`printf /status/connector[@name=\'jk-%d\']/threadInfo/@%s $JK_PORT 'currentThreadCount'`
currentThread=`xmllint --xpath "string($xpath_str_currentThread)" $XML_FILE`

printf "maxThread=%d busyThread=%d currentThread=%d\n" $maxThread $busyThread $currentThread

rm $XML_FILE

実行結果

$ ./tomcat_check.sh 
memtotal=85000192 memfree=69646696 memmax=129957888
maxThread=200 busyThread=1 currentThread=4

Threadbusyは今リクエストを処理してるスレッドの数
currentThreadは、現在既に存在していて、待機しているスレッド
とかだったかな。

Macだと上ので動いたけど、CentOS5では動かなかったので、少し書き換えた。
属性の値をとるところはgrep,awk,trを使って文字列解析して取得することにした。

#!/bin/bash

XML_FILE=test.xml
JK_PORT=8009
MANAGER_HOST=localhost
MANAGER_PORT=8080
MANAGER_USER=tomcat
MANAGER_PASS=tomcat

manager_url=`printf http://%s:%d/manager/status?XML=true $MANAGER_HOST $MANAGER_PORT`
curl --silent --basic --user $MANAGER_USER:$MANAGER_PASS  $manager_url > $XML_FILE

# memory
memtotal=`echo cat '/status/jvm/memory/@total' | xmllint --shell $XML_FILE  | grep -v ">" |  awk 'BEGIN {FS="="}{ print $2 }' |  tr -d \"`
memfree=`echo cat '/status/jvm/memory/@free' | xmllint --shell $XML_FILE  | grep -v ">" |  awk 'BEGIN {FS="="}{ print $2 }' |  tr -d \"`
memmax=`echo cat '/status/jvm/memory/@max' | xmllint --shell $XML_FILE  | grep -v ">" |  awk 'BEGIN {FS="="}{ print $2 }' |  tr -d \"`

printf "memtotal=%d memfree=%d memmax=%d\n" $memtotal $memfree $memmax

# Thread 
xpath_str_maxThreads=`printf /status/connector[@name=\'jk-%d\']/threadInfo/@%s $JK_PORT 'maxThreads'`
maxThread=`echo cat "$xpath_str_maxThreads" | xmllint --shell $XML_FILE  | grep -v ">" |  awk 'BEGIN {FS="="}{ print $2 }' |  tr -d \"`

xpath_str_threadBusy=`printf /status/connector[@name=\'jk-%d\']/threadInfo/@%s $JK_PORT 'currentThreadsBusy'`
busyThread=`echo cat "$xpath_str_threadBusy" | xmllint --shell $XML_FILE  | grep -v ">" |  awk 'BEGIN {FS="="}{ print $2 }' |  tr -d \"`

xpath_str_currentThread=`printf /status/connector[@name=\'jk-%d\']/threadInfo/@%s $JK_PORT 'currentThreadCount'`
currentThread=`echo cat "$xpath_str_currentThread" | xmllint --shell $XML_FILE  | grep -v ">" |  awk 'BEGIN {FS="="}{ print $2 }' |  tr -d \"`

printf "maxThread=%d busyThread=%d currentThread=%d\n" $maxThread $busyThread $currentThread

rm $XML_FILE

JMXとかSNMPでもいいけど、とりあえず遊びとしてはこれでもいいかな。

格安サーバでも今はiLO

3万ぐらいでHP ML110 G6 を買ったけど、デフォルトでiLOついてるのね。。
LO100みたいだけど、前は別売りだったし考えたら安いよね。
BIOSiLOのファームを一応あげてから
とりあえずログインしてみた。

はじめは、デフォルト設定わからないんで
ログインパスワードがわからなくて入れず。。
結局は以下で設定できた。

IPアドレスは、BIOSのIPMIの項目で設定(デフォルトはDHCP)
管理者    admin/admin
オペレーター Operator/Operator

telnetブラウザーあたりで利用可能。
telnet,httpだとかどれを受け付けるかは
BIOSの項目で有効無効設定できます。

フル機能は使えないと思うけど、
リモートで電源操作だとかは最低限できそう。

telnet で電源あげたり、落としたりは以下でできた。

login: admin*
Password:

Lights-Out 100 Management
Copyright 2005-2007 ServerEngines Corporation
Copyright 2006-2007 Hewlett-Packard Development Company, L.P.

/./-> cd system1
/./system1/-> start system1
System1 started.
/./system1/-> stop system1
System1 stopped.

ブラウザは、以下でアクセス
http://IPアドレス(BIOSで設定したもの)

格安サーバ購入

HP ML110 G6 を購入して今日セットアップしました。
3万以下で買えてXeonの4コアっていうことで損はないなとつい購入。
部屋が広くないので小さめのものだったというのもポイント。
追加で物を足していたらこんな感じのスペックに。

CPU: Xeon3430(2.4)
Mem: 8GB(Non ECC)
Drive: DVD-ROM
HDD: 1TB(Raid 1+0)
Raidカード: HP SmartアレイP212コントローラー

[root@localhost ~]# ls -l /dev/cciss/
合計 0
brw-r----- 1 root disk 104, 0  1月 15 10:35 c0d0
brw-r----- 1 root disk 104, 1  1月 15 10:35 c0d0p1
brw-r----- 1 root disk 104, 2  1月 15 10:35 c0d0p2
brw-r----- 1 root disk 104, 3  1月 15 10:35 c0d0p3
brw-r----- 1 root disk 104, 4  1月 15 10:35 c0d0p4
brw-r----- 1 root disk 104, 5  1月 15 10:35 c0d0p5

[root@localhost ~]# cat /proc/cpuinfo 
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 30
model name	: Intel(R) Xeon(R) CPU           X3430  @ 2.40GHz
stepping	: 5
cpu MHz		: 1197.000
cache size	: 8192 KB

[root@localhost ~]# cat /proc/meminfo 
MemTotal:      8166748 kB
MemFree:       7826624 kB


[root@localhost ~]# cat /etc/redhat-release 
CentOS release 5.5 (Final)

[root@localhost ~]# arch
x86_64

一台、Core i3でESXi4を動かしているマシンがあるので、
今回はCentOS5をそのままいれてみることにした。
気が向けばKVM動かすかも?
途中で起動しなくなって焦ったもののなんとか修復してことなきを得る。
それなりに使えるものが安く買える世の中っていいですね。
あとESXiマシンにささっているグラボとIntel NICでもさしてみようかな。

バスを降りる時

今の仕事を辞めることになりました。
明日からは有給消化の期間に入ります。
残り有給のすべてを利用したいという我がままを
認めていただいた会社には感謝しています。

思えば入ってから、OSS関連のサポートから入って、
クラウド、認証周りの仕事という流れで仕事をしてきました。
どの分野も初めての経験でした。
おかげで技術的な面で言えば、幅的な意味で成長できました。
ただ一方で大事なものを無くしている自分に気づきました。

途中からやってはいたものの、やりながらこれでいいのか?
これが俺の望んでいた方向なのかと本気で考えはじめました。
其の時から、なりたいと思っていた自分を見失っていました。
そして冷静になって気づいたのは、会社が向かおうとしてる方向と
自分の方向性が大きく違っていることでした。

「だれをバスに乗せるか、最初に人を選び、その後に目標を選ぶ」

適切な人をバスに乗せることがすばらしい会社に向かうために重要なこと。
私は今のバスから降り、別のバスに乗ることにしました。
乗るべきではないバスにいることは、会社と個人両方にとって不幸なことです。

会社にとって人材の重要性は何度いっても言い過ぎではないぐらい重要なことです。
当たり前のことのように思いますが、適切な人をバスに乗せて適切な席に座らせる
ことができている会社は少ないのが現状。
言うのは簡単で実行するのは難しいもの。
適切な人を乗せることが出来たとしても、席を間違えればおそらく
その人は降りてしまうでしょう。
同じような人が又とれるからいいと考えているようなら考えが甘い。
適切な人の数は少数なので、代わりを見つけるのは困難です。
おそらく不適切な人を乗せることになるでしょう。

人材に関して、エンジニア間の口コミの力は結構あります。
悪い噂がたつといいエンジニアは其の現場にはほぼ行きません。
適切な人を乗せるためにも自然といい話が流れる現場を次の職場の人達と
つくっていきたいと思っています。

記号や数字ではなく、人を見ること。
同質の人で固めるのは楽だが、YESマンだらけになると逆境の際に力を発揮できず壊れて行く。
異質な人も含みながら、ベクトルは同じでプロとして仕事する人が幸せになれる
現場を作ること。
そんな場所が作ることができたらいいなと個人的には思っています。

年明けからは完全に一度リセットして、又新しいことをやることになります。
自分の力を100%使っていこうと思っています。
いままでありがとうございました。
そしてこれからもよろしくお願いします。

面倒な奴

一般的に言われていることとは違うことかもしれないけど、
面倒な奴だなぁと思われるのって悪くはない。

便利で簡単に仕事頼める部下として生きると
実際は重要度が低いようなどうでもいいものが多くまわってくる。
はっきり言えば最悪な状態。

ホウレンソウ大事だっていうけど、
それに時間や気を使いすぎるのは正直無駄。
最低限やればいい。
本当にすべきだと思う時にだけする。
細かいことまでやる人いるけど、上司のほうの時間も無駄に使う
わけだからお互いにとってマイナスだと思う。
それを喜ぶ上司だったら、相当暇な職場なのかもしれない。

面倒な奴だと割り込みのような変な仕事頼みにくいから、
自分のことに集中できる。
やる必要があると思えば当然やるけど、
そう思わなければ自分ではやらない。

空気読むだけで生きていたら、価値のあることはできない。
って昔言われたけど、その意味が時を経るたびにわかるように
なってきた。

使いやすい便利なだけの部下と面倒だけど結果出す部下
実際にはどっちがいいんだろう。
上司の評価は組織の数字が評価対象になることから考えれば
その答えはある程度出るはず。
使いやすくて便利で結果も出す部下がいたとしたら、
便利に使うことでその人の能力を殺してしまっている可能性が高い。

経験上、言うことをきく使いやすい人だけで周りを固めれば
組織は弱っていく。
皆がぶつかるぐらい自分の意見もって考えてやっている組織で
面倒な奴ばかりぐらいのところのほうが結果は出ていた。
それを扱える上司がいることが重要だけど、いいところを消してしまうので色々と口出ししすぎる人はこのポジションには向かない。
基本任せて、きっちり大事なところは外さない人がいい。

面倒な奴がいる組織をコントロールできる管理職って
ほとんどいない。
だから排除する方向に向かう。
ただ結果は出てしまうから評価はせざるを得ないから、
仕事の結果以外のことで評価を下げていく。
その結局、自分の首をしめていることに気づかない人たちは多い。

便利ってのはいいことじゃない。
面倒な奴ってのは常に悪いことじゃない。
結果のためにやっているのなら全然いいこと。
時間には限りがあるんだから、価値あることに時間使わないとと
考えると多少面倒な奴にはなるだろうなと思う。

自分が知っている仕事できる人って安請け合いはしない。
意地でも意味がないことはやらないようにして、
価値があると考えているものに多くの時間を投入する。
当たり前のことのようだけど、これできる人は少ない。

皆が空気を読んでできないことをやると
他の人より少し前に出れるチャンスはある。

現場の管理職

部下が遅くまで残業している時に、がんばってるなと当たり前のように考える人と
残業させてしまってるな。一人に仕事偏ってるのかな。何か問題があるんじゃないかと
考えて行動する人。
どっちが管理職としての仕事をしているのだろう。

SIから見たクラウドの先にあるものは

以下は個人的な考えで叩かれるのもある程度覚悟してコメントしておきます。

クラウドとかいうものを推進していくとどうなるのだろう?
インフラ構築やアプリ構築だとかのパイは大きくなるか、小さくなるか?

同じ価値のものは陳腐化して価格は下がって行く。
何のためにクラウドとかいうものを押し進めようとしているのだろう?
誰にとって価値があることなのだろう?
月日が流れるにつれ、同じ報酬を得るにはより多くの付加価値が必要だと誰かは言っていました。

今ある市場を単純にただリプレースしていけば、今まであった市場規模はトータルで
考えると小さくなる可能性がある。決まった量の食事を皆で取り合う状況で
クラウドという単語を持ち出した場合、単価は上がるか下がるか?さてどっちでしょう。

極端な話をすれば、今インフラ構築や保守だとかで食べている人が食えなくなるかもしれない。
全部が変わって行くなんてことは私は全然思ってないですが、流れは確実にあるでしょう。
新しい市場を自分でつくっていかなければ、身の削り合いに巻き込まれることになる。
其の先に待つのは何でしょう。

色々と考えて行くと業界そのものにこれに限らず自己矛盾に近いものがあるような気がしています。
混乱の中で何が生まれるかという楽しみもあるのですが、確実に血は流れるでしょう。

提供する側から見るか、お客様から見るかで見方は全然違うのですが、
提供する側を外から客観的に見るとこんなことを感じています。