Compile Time SLOW on CF2016 (upgrading from CF9)

New Here ,
Jun 06, 2017 Jun 06, 2017

Copy link to clipboard

Copied

We're in  the process of migrating from CF9 to CF2016 and are running into really slow compile times. The app startup takes twice as long as before but our real problem is that  we have a lot of dynamically generated CFML that gets written to the VFS (Virtual File System) and then included.

This code, executed in a loop x 100 takes:

  • CF9        = 1420 ms.
  • CF2016  = 8643 ms.

I have tried with Java 1.8.0_112 and 1.8.0_131 and the result is the same.

Is there anything that we can do to speed up the compile time and is this a known issue with CF2016? Why was it so much faster on CF9?

Any help would be hugely appreciated as our upgrade is now stalled due to this issue.

Views

1.9K

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Jun 08, 2017 Jun 08, 2017

Copy link to clipboard

Copied

Anyone? The server is actually slow all around, decreased performance across the board - but the start up time  compile time has gone through the roof. Anyone else run into this?

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Jun 14, 2017 Jun 14, 2017

Copy link to clipboard

Copied

I in fact expect CF2016 to be faster than CF9, all other factors considered. It is likely that, in your new installation, you unknowingly started some new processes in the background. Verify what CF2016 processes are running.

What are your JVM settings? Did you switch off client settings in the Administrator to prevent it from writing to the registry?

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Employee ,
Jun 18, 2017 Jun 18, 2017

Copy link to clipboard

Copied

Hi brookd,

Could you please share the jvm.config file and the code with the loop with us.

Thank You,

Abhishek

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Jun 19, 2017 Jun 19, 2017

Copy link to clipboard

Copied

JVM config is basically default out of the box, but with the memory bumped up to 6GB.

The code is a simple loop, try it on CF9 vs CF2016 and you will see a huge difference in speed:

    <cfdump var="#getVFSMetaData('ram')#">

    <cfset filename                 = 'wildcardparsing-#createUUID()#.cfm'>

    <cfset tempfilepath             = 'ram://'>

    <cfset tempIncludefilepath      = '/ram/'>

    <!--- create CFML --->

    <cfset cfml = '<cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif>'>

    <cfset local.submissionTimerStart=gettickcount()>

    <cfloop from="1" to="1000" index="index">

        <cfset filename = 'wildcardparsing-#createUUID()#.cfm'>

  <cffile action="write"

  output="#cfml#"

  file="#tempfilepath##filename#" />

        <cfsavecontent variable="parsedSTR">

        <cfoutput>

            <cfinclude template="#tempIncludefilepath##filename#" />

        </cfoutput>

        </cfsavecontent>

    </cfloop>

  <cfset local.submissionTimerEnd=gettickcount()>

  <cfset local.runDuration=local.submissionTimerEnd-local.submissionTimerStart>

  <cfoutput>

     Compile Completed in #local.runDuration# ms...

  </cfoutput>

    

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Jun 19, 2017 Jun 19, 2017

Copy link to clipboard

Copied

Could you show us the JVM settings?

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Employee ,
Jun 22, 2017 Jun 22, 2017

Copy link to clipboard

Copied

Hi brrokd,

Could you please share the code snippet and the jvm.config file with us on cf.install@adobe.com

Thank You,

Abhishek

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Jun 22, 2017 Jun 22, 2017

Copy link to clipboard

Copied

Hello, my code snippet  IS shared in my previous reply, can you see it? I have included it again below the JVM config:

My JVM config file is below:

#

# VM configuration

#

# Where to find JVM, if {java.home}/jre exists then that JVM is used

# if not then it must be the path to the JRE itself

java.home=C:\\ColdFusion2016\\jre

#

# If no java.home is specified a VM is located by looking in these places in this

# order:

#

#  1) ../runtime/jre

#  2) registry (windows only)

#  3) JAVA_HOME env var plus jre (ie $JAVA_HOME/jre)

#  4) java.exe in path

#

# Arguments to VM

