FacesServlet.service() 方法在处理请求时消耗了太多时间(自费时间高)

Posted

技术标签:

【中文标题】FacesServlet.service() 方法在处理请求时消耗了太多时间(自费时间高)【英文标题】:FacesServlet.service() method eating too much time while serving requests (high self-time) 【发布时间】:2013-09-05 18:20:03 【问题描述】:

我只是在使用基于 Netbeans 的 Profiler 对我的 JSF 项目进行一些分析实验。然而我发现了一个非常令人惊讶的结果。我发现 JSF 的 FacesServlet.service() 方法在处理请求时大部分时间都在消耗。我确实将数据库中的内容提供到我的 JSF 页面中,但我仍然发现主要的时间延迟是由于 service() 方法的高自我时间

这是分析结果的快照:-

为什么会发生这种情况,在这种方法中发生的事情如此昂贵,导致如此高的自我时间?

我在 Tomcat 7.0.42 上以生产模式运行 Myfaces 2.1.12。


编辑:

正如@mkienenb 在他下面的回答中正确指出的那样,在上述分析测试期间,我排除了org.apache.myfaces 方法,因此我进行了新的分析测试,并在新结果快照下方发布。

但是你仍然可以看到很多时间开销是由于 Myfaces/JSF 方法的自身时间造成的。

【问题讨论】:

【参考方案1】:

我不是分析方面的专家,但我很确定“自我时间”包括在其他地方未明确分析的所有方法。由于某种原因,您似乎没有单独分析“org.apache.myfaces”方法,而只是分析 javax.faces 方法。

所以这将使所有 JSF 执行时间都显示在 javax.faces.webapp.FacesServlet.services() 下。

您需要调整您的包裹排除选项。我不使用 NetBeans,所以我无法具体告诉您这是如何完成的。

【讨论】:

是的,你是对的。“看来你没有单独分析“org.apache.myfaces”方法,而只是分析 javax.faces 方法。”,你是什么说是真的,但你仍然看到javax.faces方法+org.apache.myfaces方法,都属于jsf所以你会接受任何有这么高开销的框架吗?可以接受吗!? 在您准确分析处理时间的去向之前,很难说这是“高开销”。此外,JSF 应用程序的主要目的是为 JSF 页面提供服务,因此我希望框架是主要负载——在本例中为 75%。您可能想阅读有关 JSF 的最新文章系列。它将 JSF 性能与其他框架进行比较。 [content.jsfcentral.com/c/journal_articles/… 在您准确分析处理时间的去向之前,很难说..- 我希望我更新后的新快照图像问题能在某种程度上揭示您的问题为。 75% 负载 just 由于基于高流量数据库的应用程序中的前端框架?!!好吗?! 我认为您仍然没有充分分解它。你怎么知道你自己的代码没有包含在 service() 的 43% 中?关闭所有的包过滤,看看 service() 调用的真正故障。【参考方案2】:

嗯,FacesServlet.service() 的参数是什么?那是servlet 请求和servlet 响应吗?看起来像是来自您的浏览器的典型请求和来自您的应用/服务器的响应。

很明显,FacesServlet.service() 完成所需时间的原因是您的代码和依赖项的使用情况。哇,似乎您对漂亮面孔依赖项的使用导致 FacesServlet.service() 完成所需的大部分时间。

2013 年 9 月 7 日星期六凌晨 2:24,Anton Gavazuk 写道:

处理传入的请求,并创建相应的响应,通过 执行请求处理生命周期。

如果此方法的请求和响应参数不是实例 HttpServletRequest 和 HttpServletResponse 分别是 调用此方法的结果是不确定的。

此方法必须响应以下开头的请求 通过在响应参数上调用 sendError 方法来获取字符串 (转换为 HttpServletResponse),传递代码 HttpServletResponse.SC_NOT_FOUND 作为参数。

所以这个方法其实就是把所有底层处理都包起来了:​​jsf 动作、业务服务、与数据库的交互——因此它的时间是 永远是最大的

为了响应 OP 并展示上面所说的 Anton(来自 myfaces 列表),

(1) 在开始这个请求之前,我的浏览器显示了“会话超时”页面,所以我点击了确定,它向服务器发出了一个简单的请求,以响应登录页面。下面的屏幕截图将向您展示,如此简单的请求产生的响应时间如此之快,以至于找不到 FacesServlet.service()。

(2) 在我的浏览器中呈现登录页面后,我单击了登录按钮,我的应用程序执行了几项操作(检查数据库的用户 ID,验证存储在数据库中的密码,然后导航到并呈现一个页面数据库检索,这可能需要几秒钟,具体取决于当前日期完成的用户操作数(它是用户审计跟踪数据/页面),当然,页面在浏览器中呈现,毕竟. 我多次搜索 FacesServlet.service() 直到没有找到更多的匹配项。在下面的屏幕截图中,您将看到 FacesServlet.service() 'time' 是由完成其他/底层/调用操作所花费的时间引起的/进程。

(3) 在 Audit Trail 页面上,我单击了一个选项,该选项将调用 AJAX 请求/响应,这将执行可能/将需要比上面 #2 中的数据库检索更长的数据库检索,然后是 AJAX响应将在浏览器中呈现。下面的屏幕截图将再次向您展示 FacesServlet.service() 的“时间”是由完成其他/基础/调用的操作/流程所花费的时间引起的。

(4) 接下来/最后,我决定单击一个菜单栏选项,它会根据当前日期进行数据库检索以显示数据库中的数据,并导航到和/或在浏览器中呈现不同的页面。下面的屏幕截图将再次向您展示 FacesServlet.service() 的“时间”是由完成其他/基础/调用的操作/流程所花费的时间引起的。

我在 Tomcat 7.0.42 上以生产模式运行 Myfaces 2.1.12。

我也是...通过 TomEE+ 1.6.0“快照”(2013 年 9 月 6 日版本/内部版本)

【讨论】:

很高兴您提供了另一组与我的结果形成鲜明对比的结果,但这是否回答了我的问题或证明了我的结果?我不这么认为。 您是否像我一样提供了多个屏幕截图来显示您在 FacesServlet.service() 下列出的整个结果集?我不这么认为。如果你真的想得到 MyFaces 团队的关注,请打开错误报告。更好的是,您可能希望将错误报告提交给 PrettyFaces,或在 Prettyfaces 论坛(或邮件列表)中提问。 我认为我提供的任何东西都足够了,如果不是这样,您可以要求更多需要的东西,而不是发布实际上无法回答问题的不必要的长答案。无论如何,我真的很感谢您的努力放,我感谢你。 顺便说一句,你为什么认为它与漂亮的面孔有关? 我的回复比短截屏回复更好。 :) ocpsoft ... == 漂亮吗? :) 我在那里看到很多事件。我还看到了 JUEL、retrieveCurrentLOB() 和 px10.Controllers 包中引用的其他代码。在查看堆栈跟踪时,我发现从下往上而不是从上往下看会更好。 “由”在底部。同样在这种情况下,FacesServlet.service() 是由自下而上的一切“引起”的。 :) 很高兴看到您的整个结果集,因此我们可以进行数学运算并看到它“导致”了 FacesServlet.service 的“自我时间”

以上是关于FacesServlet.service() 方法在处理请求时消耗了太多时间(自费时间高)的主要内容,如果未能解决你的问题,请参考以下文章

静态方法与实例方法,类方法与对象方法

init()方法和构造方法的区别

GroovyGroovy 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )

Python中静态方法和类方法的区别

类方法和实例方法

Java中的构造方法与普通方法的区别? 啥情况下用构造方法啥情况下用普通的方法