近日毛肋,由于有個(gè)java服務(wù)CPU占用異常高怨咪,所以需要遠(yuǎn)程監(jiān)控看看問(wèn)題。最簡(jiǎn)單的解決方案就是使用自帶的jconsole润匙,于是開(kāi)始踩坑诗眨。
jconsole使用的是java的jmx(Java manage extension)組件,本地可以直接attach進(jìn)程孕讳,但是默認(rèn)無(wú)法遠(yuǎn)程連接匠楚。查閱資料后發(fā)現(xiàn),啟用jmx遠(yuǎn)程功能(remote jmx)需要添加jvm參數(shù)厂财,大致是下面這樣(idea里面配置參數(shù)需要?jiǎng)h掉末尾\
)
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.port=5000 \
-Dcom.sun.management.jmxremote.rmi.port=5000 \
-Dcom.sun.management.jmxremote.host=0.0.0.0 \
-Djava.rmi.server.hostname=0.0.0.0
本地先測(cè)試芋簿,IDEA添加參數(shù),運(yùn)行蟀苛,打開(kāi)jconsole連接127.0.0.1:5000益咬,一切順利,準(zhǔn)備發(fā)版帜平。
由于我們使用docker實(shí)現(xiàn)完整的CI流程幽告,所以jvm參數(shù)需要放在環(huán)境變量BPE_APPEND_JAVA_TOOL_OPTIONS
里面。配置好后發(fā)版裆甩,遠(yuǎn)程連接冗锁,連接失敗。
這是為什么呢嗤栓?我首先開(kāi)始懷疑是不是網(wǎng)絡(luò)沒(méi)連接上冻河,但是鑒于有提示ssl加密連接失敗,應(yīng)該是連接上了的茉帅。開(kāi)了大鯊魚(yú)(wireshark)之后確認(rèn)網(wǎng)絡(luò)連接成功叨叙,是其他原因?qū)е碌倪B接失敗。
這是為什么呢堪澎?繼續(xù)查資料擂错,發(fā)現(xiàn)有的人hostname會(huì)配置成其他的,猜測(cè)是hostname的問(wèn)題樱蛤。由于線上服務(wù)器用了k8s钮呀,ip是變化的,所以用自己電腦嘗試昨凡。本地把hostname改成本地ip爽醋,然后用同事電腦連接,連接成功便脊,問(wèn)題解決蚂四。
開(kāi)啟jmx遠(yuǎn)程功能只需要下面幾行代碼即可:
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.port=5000 \
-Dcom.sun.management.jmxremote.rmi.port=5000 \
-Djava.rmi.server.hostname=服務(wù)器ip或域名
動(dòng)態(tài)ip可以使用本地域名,比如hello.local
,需要連接的時(shí)候修改本地hosts即可证杭。