【问题标题】:Websphere Application Server - What on earth will it take to start any fast?Websphere Application Server - 究竟需要什么才能快速启动?
【发布时间】:2010-11-13 18:34:39
【问题描述】:

我正在使用带有集成测试环境的 Rational Application Developer v7.0。当我开始调试我的 web 应用程序时,调试模式下的服务器启动时间接近 5-6 分钟 - 足够喝杯咖啡了!

有时,这让我很生气,我开始诅咒 IBM 构建操作系统而不是应用服务器!产生 20 多个进程和无用的服务,没有记录配置来调整它,以更快地启动。

我相信有很多 Java 开发人员会同意我的观点。我尝试通过我的管理控制台禁用默认应用程序和一组服务,但这并没有太大帮助。

我没有 web 服务,没有企业 bean,没有队列,只是一个需要连接池的简单 web 应用程序。您过去是否做过一些事情来使您的集成测试环境在调试模式下快速启动并消耗更少的 RAM?

更新: 我尝试禁用一些服务(国际化、默认应用程序等),现在 WebSphere 服务器变得越来越差。它不仅不会花费可怕的启动时间,它还会时不时地冻结长达 2 分钟。 :-( 听起来,优化总是不是一件好事!

【问题讨论】:

  • 您的意思是在 IDE 中以调试模式启动服务器,还是以远程调试模式启动服务器?
  • 在 IDE 中以调试模式启动
  • 猜猜我此刻在做什么? (等待 WebSphere 6 从 RAD 6 以调试模式重新启动 :))
  • 很高兴您没有在 AS/400 上使用 WebSphere :)
  • 你的机器有多少内存?

标签: java performance jakarta-ee websphere


【解决方案1】:

其中一个主要原因是您有一个包含许多模块、类、清单、XML 描述符等的大型应用程序,并且 Websphere 应用程序服务器启动过程本身是单线程的(因此每个应用程序都可能启动如果它们具有相同的重量,则在单独的线程中)。另一个原因是 Eclipse EMF 和 JST 框架在启动和发布/部署期间的 I/O 非常密集。

启动乏味的另一个原因是在发布/部署期间将发生的注释扫描。可以以各种方式控制和修改该注释扫描。看看这个网站: http://wasdynacache.blogspot.se/2012/05/how-to-speed-up-annotation-processing.html

首先,检查和评估您的硬件,包括 CPU、内存和硬盘。您的处理器在启动期间是否长时间 100% 运行?如果是这样,处理器可能太弱了。是否发生分页?那么您可能需要放入更多的 RAM。 Websphere/eclipse JST 和 EMF 框架的 I/O 非常密集,因此您应该考虑购买 SSD 磁盘。您还应该确保您机器上的其他进程(病毒防护软件等)不会从 Websphere java 进程中窃取硬件资源。

所以对于硬件: 1. 处理器 - 一个相当快的处理器,因为发布和启动大多是单线程的,你不需要那么多 cpu 内核 2. 内存 - 您至少需要 512Mb 的物理 RAM,这当然取决于您的应用程序的大小。 3. 存储 - 我肯定会选择快速 SSD,因为底层 eclipse 框架是 I/O 密集型的。

这里有一些技巧可以减少启动阶段的占用空间。请在应用这些设置之前确保您记录了基线启动,以便您可以观察到启动的差异,即减少的启动时间。

  1. JVM 参数:-Xverify:none -Xquickstart -Xnoclassgc -XX:+UseNUMA -XtlhPrefetch -Xgcthreads4(我的机器上安装了 4 个虚拟处理器)
  2. 扩展堆大小以满足应用程序的需求。
  3. 禁用应用程序的自动启动以减少发布时间。
  4. 禁用 PMI 和不必要的跟踪。
  5. 在启动期间分析您的应用程序并修复瓶颈(如果发现)。

其他可能获得性能的 JVM 参数:

  • com.ibm.cacheLocalHost=true
  • com.ibm.ws.classloader.zipFileCacheSize=512
  • com.ibm.ws.classloader.resourceRequestCacheSize=1024
  • com.ibm.ws.management.event.pull_notification_timeout =20000
  • com.ibm.ws.amm.scan.context.filter.packages=true
  • org.eclipse.jst.j2ee.commonarchivecore.disableZip=true

将使 Websphere 应用服务器立即停止的 Jvm 参数:

  • com.ibm.ejs.sm.server.quiesceTimeout=0
  • com.ibm.ejs.sm.server.quiesceInactiveRequestTime=1000

Web 容器属性:

  • com.ibm.wsspi.jsp.disableTldSearch=true
  • com.ibm.wsspi.jsp.disableResourceInjection=true

可以指定eclipse.ini的JVM参数(注意堆参数根据我的环境条件配置)

  • -Dcom.ibm.ws.management.event.max_polling_interval=5000
  • -Xquickstart
  • -Xverify:无
  • -Xmxcl25000
  • -Xjit:da​​taTotal=65536
  • -Xcodecache64m
  • -Xscmx48m
  • -Xnolinenumbers
  • -Xverify:无
  • -Xmnx64m
  • -Xmx1446m
  • -Xmnx64m
  • -XX:+UseCompressedOops
  • -XX:+使用NUMA