java.args=-server -Xms6024m -Xmx6024m -XX:+UseParallelGC -Xbatch -Dcoldfusion.home={application.home} -Duser.language=en -Dcoldfusion.rootDir={application.home} -Dcoldfusion.libPath={application.home}/lib -Dorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER=true -Dcoldfusion.jsafe.defaultalgo=FIPS186Random -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.JavaUtilLog -Djava.util.logging.config.file={application.home}/lib/logging.properties -javaagent:C:/FusionReactor/instance/VMDEBUG/fusionreactor.jar=name=VMDEBUG,address=8088 -agentpath:C:/FusionReactor/instance/VMDEBUG/frjvmti_x64.dll -Dcoldfusion.classPath={application.home}/lib/updates,{application.home}/lib,{application.home}/lib/axis2,{application.home}/gateway/lib/,{application.home}/wwwroot/WEB-INF/flex/jars,{application.home}/wwwroot/WEB-INF/cfform/jars

# -XX:+UseParallelGC

# -XX:NewSize=5200m -XX:MaxNewSize=5200m -XX:SurvivorRatio=6 -XX:TargetSurvivorRatio=4

# Comma separated list of shared library path

java.library.path={application.home}/lib,{application.home}/jintegra/bin,{application.home}/jintegra/bin/international,{application.home}/lib/oosdk/classes/win

# Comma separaed list of shared library path for non-window

java.nixlibrary.path={application.home}/lib

java.class.path={application.home}/lib/oosdk/lib,{application.home}/lib/oosdk/classes

Code Snippet to reproduce slow compile times:

<cfset filename             = 'wildcardparsing-#createUUID()#.cfm'>
<cfset tempfilepath         = 'ram://'>
<cfset tempIncludefilepath  = '/ram/'>

<!--- create CFML --->

<cfset cfml = '<cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif>'>

<cfset local.submissionTimerStart=gettickcount()>

<cfloop from="1" to="1000" index="index">

<cfset filename = 'wildcardparsing-#createUUID()#.cfm'>

    <cffile action="write"

    output="#cfml#"

    file="#tempfilepath##filename#" />

<cfsavecontent variable="parsedSTR">
<cfoutput>
<cfinclude template="#tempIncludefilepath##filename#" />
</cfoutput>
</cfsavecontent>

</cfloop>

<cfset local.submissionTimerEnd=gettickcount()>

<cfset local.runDuration=local.submissionTimerEnd-local.submissionTimerStart>

<cfoutput>

Compile Completed in #local.runDuration# ms...

</cfoutput>

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Jun 22, 2017 Jun 22, 2017

Copy link to clipboard

Copied

I don't know why the JVM config is not coming through formatted, here it is again:

#

# VM configuration

#

# Where to find JVM, if {java.home}/jre exists then that JVM is used

# if not then it must be the path to the JRE itself

java.home=C:\\ColdFusion2016\\jre

#

# If no java.home is specified a VM is located by looking in these places in this

# order:

#

#  1) ../runtime/jre

#  2) registry (windows only)

#  3) JAVA_HOME env var plus jre (ie $JAVA_HOME/jre)

#  4) java.exe in path

#

# Arguments to VM

java.args=-server -Xms6024m -Xmx6024m -XX:+UseParallelGC -Xbatch -Dcoldfusion.home={application.home} -Duser.language=en -Dcoldfusion.rootDir={application.home} -Dcoldfusion.libPath={application.home}/lib -Dorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER=true -Dcoldfusion.jsafe.defaultalgo=FIPS186Random -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.JavaUtilLog -Djava.util.logging.config.file={application.home}/lib/logging.properties -javaagent:C:/FusionReactor/instance/VMDEBUG/fusionreactor.jar=name=VMDEBUG,address=8088 -agentpath:C:/FusionReactor/instance/VMDEBUG/frjvmti_x64.dll -Dcoldfusion.classPath={application.home}/lib/updates,{application.home}/lib,{application.home}/lib/axis2,{application.home}/gateway/lib/,{application.home}/wwwroot/WEB-INF/flex/jars,{application.home}/wwwroot/WEB-INF/cfform/jars

# -XX:+UseParallelGC

# -XX:NewSize=5200m -XX:MaxNewSize=5200m -XX:SurvivorRatio=6 -XX:TargetSurvivorRatio=4

