วันศุกร์, กุมภาพันธ์ 13, 2558

วิธีใช้ Java VisualVM monitor server บน cloud โดยใช้ JMX ผ่าน SSH tunnels


   Java VisualVM หรือ jvisualvm เป็นเครืองมือที่มากับ Oracle JDK เอาไว้ monitor JVM ทำ Profiling java application ของเราได้ ที่สำคัญฟรี 

รายละเอียด Oracle Java VisualVM

   ถ้าเรา monitor ในเครื่องเราเอง มันก็จะเห็น process java ที่เรารันอยู่ในเครื่องเลย ถ้าดูในภาพ จะอยู่ใต้กิ่ง Local ทีนี้หากเราต้องการ monitor อะไรที่มันไม่ได้อยู่ในเครื่องเราล่ะ แบบไปรันอยู่ใน cloud server หรือ server เฉยๆ ก็ได้ เราจะใช้ connection แบบ jmx ในการเชื่อมต่อเข้าไป 


ทำได้โดยการเพิ่ม jvm option เข้าไปเวลาเราจะรัน java command เดิมๆของเรา เช่น 
`
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=4000 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Djava.rmi.server.hostname=my-server-ip -jar my-server.jar 
`
    เวลาเราจะใช้ jvisualvm เข้าไป monitor เราก้อเพิ่ม server ที่เราต้องการเข้าไปใต้กิ่ง Remote แล้วเพิ่ม JMX connection (Add JMX Connection...)  

    เช่น server ผมอยู่ที่ 192.168.33.10 (คนละ IP กับเครื่องผม น่ะนะ) ก็ใส่ตามภาพ 192.168.33.10:4000 ใช้ port ตามที่กำหนดไว้ใน command line ในตอนแรก


    แต่ network เค้าไม่เปิดให้ใช้ port 4000 จะทำไง? พวก server พวกนี้เค้าก็จะไม่เปิด port ให้เยอะแยะ มั่วซั่ว อย่างน้อยเราจะใช้ ssh/puTTY เข้าไปได้ ค้นๆ ไปก็เจอ ว่าเราใช้ ssh tunnel มาช่วยตรงนี้ได้ 

1.
สร้าง sock proxy หรือ ssh tunnel ได้โดยคำสั่งแบบนี้  

$ssh -v -N -D 9999 -p 2225 vagrant@172.16.0.129

9999 เป็น port ที่คุณจะใช้เป็น proxy port 
2225 เป็น ssh port ที่ server ผมเปิดให้ใช้ 
172.16.0.129 เป็น server ที่ไม่สามารถจะใช้ port  4000 ได้ตรงๆ 

หลังจากใส่ password เข้า server ได้แล้ว เราจะต้องเปิด terminal ทิ้งเอาไว้เพื่อให้ proxy มันทำงาน 

  1. ที่ jvisualvm เราจะต้องมาใส่ proxy ให้มัน หากใช้ OSX ให้เปิดผ่านเมนู Preferences> Proxy
แล้วใส่ค่าลงไปใน socks ตามภาพแล้ว 

  2. กลับมา add jmx connection ไปยัง 192.168.33.10 port 4000 อีกครั้ง 
คราวนี้จะเชื่อมได้แล้ว

  ถ้า google เรื่องทำนองนี้ ก็จะเจอหลาย link ของฝรั่ง จะมีอันนี้แหละมั้งที่เป็นภาษาไทย สงสัยหรืออยากแนะนำอะไร hangs out chat มาได้ครับ 

วันพุธ, กุมภาพันธ์ 04, 2558

แก้ปัญหา JRebel ใช้งานไม่ได้ ค้างที่ Contacting myJRebel server ..

วันดีคืนดีหลังจาก upgrade version jrebel จาก version 5 เป็น version 6 จู่ๆ tomcat ก็ start ไม่ขึ้น ต้อง kill process ลูกเดียว วันดีคืนดีมันก็ start ได้ แต่โอกาสคือ 1 ใน X ครั้ง เรียกว่าฟลุ๊คเท่านั้นดีกว่าที่จะ start ได้ มันค้างอยู่ตรง message

...
JRebel-Licensing-myJRebel: Contacting myJRebel server ..
...

  JRebel คืออะไร มันเป็นเครื่องมือตัวหนึ่ง ที่เอามาผูกการทำงานเข้ากับ java container (tomcat, weblogic, websphere ฯ) แล้วทำให้ code ที่เราเขียนจะถูก reload ให้เลย ไม่ต้องสั่ง stop/start container นั้นใหม่ ประหยัดเวลามาก ถึงมากที่สุด

