木曜日, 12月 05, 2013

tomcat5.5/6のJVM RAM周りををcactiで監視する

cactiでRAM周りを監視するまでの備忘録のべまっくす!


【公式マニュアル】
http://docs.oracle.com/javase/jp/1.5.0/guide/management/SNMP.html
http://docs.oracle.com/javase/6/docs/technotes/guides/management/snmp.html


【参照blog】
・トラシスラボ 技術ブログ様
http://trasis.jp/blog/lab/2009/08/snmpでtomcat-メモリを監視-linux編.html

・うまい棒blog様
http://d.hatena.ne.jp/hogem/20121206/1354802392



【作業手順】
① snmp.aclの準備(5.5/6共通)
※パスは環境に合わせて変更してくださいね!

cd /usr/java/j2sdk/jre/lib/management
vi snmp.acl
---
acl = {
    {
        communities = コミュニティ名
        access      = read-only
        managers    = cactiのサーバーIP,自分自身のIPアドレス(なぜかは後述)
        }
    }
---
chmod 600 snmp.acl
chown tomcatを起動するユーザー snmp.acl


② CATALINA_OPTSの設定(5.5/6別)
ファイルや環境変数などで、CATALINA_OPTSに以下を追加する。
5.5はポート番号と、snmp.aclの場所を指定する。6系はinterfaceをさらに追加する。
環境変数に追加するなら、tomcatを起動させるユーザーの.bashrcなどに以下を追加するとよいです。以下は環境変数に突っ込む場合の例(ファイルなら頭のexportは取ってね!)
※tomcat7は未確認だけど、-Dcom.sun.management.snmp.acl.fileの最後の「.file」を取ればいいらしい。

5.5(※1.5.0_22の場合は、下の6用にしないとダメだった・・・なぜか不明)
export CATALINA_OPTS="-Dcom.sun.management.snmp.port=1161 -Dcom.sun.management.snmp.acl.file=/usr/java/j2sdk/jre/lib/management/snmp.acl"

6用
export CATALINA_OPTS="-Dcom.sun.management.snmp.port=1161 -Dcom.sun.management.snmp.acl.file=/usr/java/j2sdk/jre/lib/management/snmp.acl -Dcom.sun.management.snmp.interface=0.0.0.0"


③ tomcatを再起動して、cactiサーバーから手動で叩いてテスト
$ snmpwalk -v 2c -c community server-name:1161 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.101.1.2.2
SNMPv2-SMI::enterprises.42.2.145.3.163.1.1.2.101.1.2.2 = Counter64: 172
$
という感じで取得できた。

④cactiでテンプレートの追加と動作テスト
cactiで、JVMのテンプレートを入れて20分ほど待つ…がデータを引っ張ってこれていない…。
cactiのポーリングのport番号を確認してみる。

Console > Data Templates > JVMのどれか、たとえばjvmThreadCount
を開くと、SNMP Port欄に、確かに1161番が指定されているので大丈夫っぽいけど、
取れない。ということはsnmpデフォルトの161番でアクセスしている可能性が高い。
ので、諦めて1161に転送するsnmpd proxyを設定する。

⑤snmpd proxyの設定
※mibファイルはいらんけど便利なんで入れておく。

cd /usr/share/snmp/mibs
wget http://docs.oracle.com/javase/1.5.0/docs/guide/management/JVM-MANAGEMENT-MIB.mib
vi /etc/snmp/snmpd.conf
proxy -m /usr/share/snmp/mibs/JVM-MANAGEMENT-MIB.mib -v 2c -c community名 サーバー自身のIP:1161 .1.3.6.1.4.1.42.2.145
/etc/init.d/snmpd reload

⑥proxyの確認
cactiサーバーから、161番でJVMに関するデータが取れるか確認する。
$ snmpwalk -v 2c -c community server-name .1.3.6.1.4.1.42.2.145.3.163.1.1.2.101.1.2.2
SNMPv2-SMI::enterprises.42.2.145.3.163.1.1.2.101.1.2.2 = Counter64: 390
$
取れた(ここでauthorizationErrorが出て取れない場合は、snmp.aclに自分自身のIPを追加していない可能性が高い) 。で、cactiを見てみると…無事取れている。
cactiの「SNMP port」設定で、1161が指定されているのに161で問い合わせにいくとはこれいかに。