# Comma separated list of shared library path

java.library.path={application.home}/lib,{application.home}/jintegra/bin,{application.home}/jintegra/bin/international,{application.home}/lib/oosdk/classes/win

# Comma separated list of shared library path for non-windows

java.nixlibrary.path={application.home}/lib

java.class.path={application.home}/lib/oosdk/lib,{application.home}/lib/oosdk/classes

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Employee ,
Jun 22, 2017 Jun 22, 2017

Copy link to clipboard

Copied

We are getting an error while running the code snippet "

Could not find the included template

Can you share the template example with us.

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Jun 22, 2017 Jun 22, 2017

Copy link to clipboard

Copied

Sorry, the RAM disk needs a mapping for the cfinclude. Save the code below as application.cfc to the same directory or just add the single line for the mapping to YOUR application.cfc

<cfcomponent output="false">

    <cfset this.mappings[ "/ram" ] = "ram://" />

</cfcomponent>

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Jun 22, 2017 Jun 22, 2017

Copy link to clipboard

Copied

Thanks for the information. What is the Operating System of your server, including bitness?

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Jun 22, 2017 Jun 22, 2017

Copy link to clipboard

Copied

VMWARE Virtual Machine

Windows Web Server 2008 R2, SP1

Intel Xeon(R) CPU x5660 2.8GHZ x 2

12 GB RAM

64 Bit

Note, I see the same slowness on local workstation (windows 7 64 BIT) (not a VM)

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Jul 01, 2017 Jul 01, 2017

Copy link to clipboard

Copied

I have found an explanation. To understand it, switch on debugging in the ColdFusion Administrator. Then you will see that each of the CFM files running in memory has an execution time of 1 ms or less. The total time should therefore add up to about 1000 ms for 1000 passes of the loop.

But my total execution time was 37043 ms. So what accounts for the difference? Where else is ColdFusion 2016 spending all the execution time? The answer is:

<cffile action="write" output="#cfml#" file="#tempfilepath##filename#">

Apparently, ColdFusion 2016 takes a lot of time to write the string value of the variable cfml. To see this, change the value of the variable to, for example,

<cfset cfml = '<cfset x = 1><cfif x is 1>1<cfelse>2</cfif>'>

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Jul 01, 2017 Jul 01, 2017

Copy link to clipboard

Copied

Thank you for looking into this! However, I used Fusion Reactor's Line Performance tool and found the majority of the time was spent on the CFINCLUDE (which is when the compiling happens).  Having a smaller CFML string means a shorter compilation process. It is not the WRITE that is slow, it is the compilation time on the include. If you add timer code around each part of code I am sure you will see the same.

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Jul 01, 2017 Jul 01, 2017

Copy link to clipboard

Copied

Curious. In fact, now that you mention it, I have seen that the delay is due to a combination of factors! That is, both the file-write and the cfsavecontent contribute significantly to the execution time.

Use the following test code:

<cfset filename = 'wildcardparsing-#createUUID()#.cfm'>

<cfset tempfilepath = 'ram://'>

<cfset tempIncludefilepath  = '/ram/'>

<!--- create CFML --->

<cfset cfml_1 = '<cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif><cfset x = 1><cfif x is 1>1<cfelse>2</cfif>'>

<!--- <cfset cfml_2 = '<cfset x = 1>'>  --->

<cfloop from="1" to="100" index="index">

<cfset filename = '#index#wildcardparsing-#createUUID()#.cfm'>

<cfset local.submissionTimerStart1=gettickcount()>

<cffile action="write" output="#cfml_1#" file="#tempfilepath##filename#">

<!--- <cffile action="write" output="#cfml_2#" file="#tempfilepath##filename#"> --->

<cfset local.submissionTimerStart2=gettickcount()>

<cfsavecontent variable="parsedSTR">

<cfinclude template="#tempIncludefilepath##filename#" />

</cfsavecontent>

<cfset local.submissionTimerStart3=gettickcount()>

<cfoutput>  

<cfif index mod 10 is 0>

<p> Loop index: #index#

<p> Execution time for 'file-write'= #local.submissionTimerStart2 - local.submissionTimerStart1# ms

