Had to do some profiling and there are a bunch of articles strewn across everywhere, so thought I would help the cause for people trying to find them.
Props to Mriddle: http://rukuro-blog.heroku.com/2011/07/26/running-visualvm-through-an-ssh-tunnel
Another good article by Neil Figg: http://neilfigg.blogspot.com/2011/07/remote-jvm-profiling-on-amazon-ec2.html
I didn’t use Neils because I didn’t need to go deeper in my profiling at this stage. I ran into a bunch of gotchas which Mriddle helped with and some comments:
1. Create an SSH tunnel and make visual VM proxy through that:
– sudo ssh -i .ssh/yourkeyfileifyougotone.pem -D 9696 your.ip.goes.here
(options to add to jvisualvm)
-J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true)
2. Command to check if jstatd is listening:
sudo netstat -nlp | grep jstatd
3. Look at startup command for tomcat
ps aux | grep tomcat
4. VisualVM looks at temp directories for process info, so make sure that you start jvisualvm and specify the proper temp dir (you can see it from step #3):
(option to add to jvisualvm)
-J-Djava.io.tmpdir=/opt/tomcat7/temp
Things that I read but didn’t work/didn’t try:
1. Make sure the java bin you are using matches that on the remote server. Apparently, there is a difference between the jre java bin and jdk java bin.
2. Open the proper ports after your instance comes up on EC2. Since jstatd picks a random port, you need to add the port to your security policy.
ec2-authorize <security_group> -p <port> -s <your ip>
My env on EC2:
OpenJDK Runtime Environment (IcedTea6 1.11.4) (amazon-52.1.11.4.46.amzn1-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
Linux version 3.2.12-3.2.4.amzn1.x86_64 (mockbuild@gobi-build-31003) (gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) )
Apache Tomcat/7.0.23
Locally:
VisualVM: 1.6.0_33 (Build 110613); platform 110613-unknown-revn
Mac OS X (10.7.4) , x86_64 64bit
1.6.0_33; Java HotSpot(TM) 64-Bit Server VM (20.8-b03-424, mixed mode)