2010-03-11 106 views
1

我一直在生产中的开放帐户过程中进行一些对象创建时间的记录。定期地,初始化一个对象会比预期更长的时间。通过初始化我的意思是调用它的init()并传递一些可能是简单变量或对象的参数。例如Coldfusion CFC的创建需要花费大量时间来执行

<cfset validateObj = createObject("component", "compExample").init( 
     productionMode = VARIABLES.productionMode, 
     ipWhiteListed = isWhiteListed, 
     ipLocatorObj = VARIABLES.ipLocatorObj) /> 

这就是init()方法中发生的一切。通常执行时间为0毫秒,但随机时间可能会达到3或3.5秒。这不是特定于某个特定的服务器或我们通常繁忙的时期。这似乎很随机。

一个想法是,这些模板被从我们的模板缓存中逐出,因为它们并不是特别常用,尽管我在多个服务器上检查了cfstat并且最大CP/Sec为-1。

运行CF 8,0,1

有其他人曾经遇到过吗?

回答

1

增加模板缓存中项目的最大数量。由于缓存使用LRU,并且这些对象特定于不是特别常用的功能,所以它们被从缓存中逐出。更新了一半的服务器,并保持了一半,并在周末后进行比较。缓存增加的服务器上的对象实例化时间急剧减少。

0

有没有机会从服务器管理器运行分析器?这导致了我们类似的随机缓慢。

+0

嗨,不,没有探测器运行。谢谢。 – 2010-03-11 15:38:26

0

几个想法....是否有任何锁定继续或依赖于网络/ Web服务/数据库。你有没有任何审计或类似的事情(例如AOP)?

你还有什么CF版本?服务器是否运行.1更新(如果适用,即8.01)。

+0

嗨John,使用CF8和.1更新,在init方法中没有网络/ web服务/数据库活动,这是很奇怪的事情。没有审计正在进行。 – 2010-03-11 17:42:30

1

在init方法中可能会调用其他可能会导致随机缓慢性能的事情。这可能是由于如何通过init方法将参数存储在CFC中。

里面的CFC init方法,它只是:

<cfset variables.productionMode = arguments.productionMode /> 

,或者使用setter方法,如:

<cfset setProductionMode(arguments.productionMode) /> 

也许structAppend?

<cfset structAppend(variables, arguments) /> 

第一种方法,只是一个直接设置最不可能导致任何问题。 第二种方法,使用setter方法,可能会减慢取决于该setter方法正在做什么,它可能调用什么其他方法等...第三种方法应该是相当一致的,但我见过structAppend和其他内部功能随机减速没有明显的原因。

我认为John Whish的评论绝对是值得研究的。另外,当init方法变慢时,服务器上是否有任何奇怪的流量?

你有没有试过隔离只是createObject()调用,看看它是否是对象实例导致减速或如果它确实是init方法?通常在CF对象中,实例化可以是一个随机缓慢的过程。最近在CF8中这可能会更好,但经验表明这可能是问题所在。

+0

嗨格雷格,我正在使用第一种方法,直接设置。我们正在使用cf8。我会去隔离createObject(),但相信它没有被实例化,直到调用一个方法。 – 2010-03-11 17:39:09

+0

感谢Bazza,实际上我只是在从cf7切换到cf9的过程中,我忘了CF8实际上可能会在createObject被调用时立即自动调用init方法,不确定。我知道在CF 7初始化只是一个伪构造函数,并没有实际由CF自动调用。 另一种隔离方法可能只是在init方法的最顶端,以查看它是否是对象创建惩罚或该方法的一些奇怪之处。 祝你好运! – sqrl0 2010-03-11 22:19:37

1

总是将jvm升级到最新版本,然后查看问题是否仍然存在。

相关问题