从Websphere 6.1.35到Websphere 8.5.5.17-受文件系统扫描影响的应用程序启动

问题描述

这是一个旧的应用程序,我们很难更改该应用程序。

在部署类似CRM的应用程序期间,从6.1.35环境迁移到8.5.5.17 Websphere应用程序服务器环境期间,应用程序的启动时间从10秒更改为12分钟。

我们进行了故障排除,发现问题是一个包含1.200.000文件的远程文件系统。该远程文件系统被“装载”在WAR单元的一部分路径中。这是在部署应用程序之后完成的。

使应用程序启动如此缓慢的原因是,在8.5.5.17上遍历了应用程序路径中存在的所有文件(因此,它试图遍历远程文件系统中的1.200.000文件,这与您可能会猜到12分钟...)。

有人知道这种行为是从WAS 6.1.x更改为WAS 8.5.5.x的意图吗? 有什么解决方法可以阻止此情况?

解决方法

WebSphere Application Server在启动应用程序时会在应用程序中创建文件列表。创建列表时有点过分热情,因为它包含了在应用程序启动期间不需要查看的文件。对于大型应用程序,文件列表会占用大量内存,并且可能需要很长时间才能生成。由于它是Java EE应用程序服务器,因此在启动应用程序时,只应与Java-EE定义位置中的文件有关。在应用程序运行期间不使用该列表。因此,应用程序服务器应仅查看目录:

   /
   META-INF/*
   WEB-INF
   WEB-INF/classes/*
   WEB-INF/lib/*

APAR PH09294(包含在8.5.5.16和9.5.0.1中)为您提供了一种将文件列表限制在上述位置的方法。您可以在应用程序或应用程序服务器中指定设置。 (如果您使用的是8.5.5.16或9.5.0.1之前的版本,则应查看PM37942,它虽然比较麻烦,但仍然可以使用。)

要在应用程序中启用设置,请将以下内容添加到EAR或WAR的MANIFEST.MF中。 (记住,在编辑MANIFEST.MF时,请遵守格式规则。MANIFEST.MF必须以空行结尾。)将设置添加到WAR中只会限制该WAR的文件列表。将设置添加到EAR会限制该EAR中所有WAR的文件列表。

IBM-Enable-File-List-Include-Filter: true

您可以通过设置JVM定制属性将设置应用于服务器。 以下JVM自定义属性将设置应用于服务器上的所有应用程序:

   Property:  org.eclipse.jst.j2ee.commonarchivecore.EnableFilesListIncludeFilter
    
   Value:  true

您还可以通过将以下行添加到 /properties/amm.filter.properties文件中,将设置应用于配置文件中的所有服务器:

IBM-Enable-File-List-Include-Filter = true 

最后,要将设置应用于所有配置文件,请将上述行添加到 /properties/amm.filter.properties

您应该在哪里设置?如果在应用程序中进行设置,则无论在何处部署应用程序,文件列表的范围都会受到限制。您不依赖应用程序服务器中的任何设置。因此,对于任何大型应用程序,开发人员应始终将设置包含在应用程序中。管理员可以考虑将设置应用于整个WebSphere Application Server安装。