JSF应用程序中CPU使用率极高

时间:2014-06-27 17:44:56

标签: java performance jsf primefaces mojarra

我想询问有关基于JSF的应用程序可能的性能改进的建议。我们正在使用Mojarra实现2.2.7。除此之外,我们还有Hibernate(4.2.7.Final),Spring(3.2.3.RELEASE),组件库Proimefaces(4.0)和实用程序库Omnifaces(1.8),但它们并不是重点。我们正在Jetty服务器8.0.0.M0上部署所有内容以进行测试,并在生产中使用Tomcat 7.0。

我们的界面相对复杂,因为它有许多组件和对话框。我们尝试将所有这些不同组件的代码保存在单独的bean中。我们尽可能使用了请求范围的bean,但最终得到了许多视图范围的bean,主要是因为我们需要与这些组件和对话框中的数据进行交互,并且这些交互的结果将立即通过ajax显示(例如,当喜欢的东西,更新像计数;当跟随这个人,更新状态等)。总共有25个视图范围的bean只在一个页面上使用(我在一个使用@PostConstruct注释的方法中监视它们的初始化)。此外,我们持续拥有许多复合材料组件,仅在必要时(大约15个,但其中一些使用了多次)。

我们开发了JMeter压力测试来检查应用程序性能。但是,在Amazon m1.medium实例上,4个并行用户的CPU负载达到了100%,并且一些请求失败。为了识别问题,我们在本地对其进行了分析,只有一个真实用户执行了一些基本的应用程序操作。结果表明2种方法的CPU使用率很高: - javax.faces.application.ViewHandlerWrapper.restoreView(30-40%) - org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter(25-30%)

查看JProfiler调用图,热点和调用树,我们没有识别出对这种CPU使用有重大影响的任何自定义方法。

这些结果在开始时甚至更糟,但在阅读并应用我们发现的与JSF性能相关的一些建议后,我们设法略微改进了,这主要是因为更改了bean的范围并删除了一些不必要的组件。

我们也试过将javax.faces.STATE_SAVING_METHOD设置为'client'和'server',但没有得到任何改进。 这是我们当前的web.xml:https://db.tt/Aw7L9ZYi

与CPU使用相比,堆使用似乎不是问题。 最后提出一个问题:这个问题是否与我们的代码可能设计不当有关,或者这是JSF(Mojarra实现)的性能问题?是否在一个页面上使用了许多不同的(视图作用域)bean?还有什么可能影响CPU使用,我们应该尝试解决这个问题吗?我希望有人会有一些建议,因为我们尝试了我们在网上找到的所有内容,并且不知道我们接下来应该做些什么。

由于

1 个答案:

答案 0 :(得分:-1)

请尝试添加thoses参数

<context-param>// must find the equivalent for majorra
    <param-name>org.apache.myfaces.CHECK_ID_PRODUCTION_MODE</param-name>
    <param-value>true</param-value>
</context-param>  
<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Production</param-value>
</context-param>
<context-param>// must find the equivalent for majorra
    <param-name>org.apache.myfaces.CACHE_OLD_VIEWS_IN_SESSION_MODE</param-name>
    <param-value>soft</param-value>
</context-param>
<context-param>
        <param-name>javax.faces.SERIALIZE_SERVER_STATE</param-name>
        <param-value>false</param-value>
</context-param>    
<context-param>
        <param-name>javax.faces.SERIALIZE_STATE_IN_SESSION</param-name>
        <param-value>false</param-value>
</context-param>       
<context-param>
  <param-name>facelets.REFRESH_PERIOD</param-name>
  <param-value>999999</param-value>
</context-param>