09 marzo 2010

Linux - JBoss - Ottimizzazioni, perfomance e tuning

Considerando una installazione di JBoss in ambiente Linux a 32 bit. L'utente che esegue JBoss è "root", l'installazione è in /usr/local/jboss-4.0.4.GA


Questo è il file contenente i parametri di ottimizzazione di JBoss: /usr/local/jboss-4.0.4.GA/bin/run.conf in cui sostituiremo la seguente stringa:

JAVA_OPTS="-server -Xms1048m -Xmx1048m -XX:ThreadStackSize=128 -XX:MaxPermSize=256m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dfile.encoding=ISO-8859-1 -Duser.timezone=Europe/Rome"

Le opzioni selezionate servono a bilanciare la quantità di Heap Size e il numero di Threads Disponibili, infatti in un ambiente a 32 bit la quantità totale disponibile di memoria per singolo processo è di circa 1.5Mbyte, se l'Heap Size (Xms e Xmx) è troppo alta, la memoria disponibile per i Thread (ThreadStackSize) limita il numero di Thread disponibili.


Nel file /etc/sysctl.conf inseriamo i parametri di ottimizzazione del kernel

net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 20
kernel.shmmax=2147483648
kernel.sem=250 32000 100 128
fs.file-max=794598
net.ipv4.ip_local_port_range=1024 65000
net.core.rmem_default=262144
net.core.wmem_default=262144
net.core.rmem_max=262144
net.core.wmem_max=262144



Nel file /etc/security/limits.conf aumentiamo il numero di file che possono essere aperti, naturalmente se l'utente con cui viene fatto girare JBoss è diverso dovrà essere modificato di conseguenza:

root           soft    nofile          790598
root           hard    nofile          790598



Nel caso di connessioni verso un database Oracle occorre modificare e ottimizzare il seguente file /usr/local/jboss-4.0.4.GA/server/all/deploy/oracle-ds.xml per aumentare il numero di pool di connessioni.

<min-pool-size>100</min-pool-size>
<max-pool-size>100</max-pool-size>

Se JBoss viene indirizzato da un Load Balancer che verifica la disponibilità del servizio attraverso il protocollo AJP è necessario aumentare il tempo di timeout nel file server.xml del Tomcat embedded in JBoss:

 <!-- A AJP 1.3 Connector on port 8009 -->
      <Connector port="8009" address="${jboss.bind.address}"
         emptySessionPath="true" enableLookups="false" redirectPort="8443"
          connectionTimeout="600000" maxThreads="200" keepAliveTimeout="600000"
         protocol="AJP/1.3"/>

Script di start, stop e restart di JBoss da inserire in /etc/init.d/jboss


#!/bin/sh
#
# JBoss Control Script
#
# chkconfig: 3 80 20
# description: JBoss EJB Container
#
# To use this script
# run it as root - it will switch to the specified user
# It loses all console output - use the log.
#
# Here is a little (and extremely primitive)
# startup/shutdown script for RedHat systems. It assumes
# that JBoss lives in /usr/local/jboss, it's run by user
# 'jboss' and JDK binaries are in /usr/local/jdk/bin. All
# this can be changed in the script itself.
# Bojan

# [ #420297 ] JBoss startup/shutdown for RedHat

export JAVA_HOME="/usr/java/jdk1.5.0_10"
export LD_LIBRARY_PATH="/home/oracle/instantclient/lib"
export ORACLE_HOME="/home/oracle/instantclient"
export PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/usr/java/jdk1.5.0_10/bin:/root/bin"
export TNS_ADMIN="/home/oracle/instantclient"

#define where jboss is
JBOSS_HOME=${JBOSS_HOME:-"/usr/local/jboss-4.0.4.GA"}

#make java is on your path
JAVAPTH=${JAVAPTH:-"/usr/java/jdk1.5.0_10/bin"}

#define the classpath for the shutdown class
JBOSSCP=${JBOSSCP:-"$JBOSS_HOME/bin/shutdown.jar:$JBOSS_HOME/client/jbossall-client.jar"}

#define the script to use to start jboss
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c all"}
if [ -n "$JBOSS_CONSOLE" -a ! -d "$JBOSS_CONSOLE" ]; then
  # ensure the file exists
  touch $JBOSS_CONSOLE
fi

if [ -n "$JBOSS_CONSOLE" -a ! -f "$JBOSS_CONSOLE" ]; then
  echo "WARNING: location for saving console log invalid: $JBOSS_CONSOLE"
  echo "WARNING: ignoring it and using /dev/null"
  JBOSS_CONSOLE="/dev/null"
fi


#define what will be done with the console log
JBOSS_CONSOLE=${JBOSS_CONSOLE:-"/dev/null"}
CMD_START="cd $JBOSS_HOME/bin; $JBOSSSH"

# inserire la password per lo shutdown
CMD_STOP="$JBOSS_HOME/bin/shutdown.sh -S -u admin -p admin"

# se l'utente è diverso da root inserire il comando su -
SUBIT=""
if [ -z "`echo $PATH | grep $JAVAPTH`" ]; then
  export PATH=$PATH:$JAVAPTH
fi
if [ ! -d "$JBOSS_HOME" ]; then
  echo JBOSS_HOME does not exist as a valid directory : $JBOSS_HOME
  exit 1
fi
echo CMD_START = $CMD_START

case "$1" in
start)
    cd $JBOSS_HOME/bin
    if [ -z "$SUBIT" ]; then
        eval $CMD_START >${JBOSS_CONSOLE} 2>&1 &
    else
        $SUBIT "$CMD_START >${JBOSS_CONSOLE} 2>&1 &"
    fi
    logger "Jboss Started"
    ;;

stop)
    if [ -z "$SUBIT" ]; then
        $CMD_STOP
    else
        $SUBIT "$CMD_STOP"
    fi
    logger "Jboss Stopped"
    ;;

restart)
    $0 stop
        sleep 10
    $0 start
    ;;

*)
    echo "usage: $0 (start|stop|restart|help)"

esac

Nessun commento: