IBM Support

WebSphere Application Server Performance Tuning Toolkit

How To


Summary

The WebSphere Application Server Performance Tuning Toolkit (PTT) is an Eclipse-based GUI tool to access live Traditional WebSphere Application Server (tWAS) Performance Monitoring Infrastructure (PMI) data. The tool is provided as is without any warranty or support.

Steps

  1. Download:
    1. Windows: https://public.dhe.ibm.com/software/websphere/appserv/support/tools/ptt/com.ibm.ptt-win32.win32.x86_64_V1.0.20200908.zip
    2. Linux: https://public.dhe.ibm.com/software/websphere/appserv/support/tools/ptt/com.ibm.ptt-linux.gtk.x86_64_V1.0.20200908.tar.gz
    3. macOS: https://public.dhe.ibm.com/software/websphere/appserv/support/tools/ptt/com.ibm.ptt-macosx.cocoa.x86_64_V1.0.20200908.tar.gz
      1. Before extracting, open Terminal and run: xattr -d com.apple.quarantine com.ibm.ptt-macosx*
  2. Ensure Java 8 (64-bit) is on your PATH or create a "jre" directory under the PTT folder and copy a Java installation into it. Java 11 or higher will not work.
  3. Start PTT by double clicking on ptt.exe/ptt/Eclipse.app, or from the terminal to show console output:
    1. Windows: ptt.exe
    2. Linux: ./ptt
    3. macOS: ./Eclipse.app/Contents/MacOS/ptt
  4. Click add a new host and provide the details of the deployment manager or application server, including its SOAP port.
  5. Select the host and click connect to selected host.
  6. Click yes to monitor all servers.
  7. In the topology view, click the target server and click open monitor page.
  8. The PMI data will update live, approximately every 60 seconds or so.

Additional Information

Important Notes
  1. PTT is provided as is without any warranty or support.
  2. There is a self-placed lab that has PTT installed: WebSphere Application Server Troubleshooting and Performance Lab on Docker.
  3. Note that tuning assistance is not in the scope of IBM support. If you need tuning assistance, please contact your IBM account representative to set up a paid services engagement with a skilled performance tuning resource.
Revision History
  • V1.0.20200908
    • Fix report generation.
    • Fix preference retrieval.
  • V1.0.20200728
    • Add error details to connection exceptions.
    • Add support for an optional -Dinsecure=true option that avoids "peer not authenticated" and hostname verification errors when the normal solutions are difficult or infeasible.
  • V1.0.20200701_2
    • Fix error on Windows: javax.net.ssl.SSLException: SSLSocketFactory is null. This can occur if javax.net.ssl.SSLSocketFactory.getDefault() is called to create a socket and javax.net.ssl.* properties are not set.
    • Set -Dcom.ibm.ssl.evaluateHost=false by default
  • V1.0.20200630_4
    • Allow using OpenJDK in addition to IBM Java
  • V1.0.20200629
    • Make debugging easier
  • V1.0.20200624
    • Create 64-bit builds for Windows, Linux, and macOS on top of a more modern Eclipse 2020-06.
Diagnostics
If you have a problem, perform the following steps to gather diagnostics:
  1. On Windows, copy ptt.ini to eclipse.ini and edit eclipse.ini. On Linux, edit ptt.ini. On macOS, edit Eclipse.app/Contents/Eclipse/ptt.ini:
    1. Change the following line:

      -Dorg.apache.soap.debug=false

      To this:

      -Dorg.apache.soap.debug=true
       
    2. Change the following line:

      -Djavax.net.debug=

      To this:

      -Djavax.net.debug=all
       
  2. Edit TraceSettings.txt (on macOS, Eclipse.app/Contents/Eclipse/TraceSettings.txt):
    1. Change the following line:

      #*=all=enabled

      To this:

      *=all=enabled
       
  3. Open a command prompt or terminal and start PTT as follows:

    Windows:
    C:\Users\name\> cd Downloads\PTT
    C:\Users\name\Downloads\PTT> .\eclipsec.exe -debug -consoleLog > ptttrace.log 2>&1

    macOS:
    % cd Downloads/PTT/Eclipse.app/Contents/MacOS
    % ./ptt -debug -consoleLog > ptttrace.log 2>&1

    Linux:
    $ cd Downloads/PTT
    $ ./ptt -debug -consoleLog > ptttrace.log 2>&1
  4. Reproduce the problem and close PTT
  5. Send ptttrace.log and adminclient.log (on macOS, the files are in ./Eclipse.app/Contents/MacOS/)
