performance-em-java-1195015233870696-5

download performance-em-java-1195015233870696-5

If you can't read please download the document

Transcript of performance-em-java-1195015233870696-5

Performance em Aplicaes JavaClaudio Miranda Summa TechnologiesConexo Java 2007

ObjetivoDicas para melhoria de performance em aplicaes Java Aprenda tcnicas e ferramentas para diagnosticar e resolver problemas de desempenho em um ambiente Java

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

2

ObjetivoAs tcnicas mostradas aqui so baseadas na experincia do autor, no necessariamente ela deve ser interpretada como uma receita de bolo unicamente

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

3

Agenda Performance em Aplicaes e Ambiente Compreenso bsica do gerenciamento de memria Tcnicas e ferramentas para diagnstico Dicas

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

4

Agenda Performance em Aplicaes e Ambiente Compreenso bsica do gerenciamento de memria Tcnicas e ferramentas para diagnstico Dicas

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

5

Dicas em Performance Ajustes baseados em nmeros Tx/s (mdia de transaes por segundo) Usurios concorrentes Quantidade de sesses

Armadilhas O mais rpido possvel Est muito lento! necessrio definir nmeros de performance

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

6

Dicas em Performance Ao lidar com performance, um jogo de interesses com flexibilidade e manuteno Refactoring com foco em performance TESTES !

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

7

Dicas em Performance Onde est o problema ?Memria, CPU, disco, I/O, rede

Passos Diagnstico Priorizao Anlise Soluo Marretada Ideal

Teste Documentao29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 8

Dicas em Performance Ajustes em cdigo Microbenchmarks Percepo do usurio final

Ajustes de arquitetura O que uma transao ? Tx JDBC Tx Fila Tx connector JCA

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

9

Dicas em Performance Concorrencia Use pool de threads Diminuir o tamanho do stack (-Xss) Use GC Paralelo Mltiplas CPU,multicore, mltiplas threads por core

Aproveitar as classes Java nativas para sincronizao e concorrncia Pacote java.util.concurrency Collections Thread safety

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

10