【讨论】:

    【解决方案2】:

    5 到 6 分钟是不正常的。我每天都使用 RAD 和 WAS 并获得不错的启动时间。您正在运行哪个版本的 WAS,您有多少 RAM?

    如果您为同一个 WAS 配置文件共享多个工作区和项目,请考虑为您的工作区创建一个新的 WAS 配置文件。

    您可能已经尝试过,但这里有一个简单的清单,列出了可以直接尝试的内容。确保您在 RAD 中的服务器设置启用了以下选项:

    • 优化服务器以进行测试和开发
    • 使用工作区上的资源运行服务器
    • 最小化复制到服务器的应用程序文件

    如果不需要,请取消选中“启用通用测试客户端”。

    在管理控制台中,您可以验证一些服务器设置,例如

    • 在开发模式下运行
    • 并行启动
    • 根据需要启动组件

    您还可以在创建新的 WAS 配置文件时卸载默认安装的 ivt 应用程序。然后是通常的东西,例如不太碎片化的驱动器和正确设置的页面文件大小。

    您可能已经知道的最后一件事是重新发布到您的服务器,而不是重新启动它。

    【讨论】:

      【解决方案3】:

      WAS V7 允许您配置应用服务器启动时启动的内容,从而解决了其中一些问题。

      因此,当您迁移到 WAS V7 时,您可能会在这个领域看到一些改进。

      【讨论】:

      • 你真的能解释一下这是在哪里配置的,你知道什么可以安全关闭吗?
      【解决方案4】:

      这就是 Spring 诞生的原因之一。

      您甚至不必提供 JMS、远程处理等所有细节。使用 Tomcat、ActiveMQ 和 OpenEJB 会更好。

      任何东西除了 WebSphere。

      【讨论】:

        【解决方案5】:

        如果您没有 EJB、JMS 等,只需部署在独立的 servlet 容器(如 Tomcat 或 Jetty)下,您会惊讶于它的速度有多快 :-),这里有点讽刺,但这是真的!

        【讨论】:

          【解决方案6】:

          有一些调整 RAD 6 on developerworks 的提示和技巧可能会有所帮助,其中许多也适用于 RAD 7。

          我看到了一个类似的 RAD 7 列表,如果我能找到它,我会发布它。

          我确实找到了一些tuning tips for Portal on RAD 7

          我会说我对测试环境的体验并不理想。我现在倾向于使用为 remote debugging with an External launch configuration 配置的 Tomcat/Pluto 从裸 Eclipse 中对其进行管理,并依靠适当的 JNDI 配置来抽象底层服务器。

          如果您正在编写相关的 API,那么您不在 Websphere 上的开发目的并不重要。如果您确实有特定于 Webpshere 的问题,您可以随时启动野兽来调试它。

          【讨论】:

            【解决方案7】:

            调试服务器代码的最佳方法是使用远程调试。

            首先您需要在服务器启动脚本中的 JVM 参数中添加以下内容:

            -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
            

            这将导致 JVM 侦听指定端口,然后您可以从您的 IDE 启动针对该端口的远程调试会话并像代码在同一进程中运行一样进行调试。

            以这种方式工作可以防止您如此频繁地重新启动服务器,从而回避您与 Websphere 启动时间有关的问题。

            如果服务器上的二进制文件和 IDE 中的源不同步,您可能会得到一些奇怪的结果,但总的来说这不是问题。

            【讨论】:

            • 如何使 IDE 中的源代码与远程调试器中的源代码保持同步?
            • 嗨,Jay,当您对源进行更改时,只需重新部署即可。这听起来很明显,但是如果您正在执行 TDD,您偶尔会忘记(我确实这样做)部署并发现自己在 IDE 中通过 cmets 或空白进行跟踪。
            • 您应该安装插件以从您的 Eclipse IDE 管理您的 WebSphere Application Server。对于我的 WAS 7.0,它被称为“WebSphere Application Server 7.0 Tools”。然后,您可以将您的服务器添加到“服务器”视图并从那里启动它。您还将在那里找到“以调试模式启动” - 因此无需自行设置 VM 启动参数。
            【解决方案8】:

            如果连接池确实是您使用的唯一 appserver 功能,那么您为什么不简单地使用 apache commons dbcp (http://commons.apache.org/dbcp/) drop webfear alltogether 并改用 jetty。这应该会将您的启动时间减少到大约 5 秒。如果您真的觉得有必要,您可以稍后轻松地再次切换到 websphere 以用于您的生产环境。

            【讨论】:

            • 我想使用的服务很少——例如 JAAS。我不确定我是否能够在码头上做到这一点。而且,这只是一个安全的选择 - 您可以避免与迁移相关的问题。
            猜你喜欢
            • 2018-07-27
            • 2019-01-24
            • 2017-12-16
            • 2021-04-15
            • 1970-01-01
            • 2015-05-05
            • 1970-01-01
            • 1970-01-01
            • 2016-08-10
            相关资源
            最近更新 更多