ColdFusion Performance Troubleshooting and Tuning Grant Straker Technical Director Straker Interactive CFUNITED – The premier ColdFusion conference www.cfunited.com
What I’ll Cover Why we need to performance tune Understanding the architecture Principles of Troubleshooting / Tuning How to setup a Test Rig Troubleshooting / Tuning process Caching Strategies Memory Leaks June 28th – July 1st 2006
Technology Gap Acceptable Deployment Time Technology Gap Time Application Load / Complexity 1950 1980 2000 Year June 28th – July 1st 2006
CFMX Architecture June 28th – July 1st 2006
Principle One 3 Sources of performance problems CPU Bottleneck (Threads) Memory Management Network / Disk (IO) problems June 28th – July 1st 2006
Principle Two To find the issue you will have to: Simulate the load under which the system is failing Record the relevant diagnostics when the system is failing Interpret the results and adjust the application code and/or server configuration accordingly June 28th – July 1st 2006
Principle Three There are 5 things you can adjust (tune) to try and resolve any issues: Application Code ColdFusion Administration Settings Application Server Settings (JRun / JVM) Web Server Settings OS & Network Settings June 28th – July 1st 2006
Troubleshooting Prerequisites Getting up-to-date ColdFusion http://www.macromedia.com/cfusion/knowledgebase/index.cfm?id=tn_17883 Jrun http://www.macromedia.com/support/jrun/updaters.html June 28th – July 1st 2006
Metric Logs /CFusionMX/runtime/servers/default/SERVER-INF/jrun.xml /jrun4/servers/[instance name]/SERVER-INF/jrun.xml busy - Threads that are running (executing code) this number will not exceed jrpp active threads for JRun or simultaneous request set in the cfadmin total - Total number or jrpp and web threads that are currently available. June 28th – July 1st 2006
Create a trace log All requests not just current request (cfdebugging) Can be added to give more granular details Easily turn on/off Low overhead SeeFusion June 28th – July 1st 2006
Load Testing Accurately Simulate Real Load Benchmarks Input Users / Requests Output Throughput CPU JVM Threads June 28th – July 1st 2006
Options Paessler Web Stress Microsft Web App Stress Tool Mercury LoadRunner Segue Silk Performer Appperfect June 28th – July 1st 2006
Test Rig - Debug Console Garbage Collection JRun Metrics Server Stats CF Error Log Trace Log June 28th – July 1st 2006
Thread Dumps Tell us low level information about current running processes / Threads in the JVM Give us diagnostics Will pinpoint performance bottlenecks 99% of the time Are easy to take but require a bit of understanding Take 3, 15 seconds apart – check for common threads across all 3 dumps June 28th – July 1st 2006
Troubleshooting Process Simulate Load Review Debug Output Take Thread Dumps Adjust Code Repeat until resolved June 28th – July 1st 2006
Tuning JRun Jrun.xml Scheduler Service internal Jrun service that handles the queuing of threads to the processor Proxy Service internal Jrun service that handles the connection between native web servers (IIS, Apache) and Jrun activeHandlerThreads is the most important attribute June 28th – July 1st 2006
Tuning JRun Continued… Active Handler Threads – 25 default for both SCHEDULER and PROXY services. Recommend 25 Per processor (4 x processor = 100) Set too low = bottlenecks, thread deadlocks Set too high = excessive context switching Needs to be tuned June 28th – July 1st 2006
Tuning JVM -Xmx most important – 1GB max on windows -Xmx too big = long GC cycles -Xmx too small = OOM Errors Permsize also important GC monitoring Various switches to assist June 28th – July 1st 2006
Tuning JVM continued… Different Types of Collectors Low Pause Parallel -XX:+UseConcMarkSweepGC -XX:+UseParNewGC Parallel Scavenge -XX:+UseParallelGC -XX:+UseAdaptiveSizePolicy -XX:+AgreesiveHeap June 28th – July 1st 2006
Alternate JVM’s JRockit (BEA) IBM Not all JVM’s are the same and need to be thoroughly tested before switching. June 28th – July 1st 2006
Java 1.5 Not a currently supported version of CFMX Will run on CF7.1 and JRun updater 6 Much better performance Excellent debugging June 28th – July 1st 2006
Memory Leaks Prevention is easier than diagnostics Requires Java profiling tool to accurately identify Easier to find in Java 1.5 JVM’s If memory increases after forcing GC June 28th – July 1st 2006
Caching Strategies Store instantiated objects in application scope – careful as incorrectly scoped variables may cause memory leaks Memory Caching Limited by size of Heap Requires and architecture for clearing cached item June 28th – July 1st 2006
Database Performance JDBC Trace Tools SeeFusion Maxrows Only use “Select *” if you really have no option Use cfqueryparam to increase query performance Use blockFactor to increase query performance June 28th – July 1st 2006
Coding for performance Don’t Run a query larger than the size of the heap Ensure all your variables and functions stored in persistent scope are var’ed. Code to allow for slow or missing connections to the database or file system Don’t run process intensive external calls on every request Ensure you use all the caching options available Tune your server for your application June 28th – July 1st 2006