作者:Toby Johnston 现就职于SAP
/wp-content/uploads/2015/01/tomcat77_424374.png
针对Apache Tomcat服务器的CPU瓶颈查错分析是一件很困难的事情。这是因为Apache Tomcat运行在一个Java虚拟机上,理解究竟是哪一个JVM线程的动作导致了Tomcat整体CPU的瓶颈是一个不透明的因此很难通过常规的监视工具捕捉到。最近,我发现了一个新工具叫做JVMTOP,它提供了可以让我们直接去观测运行在Java虚拟机上各个线程的运行状况。另外,JVMTOP也提供了实时监控的功能,可以让我们发现究竟哪些线程被暂停,而且可以知道它们等待的对象ID。在这篇文章中,我们将做一个实例演示,来演示这个工具究竟如何工作,以及你从中需要收集什么样的信息提供给SAP以便于进一步的分析。请注意这个实例是基于Apache Tomcat,实际上JVMTOP对分析Adaptive Processing Server / Adaptive Job Server(及其子进程)的CPU问题分析也是有帮助的。

使用JVMTOP查明线程的CPU使用率

我针对JVMTOP做了一些设定更改(更新了可执行的JAR文件以便于更方便的使用)并且只做了可执行的Batch文件来启动这个应用。请于下文提供的链接下载。请注意,如果Tomcat运行于OracleJava虚拟机,你则需要将其首先改为SAPJava虚拟机。关于这项内容,请参考Wiki页面:如果配置Tomcat使用SAP JVM而不是Oracle JVM – Business Intelligence (BusinessObjects) – SCN Wiki

  1. 下载JVMTOP.zip
  2. 将其解压于你系统中Tomcat节点的目录<INSTALL_DIR>\SAP BusinessObjects Enterprise XI 4.0\win64_x64\sapjvm\bin
  3. 打开命令行并进入目录<INSTALL_DIR>\SAP BusinessObjects Enterprise XI 4.0\win64_x64\sapjvm\bin
  4. 打开任务管理器,点击视图,选择列,选中PID(进程ID)这样我们可以识别Tomcat进程的ID

    /wp-content/uploads/2015/01/tomcatt1_1_424311.png

  5. 在命令行界面中,执行命令runJVMTOP.bat <PID>,如下图的例子:

    /wp-content/uploads/2015/01/tomcatt3_424304.png

  6. JVMTOP会连接到SAPJava虚拟机上,并列出这个进程中消耗CPU最多的10个线程。请注意它会保持与SAP
    Java虚拟机的连接状态并自动刷新列表里的值,这个动作和Unix里面的top命令是类似的。

    /wp-content/uploads/2015/01/tomcatt5_424305.png

    Header 2
    TID Java虚拟机线程ID
    NAME Java虚拟机线程名
    STATE 当前Java虚拟机线程状态
    CPU 当前CPU的使用率(基于所有处理器的可用CPU时间计算)
    TOTALCPU 从线程开始运行开始后的CPU总使用率(基于所有处理器的可用CPU时间计算)
    BLOCKEDBY 如果线程被锁定,该列将显示锁定了当前这个线程的线程ID
  7. 在上面图里的例子中,我们可以很容易的发现是线程ID为48的http-8080-5造成了CPU的问题。

 

使用JVMMON工具创建线程Dumps

现在我们已经确定出发生问题的线程,接下来我们便需要让它产生dump从而让我们分析代码级别中当前线程进行到哪一个调用堆栈中。SAP
JVM包含了一个叫做JVMMON的工具,它可以很容易的产生线程dump,不需要额外进行设定。
  1. 打开命令行并进入目录<INSTALL_DIR>\SAP BusinessObjects Enterprise XI 4.0\win64_x64\sapjvm\bin
  2. 执行jvmmon.exe。它将输出当前运行的JVM进程信息及其IDPID)。
  3. 输入Apache Tomcat进程的PID,然后按下回车键。

    /wp-content/uploads/2015/01/tomcat7_424312.png

  4. 输入命令 print to file,当提示了file=后,输入目标的文件路径及文件名。注意:做这个之前你需要确保你输入的路径存在。
  5. 下一步,输入命令print stackstrace 同时,保存一份当前JVMTOP输出的截图。

    /wp-content/uploads/2015/01/tomcat10_424340.png

    JVMTOP里的线程信息切合与线程dump文件里保存的详细内容。它将有助于SAP更深入的对其内部的逻辑进行分析。

    /wp-content/uploads/2015/01/tomcat12_424341.png

  6. CPU问题发生的时候,重复上面的步骤去收集线程dumpJVMTOP的截图。(可以在问题发生的时候每5分钟取一次。)这是因为取得的信息集合越多,越有助于问题的分析。
  7. 键入Ctrl+C,选择Y退出JVMTOP
    重要:当JVMTOP还在运行的时候,不要直接点击X来关闭命令行窗口
    输入命令exit来退出JVMMON

    /wp-content/uploads/2015/01/tomcat13_424342.png
更多关于JVMTOP的信息,可以访问主页URL
To report this post you need to login first.

Be the first to leave a comment

You must be Logged on to comment or reply to a post.

Leave a Reply