参考画像…このポート指定がなぜ効かないのか…は今後考える(笑)




⑦正常性確認

tomcatを何度か立ち上げ直してみる。
/etc/init.d/tomcat start
/etc/init.d/tomcat stop
どちらも正常に立ち上がって、エラーが出ずに止まること。tomcat.pidを作っておきながら立ち上がらないとか、大量のエラーを吐いて止まるときは、だいたいCATALINA_OPTSが間違えている。



【番外編:トラブルシュート】

$ snmpwalk -v 2c -c community tomcat-server:1161 .1.3.6.1.4.1.42.2.145
Error in packet.
Reason: authorizationError (access denied to that object)
$
 → 原因 snmp.aclのmanagersにアクセス元が含まれていない可能性があります。


$ snmpwalk -v 2c -c community tomcat-server .1.3.6.1.4.1.42.2.145
SNMPv2-SMI::enterprises.42.2.145 = No Such Object available on this agent at this OID
$
 → 原因 tomcatのsnmpにアクセスできていない可能性があります。


$  snmpwalk -v 2c -c community tomcat-server .1.3.6.1.4.1.42.2.145
Timeout: No Response from tomcat-server
$
 → 原因 CATALINA_OPTSで、snmp.acl.fileが正しく指定できていない可能性があります。


$/etc/init.d/tomcat stop
// snip
Dec 4, 2013 08:05:23 AM org.apache.catalina.startup.Catalina stopServer
致命的: Catalina.stop:
java.net.ConnectException: Connection refused
...
 → 原因 Dcom.sun.management.snmp.portで指定したポートが、他のサービスで既に利用中なため立ち上げられなかったようです。他のポートを指定しましょう。



終わり

水曜日, 12月 04, 2013

DELLサーバーの温度をcactiで監視する

DELLのサーバーはsensorsが使えない感じ(少なくともR410/R710はだめだった)で、omreportからの数値をcactiに反映させてみる。

参照元ブログは、0からテンプレートを作るブログで、cactiはほぼここのコピペです、ありがとうございます!


参照元:Sunny.st,様『[Tech]CactiでCPUの温度をグラフ化』
http://blog.aburami.net/archives/55376657.html




【snmpでDELLサーバーの温度を取得できるまで】
※omreportをインストールしてから進めてくださいね!
※取得スクリプトを/infra/bin/というフォルダを切って、そこに置いています。
※ちなみに、素のomreport chassis tempsはこんなのが出てます。
※omreportはバージョンや入れ方によって異なる(/usr/bin/omreportとか)もあるので、適宜パスは変えてください。
# /opt/dell/srvadmin/bin/omreport chassis temps index=0
Temperature Probes Information
------------------------------------
Main System Chassis Temperatures: Ok
------------------------------------
Index                     : 0
Status                    : Ok
Probe Name                : System Board Ambient Temp
Reading                   : 22.0 C
Minimum Warning Threshold : 8.0 C
Maximum Warning Threshold : 42.0 C
Minimum Failure Threshold : 3.0 C
Maximum Failure Threshold : 47.0 C
#

以下作業履歴!

mkdir -p /infra/bin/
vi /infra/bin/temperatures.sh

#!/bin/sh
/opt/dell/srvadmin/bin/omreport chassis temps index=0|grep Reading|awk '{print $3}'

chmod 755 /infra/bin/temperatures.sh

vi /etc/snmp/snmpd.conf

### extend ###
extend temperatures /infra/bin/temperatures.sh

/etc/init.d/snmpd reload
※注意 新規はreloadでいいんですが、extendの設定変更はreloadでは反映されない場合があるので、restart推奨

確認
cactiがインストールされているサーバーで手動で取得する。

$ snmpwalk -v 2c -c community 対象サーバー 'NET-SNMP-EXTEND-MIB::nsExtendOutputFull."temperatures"'
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."temperatures" = STRING: 22.0
$

22度っす。
ここまでの作業で温度が取得できるようになりましたん。



【cactiにカスタムデータでグラフを出す】

Cactiの管理画面から、各種テンプレートを作成していきまーす!


まずは Console > Data Templatesを開き、Addボタンを押しましょう。
Data Templates 入力画面
---
Templates name   : DELL OM - temperatures
Data Source name : |host_description| - DELL OM - temperatures
Data Input Method : Get SNMP Data
Associated RRA's : Hourlyだけ除外する。
Internal Data Source Name : SystemBoard_Temp
---
入力したら、「SAVE」ボタンを押しましょう。


