2012年11月14日

[WebSphere]HeapDumpの強制出力

ネタが無いのに無理やり捻り出してみる。

表題にあるように、稼動しているJVMからHeapDumpを取り出したい時ってたまにしょっちゅうありますよね・・・(´-ω-`)エッ?ナイ?

断片化が進んできて連続領域確保できずに、Heapが拡張してしまっているのが
ログから見て取れるのに、HeapDumpからオブジェクトの配置状況をマップして「見える化」するという
果てしなく無駄な作業とか、ありませんか?そうですか。

前置きが長かったですな。
(ええと、以下はIBMのJVMに関しての話です。SUN(現Oracle)についてはちゃうかもしれませんので
各自自習。普通jmapとか使うんじゃないかな)


このHeapDump、普通はOOM(OutOfMemory)発生時にしかでません。オプション、IBM_HEAP_DUMP=trueが入ってないから
kill -3 (QUIT)で出ます、って記事もたまーにありますが、このオプションの説明が
はしょってあるだけです。デフォルトでは出ません。(←ここ、よくハマるので注意)

概ねは これの http://www-01.ibm.com/support/docview.wss?uid=jpn1J1006976 
のとこの動きを見ればいいんでないかな。
要するに、オプション入れとかなきゃ OOM時しか出ません、って話なんだけど

http://publib.boulder.ibm.com/infocenter/javasdk/v6r0/topic/com.ibm.java.doc.diagnostics.60/diag/tools/heapdump_env.html

で、これを設定してないAPPServerのHeapDumpが欲しい今すぐ。設定変更、再起動は許さん!
という「そんなご無体な・・・」「うるさい、今すぐやれあqswでfrgthyじゅきぉ」

と来るのが世の常。Dumpが要求されるような時っていうのは、まぁ大抵トラブル発生中なうな極限状態であることが多いので
普段冷静なお客様や上役達も目の前にブロックを落とされたぐっすんおよよ状態なわけでして。

で、うん、よし落ち着け。
WebSphereのJVMに限って言えば方法はある。だから落ち着け

やり方はwsadminで、該当ASのJVMのmbeanをとってきて
Admincontrolで、generateHeapDumpするだけ。

で、毎回毎回毎回jython書くのも面倒なので、ここに保存しておく

以下のjythonは入力値のASの存在確認をしたのち、heapdumpを出力させる

WASのFPが低いと、ぬるぽが出る既存の問題を踏む可能性がある
http://www-01.ibm.com/support/docview.wss?uid=swg1PK77235

----------


import sys
import os


def task_heapDump(id,asName):

print "APPServer : %s " % asName

NodeName=findNode(asName)
if(NodeName==None):
#don't Enter ...
print "Huh?"
sys.exit(8)

print "Node : %s " % NodeName

jvmbean = AdminControl.queryNames('type=JVM,process=' + asName +',node=' + NodeName + ',*')


print "enter heapdump..."
print ""

AdminControl.invoke(jvmbean, "generateHeapDump")

print ""
print "done."


def findNode(asName):
nodes = AdminConfig.list("Node").splitlines()
for node in nodes:
nodeServers = AdminConfig.list("Server", node).splitlines()
for nodeServer in nodeServers:
sname = AdminConfig.showAttribute(nodeServer, "name")
if sname == asName:
nname = AdminConfig.showAttribute(node, "name")
return nname
return None

if(len(sys.argv) != 1 ):
print "usage : wsadmin.sh -user -password -lang jython -f memDmp.py "
sys.exit(0)



TargetName=sys.argv[0]


Servers=AdminConfig.list("Server")
for sv in Servers.splitlines():
ServerType = AdminConfig.showAttribute(sv,"serverType")
if(ServerType == "APPLICATION_SERVER"):
Cname = AdminConfig.showAttribute(sv,"name")
if(Cname==TargetName):
task_heapDump(sv,Cname)
sys.exit(0)




print "if you see this message, check your input. script can't found APP Server %s " % TargetName


posted by koteitan at 11:45| Comment(0) | TrackBack(0) | WebSphere | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/301757791

この記事へのトラックバック