Il tuning e l’ispezione puntuale della Java Virtual Machine è un’attività molto importante e spesso trascurata da chi sviluppa applicativi in java. Installazioni di Alfresco di tipo enterprise in cui circolano enormi quantità di dati, sono spesso sottoposte a un carico di lavoro talmente elevato che rende obbligatori interventi di ottimizzazione e di monitoraggio delle risorse utilizzate. Come per tutte le applicazione sviluppate in java, l’utilizzo di Alfresco può essere ottimizzato grazie a un’attenta e meticolosa attività di configurazione e tuning delle risorse hardware, nello specifico cpu e ram, utilizzate dalla JVM. Non mi addentro nei dettagli per quanto riguarda la gestione dei thread in java, ulteriori approfondimenti si possono trovare qui.
In questo articolo riporto alcune best practices su come ottimizzare l’utilizzo della JVM in Alfresco agendo direttamente sui parametri di configurazione della java heap memory per archiettetture a 64 bit. Per il tuning dalla JVM, il wiki ufficiale di Alfresco suggerisce questo approccio:
– partire assegnando alla JVM quanta più ram possibile
– impostare -XX:MaxPermSize:256m
– non aggiungere altri parametri di configurazione
Una volta assegnata alla heap memory il valore massimo consentito in base alle risorse fisiche disponibili, si può procedere con l’aggiunta di ulteriori parametri di configurazione modificando la variabile JAVA_OPTS che si trova nello script di avvio di Alfresco. In una installazione di default la variabile JAVA_OPTS si presenta impostata conme segue:
JAVA_OPTS="-XX:MaxPermSize=512m -Xms128m -Xmx1024m -XX:-DisableExplicitGC" JAVA_OPTS="${JAVA_OPTS} -Djava.awt.headless=true" JAVA_OPTS="${JAVA_OPTS} -Dalfresco.home=/opt/alfresco-4.1.1.3" JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote -Dsun.security.ssl.allowUnsafeRenegotiation=true"
Questa configurazione di default rappresenta già un ottimo punto di partenza per le attività di tuning. I parametri su cui fare attenzione sono:
-XX:MaxPermSize=512m – dimensione massima della Permanent Generation
-Xms128m – dimensioni minime per la heap memory
-Xmx1024m – dimensioni massime per la heap memory
Nelle recenti documentazioni, Alfresco ha rilasciato una tabella con dei valori indicativi per la heap memory in base al numero di utenti che accedono al sistema.
– numero di utenti concorrenti: utenti che accedono via web al sistema 24/7 con un intervallo di 3-10 secondi tra una request e l’altra
– numero di utenti casuali: utenti che accedono al sistema sia via web sia via cifs in maniera occasionale nell’arco della giornata lavorativa
– metrica utilizzata: N utenti concorrenti sono equivalenti a 10xN utenti casuali
Riporto una tipica configurazione per un server virtuale con 10 GB di ram e 4 core virtuali su cui è in esecuzione Alfresco+Solr con circa 5Mln di documenti e accesso via http.
JAVA_OPTS="-XX:MaxPermSize=512m -Xms8000m -Xmx8000m -XX:-DisableExplicitGC" JAVA_OPTS="${JAVA_OPTS} -Djava.awt.headless=true" JAVA_OPTS="${JAVA_OPTS} -Dalfresco.home=/opt/alfresco-4.1.1.3" JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote -Dsun.security.ssl.allowUnsafeRenegotiation=true" JAVA_OPTS="${JAVA_OPTS} -Xss1024K -XX:NewSize=1G -XX:+UseConcMarkSweepGC -server" JAVA_OPTS="${JAVA_OPTS} -XX:+CMSIncrementalMode -XX:CMSInitiatingOccupancyFraction=80" JAVA_OPTS="${JAVA_OPTS} -XX:ParallelGCThreads=4 -XX:+UseParNewGC"
Un altra attività importantissima per ottimizzare Alfresco è il monitoraggio puntuale degli oggetti istanziati dall JVM. Riporto due approcci frequentemente utilizzati per monitorare remotamente e in tempo reale un server dove è in esecuzione Alfresco.
Caso 1. Monitor JVM utilizzando il demone jstad con jvisualvm.
– Server JVM
$ vi JAVA_HOME_SERVER/bin/jstatd.policy grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; }; $ ./jstatd -J-Djava.security.policy=./jstatd.policy -J-Djava.rmi.server.hostname=192.168.71.64
– Client JVM
$ JAVA_HOME/jvisualvm
Dalla barra menu installare i plugin Visual GC e MBeans. Al termine dell’installazione aggiungere la connessione al server remoto su cui è in esecuzione Alfresco e il demone jstatd.
Caso 2. Monitor JVM con JMX e jvisualvm (Alfresco Enterprise 3.2 e superiori)
– Server JVM
Non ci sono particolari configurazioni da fare lato server poichè Alfresco di default è configurato già per essere raggiunto via JMX sulla porta 50500. L’unica nota va fatta per installazioni in cluster di Alfresco su server con due interfacce di rete. Su RedHat/CenOS è necessario impostare esplicitamente l’hostname per l’adapter RMI su cui connettersi via JMX. Si può fare impostando l’entry su /etc/hosts oppure avviando Alfresco con il parametro java.rmi.server.hostname che punta all’IP del server.
$ vi /etc/hosts 192.168.1.23 myalfresco $ vi ALFRESCO_HOME/tomcat/scripts/ctl.sh JAVA_OPTS="-Djava.rmi.server.hostname=192.168.1.23 -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Addresses=false"
– Client JVM
Avviare jvisualvm e aggiungere una connessione JMX con le credeniziali di default.
service:jmx:rmi:///jndi/rmi://192.168.1.23:50500/alfresco/jmxrmi -username (default): controlRole -password (default): change_asap
great article…;)
Thanks guy!!!
😉