我们有两个 Coldfusion 服务器,它们在对完全相同的输入数据运行完全相同的代码时,性能差异巨大。问题中的代码实例化了大量 CFC(Coldfusion 组件,类似于 OOP 语言中的对象)。
我通过运行 Process Monitor 然后在两台机器上调用有问题的代码来比较这两台服务器。我了解到了两件事。首先,Coldfusion 每次实例化对象时都会打开 CFC 文件。两台服务器都这样做,因此这不可能是造成性能差异的原因。其次,快速服务器直接打开 CFC 文件,而存在性能问题的服务器似乎会沿着路径导航,直到到达所需的 CFC 文件。它对每个文件都这样做,即使是它之前加载过的文件,而且由于代码实例化了如此多的 CFC,它变得非常慢。请参见下面的部分 Promon 跟踪,其中显示了此行为。慢速服务器可能需要超过 60 秒才能完成快速服务器在 2 秒内完成的工作。
有人能告诉我是什么原因导致了这种现象吗?这是 Coldfusion 设置吗?由于 Coldfusion 在 Java 上运行,这是 Java 设置吗?这是操作系统选项吗?快速服务器运行的是 Windows XP,我认为慢速服务器是 Windows Server 2003。
附加问题:Coldfusion 似乎没有对任何 CFC 或 CFM 文件执行任何 READ FILE 操作。这是怎么回事?
快速服务器打开CFC文件的示例:
11:25:14.5588975 jrun.exe QueryOpen C:\CF\wwwroot\APP\com\HtmlUtils.cfc
11:25:14.5592758 jrun.exe CreateFile C:\CF\wwwroot\APP\com\HtmlUtils.cfc
11:25:14.5595024 jrun.exe QueryBasicInformationFile C:\CF\wwwroot\APP\com\HtmlUtils.cfc
11:25:14.5595940 jrun.exe CloseFile C:\CF\wwwroot\APP\com\HtmlUtils.cfc
11:25:14.5599628 jrun.exe CreateFile C:\CF\wwwroot\APP\com\HtmlUtils.cfc
11:25:14.5601600 jrun.exe QueryBasicInformationFile C:\CF\wwwroot\APP\com\HtmlUtils.cfc
11:25:14.5602463 jrun.exe CloseFile C:\CF\wwwroot\APP\com\HtmlUtils.cfc
慢速服务器打开CFC文件的等效样本:
11:15:08.1249230 jrun.exe CreateFile D:\
11:15:08.1250100 jrun.exe QueryDirectory D:\org
11:15:08.1252852 jrun.exe CloseFile D:\
11:15:08.1259670 jrun.exe CreateFile D:\org
11:15:08.1260319 jrun.exe QueryDirectory D:\org\cli
11:15:08.1260769 jrun.exe CloseFile D:\org
11:15:08.1269451 jrun.exe CreateFile D:\org\cli
11:15:08.1270613 jrun.exe QueryDirectory D:\org\cli\cpn
11:15:08.1271140 jrun.exe CloseFile D:\org\cli
11:15:08.1279312 jrun.exe CreateFile D:\org\cli\cpn
11:15:08.1280086 jrun.exe QueryDirectory D:\org\cli\cpn\APP
11:15:08.1280789 jrun.exe CloseFile D:\org\cli\cpn
11:15:08.1291034 jrun.exe CreateFile D:\org\cli\cpn\APP
11:15:08.1291709 jrun.exe QueryDirectory D:\org\cli\cpn\APP\com
11:15:08.1292224 jrun.exe CloseFile D:\org\cli\cpn\APP
11:15:08.1300568 jrun.exe CreateFile D:\org\cli\cpn\APP\com
11:15:08.1301321 jrun.exe QueryDirectory D:\org\cli\cpn\APP\com\HtmlUtils.cfc
11:15:08.1301843 jrun.exe CloseFile D:\org\cli\cpn\APP\com
11:15:08.1312049 jrun.exe CreateFile D:\org\cli\cpn\APP\com\HtmlUtils.cfc
11:15:08.1314409 jrun.exe QueryBasicInformationFile D:\org\cli\cpn\APP\com\HtmlUtils.cfc
11:15:08.1314633 jrun.exe CloseFile D:\org\cli\cpn\APP\com\HtmlUtils.cfc
11:15:08.1315881 jrun.exe CreateFile D:\
11:15:08.1316379 jrun.exe QueryDirectory D:\org
11:15:08.1316926 jrun.exe CloseFile D:\
11:15:08.1330951 jrun.exe CreateFile D:\org
11:15:08.1338656 jrun.exe QueryDirectory D:\org\cli
11:15:08.1339118 jrun.exe CloseFile D:\org
11:15:08.1526468 jrun.exe CreateFile D:\org\cli
11:15:08.1527295 jrun.exe QueryDirectory D:\org\cli\cpn
11:15:08.1527989 jrun.exe CloseFile D:\org\cli
11:15:08.1531977 jrun.exe CreateFile D:\org\cli\cpn
11:15:08.1532589 jrun.exe QueryDirectory D:\org\cli\cpn\APP
11:15:08.1533575 jrun.exe CloseFile D:\org\cli\cpn
11:15:08.1538457 jrun.exe CreateFile D:\org\cli\cpn\APP
11:15:08.1539083 jrun.exe QueryDirectory D:\org\cli\cpn\APP\com
11:15:08.1539553 jrun.exe CloseFile D:\org\cli\cpn\APP
11:15:08.1544126 jrun.exe CreateFile D:\org\cli\cpn\APP\com
11:15:08.1544980 jrun.exe QueryDirectory D:\org\cli\cpn\APP\com\HtmlUtils.cfc
11:15:08.1545482 jrun.exe CloseFile D:\org\cli\cpn\APP\com
11:15:08.1551034 jrun.exe CreateFile D:\org\cli\cpn\APP\com\HtmlUtils.cfc
11:15:08.1552878 jrun.exe QueryBasicInformationFile D:\org\cli\cpn\APP\com\HtmlUtils.cfc
11:15:08.1553044 jrun.exe CloseFile D:\org\cli\cpn\APP\com\HtmlUtils.cfc
谢谢
答案1
按照 Adam Cameron 的回答,我建议比较两台机器上的 C:\ColdFusion8\lib\neo*.xml 并找出差异,特别是 neo-runtime.xml 和 neo-debug.xml - 这些是存储 ColdFusion 配置的地方。在此处发布任何有趣的差异。
如果你没有 diff 工具,请使用试用版超越比较因为它可以处理整个目录并且很好地支持 XML。
答案2
在我看来,您好像没有在慢速服务器上的 CFAdmin(服务器设置 > 缓存)中选中“组件缓存”。
另一种可能性是,您在两个服务器之间设置了不同的 CF 映射(服务器设置 > 映射)和/或自定义标签路径(扩展 > 自定义标签路径)。
但最有可能的是前者。
您还可以设置“请求中的缓存模板”(服务器设置>缓存)以防止在给定请求的第一个 CFC 之后查找相同 CFC 的文件,如果它是生产服务器,请选中“受信任的缓存”(服务器设置>缓存),如果文件已经加载过一次,这将阻止任何文件系统查找。
ColdFusion 每次在内存中只能保留特定数量的编译文件,由“缓存模板的最大数量”(服务器设置 > 缓存)设置,您应尝试将其设置为包含应用中的 CFML 文件(以及 CFC 方法,每个方法都会编译为自己的类)的总数。显然,这取决于 JVM 是否有足够的 RAM 来处理这个问题。这可能是一种平衡行为。
答案3
尝试检查:
- JVM设置特别是内存设置
- 确保调试模式已关闭
- 病毒扫描设置。查看是否有跳过 Java 文件
- 检查在哪里
cfdump
使用。