2010-03-11 111 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升級到最新版本,然後查看問題是否仍然存在。

相關問題