Known Issues
  1. Symptom:
    [SOAPException: faultCode=SOAP-ENV:Client; msg=Error making SOAP call: java.net.SocketException: java.lang.ClassNotFoundException: com.ibm.websphere.ssl.protocol.SSLSocketFactory; targetException=java.lang.IllegalArgumentException: Error making SOAP call: java.net.SocketException: java.lang.ClassNotFoundException: com.ibm.websphere.ssl.protocol.SSLSocketFactory]

    Solution 1: Launch PTT with IBM Java 8 64-bit (see #4 below)

    or

    Solution 2:
    2a. Edit ptt.ini (on macOS, Eclipse.app/Contents/Eclipse/ptt.ini)
    2b. Add to the bottom and replace PTTDIRECTORY with the absolute path to the PTT installation directory (on macOS, .../Eclipse.app/Contents/Eclipse/):

    -Djava.security.properties=PTTDIRECTORY/securityoverride.properties
    -Djavax.net.ssl.keyStore=PTTDIRECTORY/DummyClientKeyFile.jks
    -Djavax.net.ssl.keyStorePassword=WebAS
    -Djavax.net.ssl.trustStore=PTTDIRECTORY/DummyClientTrustFile.jks
    -Djavax.net.ssl.trustStorePassword=WebAS
     
  2. Symptom:
    [SOAPException: faultCode=SOAP-ENV:Client; msg=Error making SOAP call: javax.net.ssl.SSLException: hostname in certificate didn&apos;t match: &lt;127.0.0.1&gt; != &lt;localhost&gt;; targetException=java.lang.IllegalArgumentException: Error making SOAP call: javax.net.ssl.SSLException: hostname in certificate didn't match: <localhost> != <myserver>]

    Solution 1: Edit the host in PTT and change the Hostname to what is specified in the second set of <>'s in the error message above (in this example, myserver).

    or

    Solution 2: If you're willing to run without hostname verification, edit ptt.ini (on macOS, Eclipse.app/Contents/Eclipse/ptt.ini) and add:
    -Dinsecure=true
  3. Symptom:
    Caused by: [SOAPException: faultCode=SOAP-ENV:Client; msg=Error making SOAP call: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated; targetException=java.lang.IllegalArgumentException: Error making SOAP call: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated]

    Solution 1: Download the certificate from WAS and add it to PTT's trust store (DummyClientTrustFile.jks). The DummyClientTrustFile.jks is in a subdirectory of PTT such as configuration/org.eclipse.osgi/bundles/5/1/.cp/etc/. Example importing on POSIX-based systems (replace localhost:8880 with your WAS host and SOAP port):

    echo -n | openssl s_client -connect localhost:8880 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > was.cert
    keytool -importcert -alias "was" -file was.cert -keystore DummyClientTrustFile.jks -storepass WebAS

    or

    Solution 2: If you're willing to run without certificate verification, edit ptt.ini (on macOS, Eclipse.app/Contents/Eclipse/ptt.ini) and add:
    -Dinsecure=true
  4. For various connection issues, it may help for PTT to run with IBM Java instead of Oracle/OpenJDK/HotSpot/OpenJ9:
    1. On Windows, download IBM Java 8 64-bit from here: https://www.ibm.com/support/pages/java-sdk-downloads and then extract it and copy the JDK folder into the PTT folder and then rename it to jre and restart
  5. To connect using TLS 1.2, follow the instructions for configuring administrative clients: https://www.ibm.com/support/knowledgecenter/SSAW57_9.0.0/com.ibm.websphere.nd.multiplatform.doc/ae/tsec_config_strictsp300.html. PTT dynamically generates files in a directory under the installation folder after the first connection is attempted. For example: configuration/org.eclipse.osgi/bundles/5/1/.cp/etc/. The TLSv1.2 changes are only needed in the ssl.client.props file.
  6. Symptom:
    java.lang.NoClassDefFoundError: org.omg.CORBA.UserException
        at java.base/java.lang.ClassLoader.defineClassImpl(Native Method)
        at java.base/java.lang.ClassLoader.defineClassInternal(ClassLoader.java:481)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:442)
        at org.eclipse.osgi.internal.loader.ModuleClassLoader.defineClass(ModuleClassLoader.java:294)
        at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.defineClass(ClasspathManager.java:718)
        at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findClassImpl(ClasspathManager.java:641)
        at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClassImpl(ClasspathManager.java:609)
        at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClassImpl(ClasspathManager.java:589)
        at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:568)
        at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:346)
        at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:398)
        at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:477)
        at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:171)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:1083)
        at com.ibm.ISecurityUtilityImpl.PasswordUtil.decode(PasswordUtil.java:202)
        at com.ibm.ws.ssl.config.SSLConfig.decodePassword(SSLConfig.java:436)
        at com.ibm.websphere.management.AdminClientFactory.decodePasswordsAndExpandVariables(AdminClientFactory.java:1355)
        at com.ibm.websphere.management.AdminClientFactory.loadPropertiesFromFile(AdminClientFactory.java:1229)
        at com.ibm.websphere.management.AdminClientFactory.access$1(AdminClientFactory.java:1213)
        at com.ibm.websphere.management.AdminClientFactory$2.run(AdminClientFactory.java:392)
        at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:63)
        at com.ibm.websphere.management.AdminClientFactory.createAdminClientPrivileged(AdminClientFactory.java:390)
        at com.ibm.websphere.management.AdminClientFactory.access$0(AdminClientFactory.java:228)
        at com.ibm.websphere.management.AdminClientFactory$1.run(AdminClientFactory.java:210)
        at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:63)
        at com.ibm.websphere.management.AdminClientFactory.createAdminClient(AdminClientFactory.java:206)
        at com.ibm.perf.data.collector.DataCollector.doConnect(DataCollector.java:1868)
        at com.ibm.perf.ui.Controller.connectToHost(Controller.java:186)
        at com.ibm.perf.ui.handlers.ConnectToHostHandler$1.run(ConnectToHostHandler.java:58)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
    Caused by: java.lang.ClassNotFoundException: org.omg.CORBA.UserException cannot be found by com.ibm.ptt.plugin_0.1.0.qualifier
        at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:516)
        at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:171)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:1083)

    Solution: This is caused by Java >= 11. Instead, use Java 8. Hopefully one day we can get newer versions of Java to work.

Contact
For details, contact Kevin Grigorenko (kevin.grigorenko@us.ibm.com).

Document Location

Worldwide

[{"Business Unit":{"code":"BU053","label":"Cloud & Data Platform"},"Product":{"code":"SSEQTP","label":"WebSphere Application Server"},"ARM Category":[{"code":"a8m50000000L2DEAA0","label":"PMI"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Version(s)","Line of Business":{"code":"LOB15","label":"Integration"}}]

Document Information

Modified date:
20 January 2021

UID

ibm16205945