<p> Execution time for 'cfsavecontent'= #local.submissionTimerStart3 - local.submissionTimerStart2# ms

</cfif>

</cfoutput>

</cfloop>

If you test with cfml_1, the execution times at every tenth step, will be something like:

Loop index: 10

Execution time for 'file-write'= 16 ms

Execution time for 'cfsavecontent'= 27 ms

Loop index: 20

Execution time for 'file-write'= 14 ms

Execution time for 'cfsavecontent'= 23 ms

Loop index: 30

Execution time for 'file-write'= 13 ms

Execution time for 'cfsavecontent'= 23 ms

Loop index: 40

Execution time for 'file-write'= 13 ms

Execution time for 'cfsavecontent'= 23 ms

Loop index: 50

Execution time for 'file-write'= 13 ms

Execution time for 'cfsavecontent'= 26 ms

Loop index: 60

Execution time for 'file-write'= 12 ms

Execution time for 'cfsavecontent'= 23 ms

Loop index: 70

Execution time for 'file-write'= 13 ms

Execution time for 'cfsavecontent'= 23 ms

Loop index: 80

Execution time for 'file-write'= 13 ms

Execution time for 'cfsavecontent'= 24 ms

Loop index: 90

Execution time for 'file-write'= 13 ms

Execution time for 'cfsavecontent'= 25 ms

Loop index: 100

Execution time for 'file-write'= 17 ms

Execution time for 'cfsavecontent'= 24 ms

However, when you test with the shorter string, cfml_2, you get:

Loop index: 10

Execution time for 'file-write'= 15 ms

Execution time for 'cfsavecontent'= 5 ms

Loop index: 20

Execution time for 'file-write'= 16 ms

Execution time for 'cfsavecontent'= 7 ms

Loop index: 30

Execution time for 'file-write'= 14 ms

Execution time for 'cfsavecontent'= 5 ms

Loop index: 40

Execution time for 'file-write'= 15 ms

Execution time for 'cfsavecontent'= 4 ms

Loop index: 50

Execution time for 'file-write'= 13 ms

Execution time for 'cfsavecontent'= 4 ms

Loop index: 60

Execution time for 'file-write'= 14 ms

Execution time for 'cfsavecontent'= 4 ms

Loop index: 70

Execution time for 'file-write'= 13 ms

Execution time for 'cfsavecontent'= 4 ms

Loop index: 80

Execution time for 'file-write'= 13 ms

Execution time for 'cfsavecontent'= 4 ms

Loop index: 90

Execution time for 'file-write'= 13 ms

Execution time for 'cfsavecontent'= 4 ms

Loop index: 100

Execution time for 'file-write'= 17 ms

Execution time for 'cfsavecontent'= 4 ms

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Oct 17, 2017 Oct 17, 2017

Copy link to clipboard

Copied

Brook, did your problem ever get resolved?

If it did not, I would be curious what would happen if you removed the two FR arguments in the jvm.config (javaagent and agentpath), but especially the agentpath as that enables the FR debugger feature in FR Ultimate. That alone should not cause impact, but in early versions of FR Ultimate it turned out it could.

So first, what version of FR are you on (or do you know what you were on then)? And even before answering that question, if you are still having the problem, when you go to the Debug>Exceptions page, do you show it enabled? Or do you see a big pink error warning of the need to turn on another JVM arg (which I can see you have not done) in order to do break on exceptions?