ส่วนวิธีใช้ลองไปศึกษา JRebel พลางๆที่ website ของ JRebel นะครับ

  ผมใช้ jrebel ด้วย license แบบ social license คือเค้าจะขอ tweet สถิติการใช้งาน jrebel ของ account เรา ประมาณว่าประหยัดเวลาให้เราในการ stop/start java container ไปมากเท่าไหร่ โดย license  ทั่วไปหากใช้งานคนเดียว single developer เค้าคิดวันละ 1 USD แต่เก็บเป็นรายปี

เข้าเรื่องดีกว่า วิธีแก้ไข

    ทดลองเปิด debug log โดยใส่ java parameter (JAVA_OPTS) เข้าไป -Xdebug -Drebel.log=debug แล้วไปดู jrebel.log โดยมันจะถูกสร้างเอาไว้ที่ /Users/siritas_s/.jrebel
ก็ยังไม่เจออะไรนอกจากเห็นว่ามันโหลด plugins มากมายเต็มไปหมด (น่าจะเป็น plugin สำหรับให้มัน reload classes ของ framework เจ้าดังๆได้ถูกต้อง)

  และจากที่ไปลองค้นๆอ่านๆใน forum support ของ jrebel เค้าแนะนำให้
* โหลด version nightly มาใช้  หรือ/และ
* ทดลองปิด plugin ทั้งหมดดูก่อน ทำได้โดยการใส่ option rebel.load_embedded_plugins=false ใน jrebel.properties

การปิด plugin ทั้งหมด 
Modify .jrebel/jrebel.peoperties:
...
rebel.load_embedded_plugins=false
...

  เห้ย..ย ได้ผล! jrebel กลับมาใช้งานได้อีกครั้ง วิ่งผ่าน Contacting myJRebel server .. แล้วแสดง banner ได้เหมือนปกติ
...
015-02-04 15:47:53 JRebel:
2015-02-04 15:47:53 JRebel:  #############################################################
2015-02-04 15:47:53 JRebel:
2015-02-04 15:47:53 JRebel:  JRebel Legacy Agent 6.1.0-SNAPSHOT (201502032154)
2015-02-04 15:47:53 JRebel:  (c) Copyright ZeroTurnaround AS, Estonia, Tartu.
2015-02-04 15:47:53 JRebel:
2015-02-04 15:47:53 JRebel:  Over the last 6 days JRebel prevented
2015-02-04 15:47:53 JRebel:  at least 14 redeploys/restarts saving you about 0.6 hours.
2015-02-04 15:47:53 JRebel:
... 

  หลังจากนั้นมาแก้ตัว parameters ที่ใส่ให้ jrebel.jar เพื่อเปิดใช้เฉพาะ plugin ที่ต้องการใช้

ของเดิมของผมเป็นแบบนี้ (คือโหลด plugins ทุกตัวที่ default มาให้)
...
export JAVA_OPTS="-server -Xms512m -Xmx1024m -XX:MaxPermSize=256m \
-Dapple.awt.UIElement=true -Djava.awt.headless=true \
-javaagent:lib/jrebel.jar \
-javaagent:lib/aspectjweaver.jar \
-Xdebug -Drebel.log=false 
... 

ผมใช้ springframework, log4j 1.2 จึงเปลี่ยนเป็นแบบนี้ 
...
export JAVA_OPTS="-server -Xms512m -Xmx1024m -XX:MaxPermSize=256m \
-Dapple.awt.UIElement=true -Djava.awt.headless=true \
-javaagent:lib/jrebel.jar \
-javaagent:lib/aspectjweaver.jar \
-Xdebug -Drebel.log=false \
-Drebel.fsnotify_intellij_plugin=false \
-Drebel.aspectj_plugin=true -Drebel.log4j_plugin=true \
-Drebel.spring_plugin=true -Drebel.tiles1_struts_plugin=true
... 

เท่านี้ก็กลับมาใช้ JRebel ได้เหมือนเดิมแล้ว ^^ blog เป็นภาษาไทยในใจก็คิดว่าจะมีคนไทยซักกี่คนที่ใช้ JRebel เหมือนผมเนี่ย..ย ใครใช้ก็มาแลกเปลี่ยนประสบการการใช้งานกันได้นะ