|
|
YOUR FEEDBACK
SOA World Conference
Virtualization Conference $200 Savings Expire May 16, 2008... – Register Today!
SYS-CON.TV |
TOP LINKS YOU MUST CLICK ON Features
Debugging and Profiling with Eclipse, Jetty, and Tomcat
I like to run my web container from the command line rather than from the IDE
By: Sujit Pal
Mar. 13, 2008 03:45 PM
Digg This!
Page 3 of 3
« previous page
Remote Profiling Tomcat apps Information from this comes from this profiling java blog post, which has a link to a Eclipse-TPTP setup Howto on Windows XP, which I adapted for my use. TPTP needs a client component to be installed in the Eclipse IDE (the TPTP plugin), and an agent component RAServer which mediates between the performance data from the Tomcat server and the Eclipse TPTP client. Huge amounts of profiling data are transferred as XML documents, so using this from a remote (not localhost) client is very slow. Therefore, three things need to be setup to use TPTP to profile remote apps under Eclipse. First, we need to download the TPTP plugin. If you are using a recent version of Eclipse (I am using 3.3.1.1) then you can get the plugin from the Europa Discovery Site. Simply click on "Help > Software Updates > Find and Install > Search for new features to install", then select the Performance and Monitoring features and click on "Select Required". This will download the TPTP plugin to your IDE. Restart your IDE to see the Profile icon on the toolbar, and "Run > Profile..." entries in your menu. The complete procedure is explained in detail in the Installing TPTP using Update Manager page. Second, we need to install the agent component. This is available as a separate download for the particular architecture and operating system from the TPTP home page (scroll down to Agent Controller). Here is a link to the one I used. Setting this up was easy, but not totally straightforward. The first step is to unzip the download into /opt/tptpdc-4.1.0, then set up the following environment variables in your ~/.bash_profile and source it. Here is the snippet from my ~/.bash_profile file. # TPTP settings export RASERVER_HOME=/opt/tptpdc-4.1.0 export PATH=$RASERVER_HOME/bin:$PATH export LD_LIBRARY_PATH=$RASERVER_HOME/lib:$LD_LIBRARY_PATH We then need to navigate to $RASERVER_HOME/bin, then run SetConfig.sh (the very first time only) to set up the XML file for RAServer to work. Then from the same directory, we need to start the server using RAStart.sh (the corresponding stop script is RAStop.sh in the same directory). However, when I ran the RAStart.sh script, I discovered that there were missing libraries on my Fedora Core 7 system. To fix that, I had to download the libstdc++ compatibility RPM from the RPMFind page and install it using the following command: $ sudo rpm -ivh compat-libstdc++-296-2.96-138.i386.rpm Finally, we need to set up the JAVA_OPTS environment variable in the $CATALINA_HOME/bin/setenv.sh file, like so. Also, since we are starting Tomcat with the profiling instrumentation enabled, I found that it would complain about missing libraries, which went away after I added the RASERVER_HOME paths to PATH and LD_LIBRARY_PATH to the setenv.sh file. # /opt/apache-tomcat-5.5.25/bin/setenv.sh export RASERVER_HOME=/opt/tptpdc-4.1.0 export PATH=$RASERVER_HOME/bin:$PATH export LD_LIBRARY_PATH=$RASERVER_HOME/lib:$LD_LIBRARY_PATH export JAVA_OPTS="-XrunpiAgent:server=enabled" To start using profiling, I deployed the web application to Tomcat, started RAServer, then started Tomcat. On the Eclipse side, I built a Profiling Launch configuration by clicking "Run > Profile", then right-clicking New on "Attach to Agent" on the left pane of the resulting dialog. Here are the settings for my IDE.
Once this is done, switch to the profiling perspective. If the agent has been discovered, Eclipse will attach to it and start collecting statistics. Since a web app's job is to serve pages, what I do is to aim a URL generating script at the application. Here is an example of a Python script that reads a list of URLs from a text file and hits the app with the URLs. #!/usr/bin/python
# Simple harness to run the URLs from the systemtesturls.txt manually
import sys
import string
import httplib
import time
def usage():
print "Usage:" + sys.argv[0] + " www.myhost.com:80 /path/to/urllist"
sys.exit(-1)
def main():
if (len(sys.argv) != 3):
usage()
host = sys.argv[1]
urllist = open(sys.argv[2], 'r')
totaltime = 0
maxtime = 0
mintime = 0
lno = 0
okresults = 0
badresults = 0
while 1:
urlline = urllist.readline()
if (not urlline):
break
if (urlline.startswith("#")):
continue
lno = lno + 1
testurl = string.rstrip(urlline)
print "Testing (" + str(lno) + "): " + testurl
start = time.clock()
conn = httplib.HTTPConnection(host)
conn.request("GET", testurl)
resp = conn.getresponse()
status = resp.status
if (status == 200):
okresults = okresults + 1
else:
badresults = badresults + 1
print "Error:", status, resp.reason, str(lno)
data = resp.read()
conn.close()
stop = time.clock()
elapsed = stop - start
if (elapsed < mintime):
mintime = elapsed
if (elapsed > maxtime):
maxtime = elapsed
totaltime = totaltime + elapsed
urllist.close()
print "quality results, Ok=" + str(okresults) + ", Once the script completes, you can stop the profiling. I was able to generate three reports from it - Execution Statistics, Memory Statistics and Coverage Statistics. Of these, I found the Execution statistics the most useful since it told me how many times a method was called, and what processing time on average was spent in each of these methods. Undoubtedly I will find more use for the other reports in the future, but for the moment I am happy to have profiling working under Eclipse. Update Feb 16 2008 I was able to profile using Maven's Jetty plugin as well recently. Instead of setting the string "-XrunpiAgent:server=enabled" to JAVA_OPTS, we just set it to MAVEN_OPTS instead, then run mvn -o jetty6:run. The RASERVER_HOME, LD_LIBRARY_PATH and PATH setting also needs to be in there for the agent to work correctly. So my new improved jetty.sh now looks like this: #!/bin/bash
BASE_MAVEN_OPTS="-Xmx2048m"
DEBUG_MAVEN_OPTS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjwdb:transport=dt_cket,address=8781,server=y,suspend=n"
PROFILE_MAVEN_OPTS="-XrunpiAgent:server=enabled"
case $1 in
'debug')
MAVEN_OPTS=$BASE_MAVEN_OPTS" "$DEBUG_MAVEN_OPTS
;;
'profile')
export RASERVER_HOME=/opt/tptpdc-4.1.0
export PATH=$RASERVER_HOME/bin:$PATH
export LD_LIBRARY_PATH=$RASERVER_HOME/lib:$LD_LIBRARY_PATH
MAVEN_OPTS=$BASE_MAVEN_OPTS" "$PROFILE_MAVEN_OPTS
;;
*)
MAVEN_OPTS=$BASE_MAVEN_OPTS
;;
esac
export MAVEN_OPTS
mvn -o jetty6:run
To start a normal session, I just call jetty.sh, for debugging and profiling, I call jetty.sh debug and jetty.sh profile respectively. On the Eclipse side, I create a profile configuration in the same way as for Tomcat, by attaching the profiling client to the running Java application. The RAServer detects the Java app that is exposing profiling information, and automatically discovers it. Page 3 of 3 « previous page
LATEST ECLIPSE STORIES . . .
SUBSCRIBE TO THE WORLD'S MOST POWERFUL NEWSLETTERS SUBSCRIBE TO OUR RSS FEEDS & GET YOUR SYS-CON NEWS LIVE!
|
SYS-CON FEATURED WHITEPAPERS MOST READ THIS WEEK |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||