Servlet性能分析

6

最佳的Servlet分析方法是什么?

特别是我正在寻找一种解决方案,可以显示Servlet内方法调用的执行时间。

我正在Tomcat环境中运行Servlet。

我尝试过VisualVM,但它只允许我查看Tomcat线程的方法调用,而不是Servlet本身。


LambdaProbe 很容易集成到 Tomcat 中。它可以显示 Servlet 执行次数、最小/最大时间以及会话属性和内存大小。 但它不会展示您想要查看的单个方法调用。JProbe 和 JProfiler 都很有用 - 它们都是商业产品。 - JoseK
4个回答

3
一种手动的方法是创建一个过滤器并将其应用到相关的servlet,然后您可以测量所有执行完成所需的时间并将其存储在某个地方。这很好,因为调用的性能开销与您在过滤器中编写的代码一样大,我还发现它非常有用,可以找到需要更长时间才能完全加载的页面和servlet。
以下是过滤器的工作原理:
- 调用URL - 过滤器进入并存储调用的URL和当前时间(startTime) - 过滤器调用目标servlet - Servlet执行(servlet、页面或jsp) - 控制返回到过滤器 执行时间为:currentTime - startTime - 记录或存储获取的数据以供未来比较(例如将其存储到csv文件中) - 过滤器结束
要实现此功能,请创建一个实现javax.servlet.Filter接口的类。
public class ProfilingFilter implements Filter {
  public void init(FilterConfig fc){}
  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain){
    long startTime = System.currentTimeInMillis();
    String servletName = ((HttpServletRequest) req)..getPathInfo();
    chain.doFilter(req, resp);
    long executionTime = System.currentTimeInMillis()-startTime;
    // Implement the following to store or handle the data.
    logData(servletName, executionTime);
  }
}

现在将其添加到您的web.xml文件中。
<filter>
  <filter-name>profilingFilter</filter-name>
  <filter-class>com.awesome.ProfilingFilter</filter-class>
</filter>

最后是映射:
<filter-mapping>
  <filter-name>profilingFilter</filter-name>
  <url-pattern>*</url-pattern>
</filter-mapping>

请注意,这将过滤掉所有东西,因此您将会分析、html、jsp、servlets、图像等等。
我们发现这非常有用,可以找出应用程序中哪些部分需要更长的响应时间或者非常耗费资源。
您甚至可以在生产环境中启用它一两天以获取真实数据,性能下降的影响与代码花费的时间相同。
一些想法:将您的统计信息存储在servlet-context内的映射中,然后再有另一个servlet显示这些统计信息。这样您甚至不需要访问磁盘。

3
我曾使用JProfiler进行性能分析,它支持多种不同的服务器,并提供良好的控制和报告。但是它是商业应用程序,尽管您可以获得评估版本。您也可以查看开源分析器,但我没有使用过这些工具,无法评价其优劣。

编辑 我假设您了解性能分析的工作原理,分析器将进行一些仪表化并将代理附加到JVM上,所有这些都会影响性能。因此,绝不要在生产环境中使用它。


1

2015年。自从JDK 7u60(如果我没记错的话)以来,jvm就有了一个内置工具来分析Java应用程序。据说它非常轻量级,只占用约1%的CPU资源。它被称为Java Flight Recorder。要启用它,您需要使用7u60以上版本的jdk,并使用以下标志启动您的应用程序。

-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr

这里的duration=60s设置了分析的持续时间(根据需要进行设置),filename=myrecording.jfr则设置了保存分析信息的文件名。
然后,您可以使用Java Mission Control查看该文件。

此处有视频

此处有文档


这是一个免费的工具吗? - Amit P

1

为什么不使用JConsole- 它公开了MBeans。您的容器应用程序可能会公开一些与您的servlet相关的有用字段 - 如果没有,您可以创建自己的MBeans。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接