Data Templatesを保存すると縦に伸びて、下の方にCustom Data欄が出てきますので、
OIDを入力しましょう。
Custom Data入力画面
---
OID : NET-SNMP-EXTEND-MIB::nsExtendOutputFull."temperatures"
---

次にグラフのテンプレートを作成しまーす。
Console > Graph Templatesを開き、Addボタンを押しましょう。
Graph Templates 追加画面
---
Template name : DELL OM - temperatures
Graph Template Title : |host_description| - DELL OM - temperatures
Vertical Label (--vertical-label) : Temperatures
---
入力したら、「SAVE」ボタンを押しましょう。


そのままの画面で、「Graph Template Items」 #1 追加画面
---
Data Source : DELL OM - temperatures - (SystemBoard_Temp) を選択
Color : 適当なものを選択
Graph Item Type : AREAを選択
Text Format : SystemBoard_temperatures
---

そのままの画面で、「Graph Template Items」 #2 追加画面
---
Data Source : DELL OM - temperatures - (SystemBoard_Temp) を選択
Color : None
Graph Item Type : GPRINTを選択
Consolidation Function : LAST を選択
Text Format : Current:
---

そのままの画面で、「Graph Template Items」 #3 追加画面
---
Data Source : DELL OM - temperatures - (SystemBoard_Temp) を選択
Color : None
Graph Item Type : GPRINTを選択
Consolidation Function : AVERAGE を選択
Text Format : Average:
---

そのままの画面で、「Graph Template Items」 #4 追加画面
---
Data Source : DELL OM - temperatures - (SystemBoard_Temp) を選択
Color : None
Graph Item Type : GPRINTを選択
Consolidation Function : MAX を選択
Text Format : Maximum:
---

この状態でsaveして、サーバーからテンプレートを割り当ててーの、20分後にできた画面がこちらです。

週間グラフはデータが少なくてまだできてないけど、snmpwalkで取得したデータ(22度)と同じで、問題なし!


【cactiで監視する】

このOMの場合、サーバーがアラートを出すMaximum Warning Thresholdが、
42度になっているようなので、
監視は40度とか、30度後半にしておくと、サーバーからアラートが出る前に
検知することが可能ですね。

36度の人肌あたりの監視でどう???



終わり。





火曜日, 12月 03, 2013

tomcat 5.5系 pidfileにプロセス番号が書かれない!けど解決した件


【概要】
/etc/init.d/tomcatからtomcatを立ち上げても、pidファイルにプロセス番号が書き込まれないので困っていた。
けど調査後解決したので、備忘録を書いてみる(日本人なので結論は最後に)。

※ここはtomcat5系のスタートアップの話でして、jsvcの話は出てきません、あしからず。




【tomcatがpidfileにプロセス番号を書き込むまで】

  • /etc/init.d/tomcatが、"/usr/local/tomcat/bin/startup.sh" または"/usr/local/tomcat/bin/catalina.sh start"を起動する。
  • startup.shは"catalina.sh start"を起動する。
  • catalina.shの第一引数がstartの場合、

285行目 elif [ "$1" = "start" ] ; then
に飛び、さらに304~306行目、または316~318行目の
if [ ! -z "$CATALINA_PID" ]; then
   echo $! > $CATALINA_PID
fi
にて、もし、$CATALINA_PIDが宣言されていれば、$!(特殊変数で、バックグラウンドで実行された直前のプロセスのプロセス番号)を$CATALINA_PIDに書き込む。

という流れ。




【試行錯誤】
$CATALINA_PIDが必要なので、/etc/init.d/tomcatに、以下のような環境変数のエクスポートを追加した。
prog=tomcat
CATALINA_PID="/var/run/${prog}.pid"
export CATALINA_PID
user=abc
script=/usr/local/tomcat/bin/startup.sh
su - ${user} -c ${script}
または
daemon --pidfile ${CATALINA_PID} --user ${user} ${script} start

これで行けると思いきや、書き込まれなかった。
そこでcatalina.shの上記if文に、変数があろうがなかろうが書き込めるように書いてみたところ…
if [ ! -z "$CATALINA_PID" ]; then
   echo $! > $CATALINA_PID
