also known as: "Squeezing performance of a Lucee application using FusionReactor"
CFML: Performance and Stability
Tales from the front line
Photo by Mikita Karasiou on Unsplash
About me, briefly
CTO @ The Pixl8 Group
(Preside Platform)
CFML: Performance and Stability
CFML: Performance and Stability
Reminder #1
Be good to yourselves
CFML: Performance and Stability
What we'll try to cover
- Basics of performance debugging (briefly)
-
Tooling
- Monitoring
- Load testing
- Diagnostics
- Java memory - oh joy
- Locking - all the joy
- Concurrency
- Some CFML code gotchas that might be news
CFML: Performance and Stability
What we'll won't cover
- Frontend performance
- Database performance
CFML: Performance and Stability
Performance Debugging 101
#1 Use the Lucee/ColdFusion debug logging
CFML: Performance and Stability
Performance Debugging 101
#2 Server logs
- Know where they are (and what)
- System out (e.g. /opt/lucee/tomcat/logs/catalina.out)
- Lucee/ACF specific logs such as application log, exception log, thread log, mail log, scheduler log, etc.
- Your web server logs (IIS/Apache/Nginx)
- DB Logs -> Slow query logging, error logging, etc.
CFML: Performance and Stability
Monitoring tools
#1 Wholistic monitoring: e.g. Zabbix
#!/bin/bash
ZABBIX_REPORT_FILE=/tmp/tcpzabbixreport.txt
SENDER=`which zabbix_sender`
rm -f $ZABBIX_REPORT_FILE
TOTAL=`netstat --tcp --numeric-ports -n | wc -l`
ELASTIC=`netstat --tcp --numeric-ports -n | grep ":9200" | wc -l`
TOMCAT=`netstat --tcp --numeric-ports -n | grep ":8888" | wc -l`
MYSQL=`netstat --tcp --numeric-ports -n | grep ":3306" | wc -l`
HTTP=`netstat --tcp --numeric-ports -n | grep ":80" | wc -l`
HTTPSSL=`netstat --tcp --numeric-ports -n | grep ":443" | wc -l`
ZABBIXAGENT=`netstat --tcp --numeric-ports -n | grep ":10050" | wc -l`
TOTAL_LISTENING=`netstat --tcp --numeric-ports --listen -n | wc -l`
MYSQL_LISTENING=`netstat --tcp --numeric-ports --listen -n | grep ":3306" | wc -l`
ELASTIC_LISTENING=`netstat --tcp --numeric-ports --listen -n | grep ":9200" | wc -l`
TOMCAT_LISTENING=`netstat --tcp --numeric-ports --listen -n | grep ":8888" | wc -l`
HTTP_LISTENING=`netstat --tcp --numeric-ports --listen -n | grep ":80" | wc -l`
HTTPSSL_LISTENING=`netstat --tcp --numeric-ports --listen -n | grep ":443" | wc -l`
ZABBIXAGENT_LISTENING=`netstat --tcp --numeric-ports --listen -n | grep ":10050" | wc -l`
ENTROPY=`cat /proc/sys/kernel/random/entropy_avail`
echo "- netstat[tcp.total] $TOTAL" >> $ZABBIX_REPORT_FILE
echo "- netstat[tcp.es] $ELASTIC" >> $ZABBIX_REPORT_FILE
echo "- netstat[tcp.tomcat] $TOMCAT" >> $ZABBIX_REPORT_FILE
echo "- netstat[tcp.mysql] $MYSQL" >> $ZABBIX_REPORT_FILE
echo "- netstat[tcp.http] $HTTP" >> $ZABBIX_REPORT_FILE
echo "- netstat[tcp.httpssl] $HTTPSSL" >> $ZABBIX_REPORT_FILE
echo "- netstat[tcp.zabbix] $ZABBIXAGENT" >> $ZABBIX_REPORT_FILE
echo "- netstat[tcp.total.listening] $TOTAL_LISTENING" >> $ZABBIX_REPORT_FILE
echo "- netstat[tcp.es.listening] $ELASTIC_LISTENING" >> $ZABBIX_REPORT_FILE
echo "- netstat[tcp.tomcat.listening] $TOMCAT_LISTENING" >> $ZABBIX_REPORT_FILE
echo "- netstat[tcp.mysql.listening] $MYSQL_LISTENING" >> $ZABBIX_REPORT_FILE
echo "- netstat[tcp.http.listening] $HTTP_LISTENING" >> $ZABBIX_REPORT_FILE
echo "- netstat[tcp.httpssl.listening] $HTTPSSL_LISTENING" >> $ZABBIX_REPORT_FILE
echo "- netstat[tcp.zabbix.listening] $ZABBIXAGENT_LISTENING" >> $ZABBIX_REPORT_FILE
echo "- entropy[bytes.available] $ENTROPY" >> $ZABBIX_REPORT_FILE
$SENDER -vv -c /etc/zabbix/zabbix_agentd.conf -i $ZABBIX_REPORT_FILE
CFML: Performance and Stability
Monitoring tools
#2 Detailed error logging, e.g. Sentry
CFML: Performance and Stability
Monitoring tools
#3 Live JMX Monitoring
VisualVM
JConsole
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.local.only=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=monitoring.hostname.com"
CFML: Performance and Stability
Monitoring tools
#4 Live JMX Monitoring and then some
CFML: Performance and Stability
Performance Problems
Common Problems and where to find them
CFML: Performance and Stability
Performance Problems
#1 Are you waiting on externals?
- CFHTTP, CFLDAP, etc. - Always put timeouts on them
- Database queries - find slow queries and deal with them
<cfhttp ... timeout=sensibleTimeout>
CFML: Performance and Stability
Performance Problems
#2 Memory issues
"Java manages memory all by itself for you. So you don't have to care."
End of slide.
CFML: Performance and Stability
Performance Problems
Java Memory
Heap
-Xms 102400m -Xmx 102400m
Meta
-XX:MaxMetaspaceSize=512M
-XX:MetaspaceSize=256M
Stack
CFML: Performance and Stability
Performance Problems
Java Memory
Meta
-XX:MaxMetaspaceSize=512M
-XX:MetaspaceSize=256M
CFML: Performance and Stability
Performance Problems
Java Memory
Heap
-Xms 102400m -Xmx 102400m
CFML: Performance and Stability
Performance Problems
Java Memory
New Gen
Old Gen
Eden
S1
S2
XX:NewRatio=2 -XX:SurvivorRatio=6
CFML: Performance and Stability
Performance Problems
Java Memory
java.lang.OutOfMemory
PermGen Space
UPGRADE JAVA!!
CFML: Performance and Stability
Performance Problems
Java Memory
java.lang.OutOfMemory
Heap Space
Investigate...
CFML: Performance and Stability
Performance Problems
Java Memory
java.lang.OutOfMemory
Heap Space
CFML: Performance and Stability
Performance Problems
Java Memory
java.lang.OutOfMemory
Heap Space
Get a heap dump
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tmp/heapdump.hprof
CFML: Performance and Stability
Performance Problems
Java Memory
java.lang.OutOfMemory
Heap Space
Analyze your heap dump
CFML: Performance and Stability
Performance Problems
Java Memory
Application goes slow, eventually "stops"
CFML: Performance and Stability
Performance Problems
Java Memory
Application goes slow, eventually "stops"
CONCURRENCY!!!
CFML: Performance and Stability
Performance Problems
Concurrency
ab -c 100 -n 10000000 http://someurl.com/
Apache2 Utils
CFML: Performance and Stability
Performance Problems
Concurrency
Concurrency != Requests per second
MAXTHREADS - Your friend
<Service name="Catalina">
<Connector port="8888" maxThreads="50" ... />
CFML: Performance and Stability
Performance Problems
Concurrency
Concurrency + locking
More locks = less concurrency
Take thread dumps
https://fastthread.io
CFML: Performance and Stability
Performance Problems
Summarize
Monitor:
- Logs
- Errors (Sentry, etc.)
- OS Perf (Zabbix, etc.)
- All the java (FusionReactor)
Test
- Load (Gatling, JMeter, Apache AB)
- CONCURRENCY CONCURRENCY
Analyze
- FusionReactor
- fastthread.io
- Eclipse MAT
Know
- Your application limits
Be
- Good to yourself!
Thanks for listening
https://www.preside.org
https://www.preside.org/signup
https://www.preside.org/slack
https://presidecms.atlassian.net
@dom_watson
@dom_watson
CTO @ Pixl8 Group
Preside lead developer
Improving performance and stability of CFML applications with FusionReactor (and more)
By Dominic Watson
Improving performance and stability of CFML applications with FusionReactor (and more)
It is early 2019, some of our complex web applications show signs of instability at relatively unpredictable times. Our extensive resource monitoring shows no particular pattern, web traffic logs again prove fruitless. Enter FusionReactor and some determination to get to the bottom of things. Dominic will take you through in detail how he discovered seemingly minor changes in Pixl8’s core platform stack that made some drastic improvements to performance. Come along if you’re interested in: * Micro optimization * Getting to the bottom of hard to debug problems * Improving overall problems in your applications
- 1,138