Guideline de otimização de aplicações hostis em produção

A despeito do título intrigante e esdrúxulo soar como mero chamariz para a leitura deste tópico eu me deparo com um problema de arquitetura realmente desafiador e crucial.

Imaginem diversos clientes em diversos servidores distintos que enviam dados em forma de XML porém sem utilizar WSDL (informações em texto na verdade, mas usando pacotes e apis SOAP) para um aplicativo Java monstro coitado desprovido de serviço de filas, sem mecanismos parrudos controles transacionais e não é executado sob os domínios de um servidor de aplicação.
Este aplicativo é responsável por informar o status de recebimentos das mensagens XML para outros aplicativos, atualizar tabelas de banco de dados, entre outras funcionalidades.

Desconfia-se fortemente de que este aplicativo seja o gargalo da vez no processamento das informações oriundas de vários clientes. O problema e o desafio está em otimizar este aplicativo para minimizar atuais problemas de processamento de requisições tratadas.
A princípio ele deveria ser totalmente remodelado mas esta hipótese está descartada pois ele é critico e não tem-se intenção de substituí-lo a curto prazo. Ele terá que ser otimizado em doses homeopáticas. Ahh, não tenho opções de debug neste caso pois este aplicativo é executado remotamente.

O que é viável no momento é reduzir o seu processamento, tornando o log gerado por exemplo, atualmente muito verboso para um nível de registro apenas elementar com apenas as informações essenciais (menos I/O). Outro passo seria verificar as queries, ajustá-las caso necessário e verificar se é possível criar índices sobre alguns campos que aparecem em maior freqüência nestas queries. Mas com relação ao recebimento das conexões e diversos clientes como seria possível tratar de melhor forma isto?

Há ferramenta ou middleware que possa ajudar neste caso?

Alguém conhece um link de um guia detalhado de refatoração de código voltado para performance ao invés de design de código?
E soluções como memchache e terracota não se encaixam neste caso, certo?

E com que ferramentas eu poderia mensurar ou monitorar a carga de requisições enviadas a este aplicativo?

Sei que fiz muitas questões mais deixo a cargo do colega escolher qual é a mais pertinente, se vários aqui neste me ajudarem respondendo pelo menos uma das questões eu postei eu já me sentirei mais amparado para encarar o desafio com a ajuda dos colegas deste fórum.

Muito Obrigado!

Bruno

Oi Bruno,

O primeiro passo em qualquer trabalho de otimização é transformar a desconfiança em uma certeza. Antes de fazer qualquer otimização, descubra onde realmente está o gargalo e otimize ali.

Para ajudar nisso, você pode usar uma ferramenta de profiling que irá lhe mostrar onde a aplicação gasta mais tempo de CPU, os hotspots. É aí que você deve gastar esforço para otimizar a aplicação.

Simule cenários semelhantes aos de produção tanto em volume de dados quanto em número de requisições, se for possível, para obter um resultado mais realista.

Esse artigo mostra de uma maneira simples como fazer profiling usando o PPTP do Eclipse: http://www.eclipse.org/articles/Article-TPTP-Profiling-Tool/tptpProfilingArticle.html

E muita informação sobre performance da Oracle/Sun aqui: http://java.sun.com/javase/technologies/performance.jsp

Abraço,
Luiz

Luiz

Muito obrigado pelas suas considerações!

Pesquisando eu encontrei as seguintes ferramentas que poderão auxiliar no meu trabalho. É uma questão de estudo e muito trabalho.

http://grinder.sourceforge.net/
http://artho.com/jlint/
http://www.scovetta.com/yasca.html
http://beet.sourceforge.net/
http://www.loadui.org/
http://mindtreeinsight.sourceforge.net/

E achei também os seguintes artigos sobre performance ou tuning.


http://www.arcetri.astro.it/CC/Mysql/ha-memcached.html
http://www.arcetri.astro.it/CC/Mysql/ha-memcached.html#ha-memcached-interfaces-java
http://www.objectzilla.com.br/2009/05/02/ja-usou-memcached/
http://www.javaperformancetuning.com/tips/patterns.shtml
http://www.precisejava.com/javaperf/j2ee/Patterns.htm
http://scriptella.javaforge.com/
http://symmetricds.codehaus.org/

Vou pesquisar mais neste forum sobre este assunto.

Espero que alguém ache os links interessantes.

[]'s

Bruno,

vale a pena avisar que eu não sou um grande especialista em otimização, portanto meus conhecimentos são limitados a minha experiência pessoal. Outras pessoas do fórum talvez tenham uma base teórica mais forte que a minha e possam te dar uma visão mais completa do tópico.