fi
echo $! > /var/run/tomcat.pid
無事書かれた! なんだよー環境変数かよー!
/etc/init.d/tomcatにexport CATALINA_PID書いてたじゃん!!!
と、自分のスクリプトを見直してみると…
user=abc
su - ${user} -c ${script}
または
daemon --pidfile ${CATALINA_PID} --user ${user} ${script} start
と、スクリプトを立ち上げたユーザーとは別のユーザーtomcatを立ち上げていたんですね。
とすれば必要なことは2つ。スタートアップスクリプトで、tomcatを立ち上げるユーザー権限で/var/run/tomcat.pidを用意するのと、tomcatを立ち上げたいユーザーのenvに
CATALINA_PID=/var/run/tomcat.pid
が見られる状態にすれば大丈夫。今回は立ち上げユーザーの.bashrcに直接書いてみた。
---
export CATALINA_PID="/var/run/tomcat.pid"
---

※いろんなブログを見て回ると、/etc/init.d/tomcatで
「pgrep -f tomcat > $CATALINA_PID」なんてやって直接書いているのも散見したけど、
たぶんこの「別ユーザーで立ち上げてからの環境変数がない問題」なのかなー、と思ってます。



【結論】
tomcatをスタートアップスクリプトで立ち上げて、pidfileにプロセス番号が書かれないときは、以下2つを確認すること。


  • スタートアップスクリプトで、pidfileを用意してあげること(以下例。用意しないと権限エラー)。
        touch ${CATALINA_PID}
        chown ${user}:${user} ${CATALINA_PID}
  • tomcatを立ち上げるユーザー(もしくは全ユーザーとかなんでもいいけど)の環境変数に
export CATALINA_PID="/var/run/tomcat.pid"
       を書く(必要ならCATALINA_OPTSも。用意しないと書かれない)。




【悩み:tomcatと/etc/rc.d/init.d/functionsのdaemonの間柄】

/etc/init.d/tomcatから、
「daemon --pidfile ${CATALINA_PID} --user ${user} ${script} start」
で立ち上げ
「daemon --pidfile ${CATALINA_PID} --user ${TOMCAT_USER} ${TOMCAT_SCRIPT} stop」
で落とそうと思ったけど、上がるけど、落とすときがうまくない。
なんで?と思っているけど、未調査なので、現状startup/shutdownを使っています。



end

月曜日, 12月 02, 2013

Docomo SPモードメールが、googlegroupsでバウンスになってしまう理由と対策

DocomoのSPモードでなりすましメールを拒否していると、googlegroups.comなどのメーリングリスト(以下ML)は、なりすましメールと判断され、正しく設定しないと、MLのメールは、バウンス(宛先不明)になってしまうことがあります。

cf.
https://www.nttdocomo.co.jp/info/spam_mail/measure/domain/setting/spmode/


SPモードメールのフィルターは、
  • なりすましメール拒否時に動く宛先指定でのフィルター「ステップ3 宛先指定受信」
  • なりすましメールとは関係なく動くドメインごとのフィルター「ステップ4 受信設定」
の2種類あり、「宛先指定受信」でMLのアドレスを指定するか、「受信設定」で@googlegroups.comを加えると受信できるようです。

しかし、どうやら「受信設定」のドメイン単位だけで許可すると、googlegroups.comからのメールを受信できても、サーバーには宛先不明のメールを返すらしく、バウンス判定されることがあります
…たぶん、「ステップ4 受信設定」は、ステップ3の処理が先に走り、なりすましフィルターがなりすましと判断して、サーバーに宛先不明を通知する(結果googlegroupsはバウンス認定)。そのあとステップ4の受信設定でドメイン指定で許可したドメインのメールを受信する。そのため、受信できていながらもバウンス認定されている罠・・・ねっていうプログラム

そのままにしておくと、googlegroupsは宛先不明には送信しなくなるので、「ステップ3 宛先指定受信」に、参加しているMLのアドレスを書きましょう。

[@googlegroups.comのメールを、Docomo SPモードメールで受信する]

・SPメール > メール設定 > その他 > メール全般の設定 > 2.迷惑メール対策設定 > 「詳細設定」を選択。
・SPモードパスワードを入力。
・受信/拒否設定で設定を選択して、「次へ」を選択。
・「ステップ3 宛先指定受信」を選択。
・MLのアドレスを入力する。