Dicas em Performancevoid runServer() { serverSocket = new ServerSocket(4444); clientSocket = serverSocket.accept(); new Thread(new ClientOperator(clientSocket)).start(); } class ClientOperator implements Runnable { public void run() { final int BUFFER = 128; InputStream clientIn = clientRunner.getInputStream();

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

11

Dicas em PerformanceExecutor pool = Executors.newFixedThreadPool(10); void runServer() { serverSocket = new ServerSocket(4444); clientSocket = serverSocket.accept(); pool.execute(new ClientOperator(clientSocket)); } class ClientOperator implements Runnable { public void run() { final int BUFFER = 128; InputStream clientIn = clientRunner.getInputStream();

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

12

Dicas em Performance Acesso a Banco de Dados Em atividades read-only (relatrios e consultas) Usar um pool especfico Usar isolamento transacional menos restritivo

Diminuir o isolamento transacional Use JDBC puro para performance Use PL/SQL para transformaes de dados, exigindo alta performance em operaes batch Use cache e poltica para limpeza No usar o protocolo XA

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

13

Dicas em Performance JVM Desabilitar o security manager em ambientes confiveis Desabilitar a verificao de classes -Xnoverify

GC JDK > 5: Desabilitar o verbose GC, usar jstat Usar algoritmos paralelos em mquinas multiprocessadas e multicore -XX:+UseParallelGC -XX:+UseParallelOldGC

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

14

Dicas em Performance I/O Remover System.out Diminuir log Usar if (log.isDebugEnabled()); para evitar concatenao de strings Usar java.io.Externalizable para serializao Usar buffers e java.io.BufferedInputStream

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

15

Dicas em Performance Servidores de Aplicativos Colocar na inicializao, as tarefas de carga, parsing, pr-compilao, etc. Problema: deploymen e inicializao demorado Benefcio: runtime rpido

Ajustes Acceptor threads, pool, timeout, http queue, NIO, EJB commit-option, http session tuning

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

16

Agenda Performance em Aplicaes e Ambiente Compreenso bsica do gerenciamento de memria Tcnicas e ferramentas para diagnstico Dicas

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

17

Heap

HEAP-Xmx2g

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

18

Heap Larga rea de memria que armazena objetos e suas referncias dividido em geraes Gerao Young (ou New ou Eden) Gerao Old (Tenured) Gerao Permanente (PermGem)

O GC ocorre apenas quando a gerao no tem espao para alocao de novos objetos Automaticamente remove objetos da memria que no possuem referncia Possui diferentes algoritmos de GC29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 19

Heap

YOUNG

OLD

-XX:MaxNewSize=256m -Xmx2g29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 20

Heap Gerao Young Onde novos objetos so alocados A alocao de memria de curta durao Objetos que no possuem referncia so removidos pelo GC GC ocorre com mais frequncia Tamanho pequenoprivate String name = Bruce Lee; public Result consumidor(Long id) { Result r = processar(id); return r; }29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 21

Heap

YOUNG

OLD

-XX:MaxNewSize=256m -Xmx2g29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 22

Heap Gerao Old Onde permanecem objetos cujas referncias sobreviveram ao GC da rea Young Objetos de longa durao GC ocorre com menor frequncia Tamanho superior rea Young Exemplos: Atributos estticos, final, Singletonpublic static String name = Bruce Lee; public final Map cache = new HashMap(); private static Loader singleton = new Loader();

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

23

Heap

YOUNG

OLD

Perm

-XX:MaxNewSize=256m -Xmx2g29/12/2011

-XX:MaxPermSize=128m24

Copyright: Claudio Miranda - Evento Conexo Java 2007

Heap Gerao Permanente Pouca ao de GC Armazena a estrutura das classes Armazena informaes de reflexo Objetos de origem nativa (JNI) No participa do heap (-Xmx)

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

25

Heap

Eden

From Eden To Eden (survivor 1) (survivor 2)

Criao de objetos

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

26

Heap

Eden

From Eden

To Eden

Ocorre um GC na rea Young, quando no tem mais espao29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 27

Heap

Eden

From Eden

To Eden

Ocorre outro GC na rea Young

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

28

Heap

To Eden

Old

Outro GC ocorre, ento objetos que contm referncia so transportados para a rea Old29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 29

Heap Na rea de memra Old ocorremRedimensionamento (-Xms -Xmx) Compactao (desfragmentao) Larga rea de memria para ser monitorada GC ocorre de acordo com a poltica do algortmo Old

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

30

Heap Ergonomia (JDK 5 e 6) Dimensionamento automtico das geraes Baseado nas informaes Sistema Operacional Verso da JVM Quantidade de Memria RAM Quantidade de processadores Tipo do processador (Sparc)

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

31

Agenda Performance em Aplicaes e Ambiente Compreenso bsica do gerenciamento de memria Tcnicas e ferramentas para diagnstico Dicas

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

32

Tcnicas Resolvendo problemas de memria OutOfMemoryError (OOME) Outros problemas em geral

Resolvendo problemas de CPU Uso intensivo de CPU e threads Garbage Collector com frequncia Outros problemas em geral

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

33

TcnicasCada tcnica para diagnosticar problemas, tem um nvel de intruso no sistema, que pode variar entre um rpido monitoramento no sistema ou um profiler e debug no sistema. Essa a chave que ir determinar o tempo29/12/2011

para resoluo do problemaCopyright: Claudio Miranda - Evento Conexo Java 2007

34

Problemas de memria Como diagnosticar um OOME ? Olhe nos logs de aplicaes Monitore o comportamento jmap, jstack, visualgc, jconsole, log do GC

Verifique qual a causa do OOME

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

35

Problemas de memria Tipos de OOME Java heap space PermGen space Out of swap space unable to create new native thread

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at ConsumeHeap$BigObject.(ConsumeHeap.java:22) at ConsumeHeap.main(ConsumeHeap.java:41)

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

36

Problemas de memriaJava heap space Causas Pouca memria fsica Monitoramento pelo SO: prstat, top, vmstat, mpstat

Baixo valor do heap Tanto Young (-XX:MaxNewSize)e Old (-Xmx)

Reteno de objetos (memory leak) Monitorar com jconsole ou gcviewer, a evoluo do GC Uso de profiler para monitorar objetos retidos em cada invocao do GC29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 37

Problemas de memriaMonitoramento pelo sistema operacional

top

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

38

Problemas de memriaJava heap space Diagnstico de memory leak, com monitoramento de GC

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

39

Problemas de memriaDiagnstico de memory leak com profiler

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

40

Problemas de memriaDiagnstico de memory leak com profiler

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

41

Problemas de memriaDiagnstico de memory leak com heap dump

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

42

Problemas de memriaJava heap space Correo Aumente o tamanho do heap Tanto Young (-XX:MaxNewSize)e Old (-Xmx)

Memory leak Liberar as objetos alocados Normalmente so colees com finalidade de cache

Aumentar a memria fsica da mquina

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

43

Problemas de memriaPermGen space Causas Pouca memria disponvel para a memria permanente Classloader leak Ocorre quando um classloader ser descartado, mas um objeto carregado por este classloader referenciado por objetos fora deste classloader

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

44

Problemas de memriaClassloader leak

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

45

Problemas de memriaClassloader leak

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

46

Problemas de memriaClassloader leak

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

47

Problemas de memriaClassloader leak

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

48

Problemas de memriaClassloader leak

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

49

Problemas de memriaClassloader leak

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

50

Problemas de memriaPermGen space Correo Aumente o tamanho da memria permanente Geralmente ocorre quando usado frameworks de gerao de classes -XX:MaxPermSize e -XX:PermSize

Classloader leak Gerenciar a dependncia dos objetos, para remover a referncias dependentes

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

51

Problemas de memriaOut of swap space Causas Geralmente ocorre em cdigo nativo (JNI) Geralmente invocado por alguma operao Java

Falta de espao na memria do SO

Correo Aumentar memria fsica da mquina Diminuir tamanho do heap do java

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

52

Problemas de memriaUnable to create new native thread Causas Tamanho elevado do stack (-Xss) Pouca memria disponvel para o SO Pois cada thread em Java mapeada para uma thread do SO (native threads)

Pobre gerenciamento de threads

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

53

Problemas de memriaUnable to create new native thread CorreoDiminuir o tamanho do Stack (-Xss) Aumentar memria fsica Diminuir tamanho do heap, pois sobra espao para o SO Melhor gerenciamento de threads Usar pool de threads, disponvel do Java 5

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

54

Problemas de memria E quando ocorre um crash no servidor ? Habilitar o dump de memria (heap dump) -XX:+HeapDumpOnOutOfMemoryError -XX:+HeapDumpOnCtrlBreak

Analisar o dump gerado O tamanho do dump gerado proporcional ao tamanho do heap

Heap roots e heap analyzer SAP Memory Analyzer jhat

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

55

Problemas de memria Outras ferramentas de suporte a monitoramento de memria vmstat pmap ulimit

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

56

Problemas de memriaMonitoramento pelo sistema operacional vmstat

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

57

Problemas de memriapmap

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

58

Problemas de memriaulimit

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

59

Problemas de CPU Como diagnosticar consumo de CPU? Monitorar uso do sistema operacional Verificar qual aplicao consome os recursos Monitorar o GC Monitorar as threads Uso de profiler

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

60

Atividade do SO

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

61

Problemas de CPU Monitorar uso do sistema operacional Se o problema for da aplicao Java ento outro tipo de monitoramento necessrio

Verificar atividade de GC

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

62

Atividade do GC

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

63

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

64

Atividade do GC Correo Dimensionar as reas de memria adequadamente Mesmo que no ocorra OOME, a frequencia do GC consome CPU exageradamente

Parametrizar o comportamento da JVM Algoritmos de GC

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

65

Problemas de CPU

Verificar atividade de Threads

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

66

Comportamento das threads Causas Pobre gerenciamento de threads Quantidade exagerada de threads No usar pool de threads

Mquina insuficiente para processamento Dead lock Dependncia circular

Pobre implementao da aplicao Processamento intenso de strings Transformao de dados desnecessria

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

67

Comportamento das threads jstack

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

68

Comportamento das threads

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

69

Comportamento das threads

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

70

Comportamento das threads Uso do profiler implica Aplicao compilada em modo debug Modificar as configuraes da JVM para profiler Penaliza performance Modifica o comportamento da JVM (modo interpretado)

Console grfico para anlise on-line

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

71

Ferramentas adicionais para diagnstico

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

72

Ferramentas para diagnstico Outras ferramentas para diagnstico mpstat, prstat, top, vmstat, pmap Estatsticas de CPU e memria

iostat Trfego de I/O (rede e disco)

pstack Stacktrace de processos

strace, truss Rastreio de system calls

ps, pstree, ptree rvore de processos29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 73

Ferramentas para diagnstico Outras ferramentas para diagnstico ldd rvore de dependncias de bibliotecas

dmesg Inicializao do kernel

ulimit Limites de recursos do usurio

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

74

Ferramentas para diagnstico Rede (unixes) Wireshark (Ethereal), tcpdump, snoop Anlise de trfego de rede

dig, nslookup Resoluo de nomes DNS

netstat Status de conexes, tabelas de roteamento, etc

lsof Estatsticas de uso de file descriptors

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

75

Ferramentas para diagnstico

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

76

Ferramentas para diagnstico

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

77

Agenda Performance em Aplicaes e Ambiente Compreenso bsica do gerenciamento de memria Tcnicas e ferramentas para diagnstico Dicas

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

78

Dicas Servidor de Aplicativos Monitoramento de recursos Pool de conexes, threads

Logs Nveis de log

Keep-alive e pipeline Classpath Cluster Sincronizao, I/O, rede

Threads Acceptor, queue, pool, timeout29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 79

Dicas Servidor de Aplicativos Classloader Carga dinmica de aplicaes Compilao de JSP, redeploy, autodeploy, auto discovery

Gerenciamento de sesso HttpSession Stateful Session Bean

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

80

Dicas Seja cauteloso com informaes obtidas No seja prematuro ao informar sobre onde est o problema Ter uma viso do contexto computacional Configurao de mquinas, sistema operacional, estrutura de rede, servios, e dependncias

Compreender quais os servios afetados e nvel de importncia Conhecer as equipes envolvidas e seus responsveis29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 81

Dicas No entre em pnico Conhea as ferramentas e como us-las No dependa de consoles grficos Isole o problema Tente confirmar todos os relatos Ter acesso ao cdigo fonte da aplicao Ter a mo um bom decompilador (jad) Verificar todos os arquivos de configuraes Ao confirmar o problema, j entregue a soluoCopyright: Claudio Miranda - Evento Conexo Java 2007 82

29/12/2011

Muito Obrigado Claudio Miranda [email protected] http://www.soujava.org.br http://www.summa-tech.com http://www.claudius.com.br

29/12/2011

Copyright: Claudio Miranda - Evento Conexo Java 2007

83