BTW, I ask about FR because you show about having the FR args in the jvm.config, but you do NOT show having the debug and jdwp args which CF would put in there, if you enabled the CF debugging feature. I point this out because for other readers who may come across this, if you see slow compile times, and you DO show those debug args in there, that could cause your poor compile-time performance. It turns out the java debugging feature trips over excessive exception processing which happens in most CF compilation. (It's a know issue to Adobe, but it's not something most people would ever see except when debugging features trip over it, trying to handle exceptions.

Indeed, this is the same reason that older versions of FR Ultimate also caused the problem (if the agentpath was implemented, which is how they implemented support for the FR Ultimate debugger, not needing the traditional java debug arg). Again, FR has been fixed to no longer cause that impact (unless you specifically add the other argument in the aforementioned pink warning box, shown in later versions of FR is you DO want to have FR's debugger "break on exceptions".)


/Charlie (server troubleshooter, carehart.org)

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Dec 01, 2017 Dec 01, 2017

Copy link to clipboard

Copied

Hey Charlie!

Haven't tested the performance of that code for a while. These JVM args from our DEV server which has fusionReactor ENT Edition v.6. In production we have the same version of FR and I see:

javaagent:C:/FusionReactor/instance/cfusion.cf2016/fusionreactor.jar=name=cfusion.cf2016,address=[masked]:8088

-agentpath:C:/FusionReactor/instance/cfusion.cf2016/frjvmti_x64.dll

In the JVM config, but I don't see the debug option in the FR admin page. Should I remove the javaagent and agentpath on our production server?

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Dec 01, 2017 Dec 01, 2017

Copy link to clipboard

Copied

Hi, Brook. First, there is nothing wrong with having FR enabled in production. It is indeed a tool meant to be used in production, and it should never have any noticeable impact. But there can be features one enables in it that can have impact (and it usually warns you of that), or there can be bugs.

And I was referring to a combination of the two: a bug in an older FR version which caused slow compile times if you turned on a certain feature.

And where you said that your FR version was "fusionReactor ENT Edition v.6", that's a common misunderstanding. You saw that at the top of the "about" page (either when you opened FR, or if you went to the "About" menu option on the "FusionReactor" button at the top left). But what you quoted is the first line on that page, which is NOT your version. (It's an easy mistake to misinterpret it.)

Instead, look at the 4th line from the bottom. It may be something like 6.2.1 or 7.0.2 or 7.1.0 (the latest version, but I doubt you have that). My point was that being an older version, there was a time where if you enabled the "break on exceptions" feature of the FR debugger, it caused this problem. In later versions, it warns you need to add another JVM arg to enable that feature, meaning you are accepting that impact.

Finally, you said you did look for that, and "don't see the debug option in the FR admin page". It's not in the CF Admin. When I said "go to the Debug>Exceptions page", I meant in FusionReactor, using its buttons on the left. (And that "Debug" button will only appear to those using FusionReactor Ultimate edition.)

With all that said, perhaps if you now re-read what I wrote it will make sense. 🙂


/Charlie (server troubleshooter, carehart.org)

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Dec 01, 2017 Dec 01, 2017

Copy link to clipboard

Copied

It all makes sense now, thanks Charlie!!

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Dec 02, 2017 Dec 02, 2017

Copy link to clipboard

Copied

brookd

It might help to optimize the Garbage Collection of your ColdFusion instance. From your description, I am supposing that your CFM pages are "memory intensive and allocate a lot of objects". If so, then the throughput/parallel garbage collector is the one for you. Let us know if it helps.

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Dec 02, 2017 Dec 02, 2017

Copy link to clipboard

Copied

BKBK, I appreciate that you’re just trying to help Brook if your suggestion might help, but I really don’t see a connection between the GC algorithm (which runs when objects are created on the heap and determined to be no longer needed) and compilation (which has nothing itself to do with the heap). Care to elaborate on the connection you see? I’m open to being schooled.

And you may want to share more on how one would determine when their apps are “memory intensive and allocate a lot of objects”. I find a lot of people experience more trouble than help when tweaking GC algorithms and related arguments, so it’s helpful to get more specifics on what people should observe to determine when to change them, as well as what to “watch out” for if they do.

/charlie


/Charlie (server troubleshooter, carehart.org)

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Dec 03, 2017 Dec 03, 2017

Copy link to clipboard

Copied

LATEST

We have supposed that the performance drop is all at compile-time. My question is, what if some of the time we observe at the ColdFusion level includes time incurred at Java runtime - after objects have been created and allocated? If changing the Garbage Collector has an effect, then that will be a clue.

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Dec 02, 2017 Dec 02, 2017

Copy link to clipboard

Copied

Good to hear. If you’re still having the problem, can you confirm both the FR version and whether the debug on exception feature is enabled?

/charlie


/Charlie (server troubleshooter, carehart.org)

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines