Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
xiaoping_zheng
Product and Topic Expert
Product and Topic Expert
2,109



作者:toby.johnston 现就职于SAP






针对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


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


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



































    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,然后按下回车键。




  4. 输入命令 print to file,当提示了file=后,输入目标的文件路径及文件名。注意:做这个之前你需要确保你输入的路径存在。

  5. 下一步,输入命令print stackstrace 同时,保存一份当前JVMTOP输出的截图。



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




  6. CPU问题发生的时候,重复上面的步骤去收集线程dumpJVMTOP的截图。(可以在问题发生的时候每5分钟取一次。)这是因为取得的信息集合越多,越有助于问题的分析。

  7. 键入Ctrl+C,选择Y退出JVMTOP
    重要:当JVMTOP还在运行的时候,不要直接点击X来关闭命令行窗口
    输入命令exit来退出JVMMON





更多关于JVMTOP的信息,可以访问主页URL




1 Comment