JBoss AS: Dicas para Turbinar o servidor de Aplicações JBoss 7
Bruno Rossetto Machado
Claudio MirandaArquiteto de Sistemas
Red Hat Brasil
Principal Support EngineerRed Hat Brasil
Agenda
• Tuning• Threading• Slimming• MSC - Modular Service Container • Logging• Datasource• Dicas
Tuning
• Nível de personalização extrema• Maior performance, segurança, agilidade e beleza• Tornando-se diferente e único
Antes do tuning
• Precisa fazer tuning ?• Verifique onde efetuar a melhoria• Qual a parte que necessita melhorar
o Aplicaçãoo Servidor
• Testes de Performance e Stress• Documentação
Slimming: Retirando serviços do JBoss AS
Tempo de inicialização
DEMO
MSC - Modular Service Container
• AS7 baseado no MSC • Leve e eficiente• Inicialização assíncrona de serviços• Maquina de estados: UP, DOWN, REMOVED,
STARTING, STOPPING,START_FAILED• Gerenciamento de dependências• Maiores detalhes na palestra "JBoss AS 7" as 17:30 com
Flavia Rainone, no auditório.
MSC - Modular Service Container
Domains, Servers e Controllers
* Modo “domain” ou “domínio” = Conjunto de servidores* Domain Controller é o gerenciador* Server group = agregação de instâncias* Foco: Gerenciamento de Vários servidores em uma interface
Versatilidade com os serviços doJBoss AS
o Executar o container Java EE em um teste unitárioo Utilizar uma VM com o App. Server por aplicaçãoo Executar em ambientes como cloud, celulares, etco Desenvolvimento extremamente rápidoo Rodar diversas instâncias em seu laptop
AS7: socket-binding-group e port-offset
• Diferentes portas podem ser configuradas de forma automatizada com o atributo port-offset
• standalone.xml<socket-binding-group name="standard-sockets" default-interface="public" port-offset="100">
• domain.xml<server ...><socket-binding-group ref="standard-sockets" port-offset="150"/></server><server ...><socket-binding-group ref="ha-sockets" port-offset="250"/></server>
AS7: socket-binding-group e port-offset
• Command-Line Interface (CLI)$ ./jboss-admin.sh --connectConnected to standalone controller at localhost:9999
[standalone@localhost:9999 /] /socket-binding-group=standard-sockets:read-resource-description
[standalone@localhost:9999 /] /socket-binding-group=standard-sockets:write-attribute(name=port-offset,value=200)
DEMO
AS7: subsystem=web
• /subsystem=web/connector=http<subsystem xmlns="urn:jboss:domain:web:1.0" default-virtual-server="default-host"><connector name="http" protocol="HTTP/1.1" socket-binding="http" scheme="http" max-connections="200"/><virtual-server name="default-host" enable-welcome-root="true"><alias name="localhost"/><alias name="example.com"/></virtual-server></subsystem>
• Atributo max-connections
AS7: subsystem=web
• Caso seja necessário, adicione o connector AJPo É utilizado quando as requisições passam pelo mod_cluster,
mod_jk ou mod_proxy_ajp para balancemanto de carga
[standalone@localhost:9999 /] /socket-binding-group=standard-sockets/socket-binding=ajp:add(port=8009) {"outcome" => "success"}[standalone@localhost:9999 /] /subsystem=web/connector=ajp:add(socket-binding=ajp, protocol="AJP/1.3", enabled=true){"outcome" => "success"}
DEMO
Tuning de JVM Heap e Perm• -Xms -Xmx -XX:MaxPermSize
Algoritmos de GC• Throughput Collectors
o -XX:+UseParallelGCo -XX:+UseParallelOldGC
• Concurrent Mark-Sweep (CMS) Collectoro -XX:+UseConcMarkSweepGCo -XX:+UseConcMarkSweepGC - XX:+UseParNewGC
• G1 - JDK 1.6u14 ou JDK 7o -XX:+UseG1GC o Combina características do CMS e Paralelo o Suporte parcial a JVMTI
Tuning de JVM• Recomendações-XX:+UseCompressedOops (quando 64 bits)-XX:+CMSClassUnloadingEnabled -XX:+DisableExplicitGC-Xss256k bin/domain.conf bin/standalone.conf - OU<server-groups> <server-group name="group1" profile="default"> <jvm name="default"> <heap size="64m" max-size="512m"/>
Logging
• As configurações de fábrica são muito boas para desenv, mas não são apropriadas para produçãoo Nível de log é muito detalhado
Sempre que possível diminua para WARN ou ERROR O maior responsável pelo atraso é o I/O. Quanto menos I/O,
melhor performanceo Log duplicado em server.log e CONSOLE
Desabilite o output CONSOLE
Logging• Diretórios de log default:
o standalone: {jboss.home}/standalone/log ou o domain: {jboss.home}/domain/log/host-controller
{jboss.home}/domain/log/process-controller {jboss.home}/domain/servers/server-one/log
• Separe o diretório gravação de logo Pode-se criar partição dedicada a logo Não irá impactar o App Server caso ocorra um DiskFull
-Djboss.server.log.dir=”/var/log/jboss”
• Limite o log em suas classeso if (logger.debugEnabled()) { logger.debug(“bla”); }
Caso contrário, sua aplicação irá criar instâncias de String para cada declaração e o Log4j irá criar LoggingEvent
Datasource
• É um dos pontos mais importantes do Tuningo Necessário entender quanto sua aplicação precisa para atender à
demanda atual de requisições Utilize ferramentas de monitoração Deve-se pensar em um valor que não prejudique a performance
do Banco de Dados e limite seu acesso. Melhor estourar o limite do pool do App. Server que o número de sessões do BD
Em contra-partida, um pool muito pequeno fará com que requisições esperem que uma conexão esteja disponível para continuar o acesso, prejudicando a performance da aplicação
Datasource
• Principais atributos a serem configuradoso min-pool-size e max-pool-size
Para maior Throughput: se você já sabe que sua aplicação irá utilizar na maior parte do tempo 75 conexões, atribua 75 para o valor de min-pool-size e defina somente uma folga para max-pool-size
o prefill (true ou false) Abre de cara conexões com o BD até preencher min-pool-size
o blocking-timeout-millis Bloqueia a obtenção de novas conexões pelo tempo definido
nesta propriedade. Quando o tempo expira, lança uma Exception e a tentativa de conexão é descartada
Datasource
• Principais atributos a serem configuradoso idle-timeout-minutes
Tempo para uma conexão idle ser fechada. Default: 15 min.o valid-connection-checker|check-valid-connection-sql
Verifica integridade da conexãoo transaction-isolation
Valor default é definido pelo banco de dadoso prepared-statement-cache-size
Número de pstmt em cache por conexões. Default: 0-sem cacheo share-prepared-statements (true ou false)
Ao utilizar o mesmo statement duas vezes sem fecha-lo, utiliza-o mesmo
AS7: Datasource <datasource jndi-name="java:jboss/datasources/MySqlDS" pool-name="MySqlDS"> <connection-url>jdbc:mysql://localhost:3306/EJB3</connection-url> <driver>com.mysql</driver> <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> <pool> <min-pool-size>75</min-pool-size> <max-pool-size>100</max-pool-size> <prefill>true</prefill> </pool> <security><user-name>test</user-name><password>test</password></security> <statement> <prepared-statement-cache-size>32</prepared-statement-cache-size> <share-prepared-statements/> </statement> <timeout> <blocking-timeout-millis>5000</blocking-timeout-millis> <idle-timeout-minutes>5</idle-timeout-minutes> </timeout> <validation> <valid-connection-checker class-name="org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker"/> </validation> </datasource>
Dicas
• Timeout comum•Connector HTTP•Apache Web Server (front end)•Datasources–Read timeout–Connection timeout
WEB AS DBUSER20s 10s
Dicas
• Balanceador de carga (apache ou hardware)• HTTP Cache• Content Delivery Network• Assista a palestra de modcluster, 14h• Escalabilidade vertical x horizontal
Perguntas
Principal Support EngineerRed Hat Brasil
[email protected]://twitter.com/brunorst
http://brmachado.blogspot.com
Bruno Rossetto Machado Claudio MirandaArquiteto de Sistemas
Red Hat Brasil