Projecto Integrador Desempenho: aspectos a considerar Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 1 Notas prévia! Estes slides apresentam um conjunto de técnicas que podem ser usadas para melhorar o desempenho dum sistema com interacções cliente/servidor! Nem todas as técnicas são necessárias ou apropriadas para todos os trabalhos! Nem todas as técnicas produzem os mesmos efeitos! No vosso trabalho devem considerar quais são os principais factores que levam a potenciais problemas de desempenho e tratar desses prioritariamente Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 2
Índice! Desempenho duma aplicação! Cliente! Interacção cliente/servidor! Reduzir número de interacções! Reduzir dimensão das interacções! Servidor! Melhorar desempenho dos acessos à base de dados! Particionar servidor! Algumas ferramentas para medir desempenho Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 3 Aplicação Web no Cliente! Alguns aspectos a ter em consideração! Dimensões das imagens! Resolução deve ser ajustada à apresentação! Carregamento dinâmico de páginas! Bibliotecas! Usar versões minimizadas! Usar Ajax para carregar páginas (alguns frameworks têm opções para que ligações sejam carregadas desta forma automaticamente estão a usar?)! Prefetching and caching http://jquerymobile.com/demos/1.1.0/docs/pages/page-cache.html Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 4
Interacção cliente/servidor! Reduzir número de interacções! Porquê?! Latência da interacção! Carga do servidor! Como?! Verificações no cliente sempre que possível! Caching no cliente Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 5 Caching das páginas nos clientes! Browsers fazem caching das páginas a que se acede! HTML 5 permite definir:! Recursos a fazer cache! Recursos que devem ser acedidos remotamente! O que fazer quando não se conseguem aceder a recusos remotos http://en.wikipedia.org/wiki/cache_manifest_in_html5 Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 6
HTML5 local storage http://www.w3.org/tr/webstorage/! sessionstorage! Hashtable! Permite armazenar dados numa sessão! sessionstorage.setitem( key, value)! Value = sessionstorage.getitem( key )! localstorage! Hashtable! Permite armazenar dados entre sessões; dados mantêm-se quando o browser é fechado Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 7 HTML5 local storage! SQL to come! http://www.w3.org/tr/webdatabase/! http://www.w3.org/tr/indexeddb/ Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 8
Invocações periódicas! Devem ter em atenção invocações efectuadas periodicamente! E.g.: informar servidor de nova localização, obter localização de um grupo de utilizadores, etc.! Aproximações possíveis! Utilizar soluções push sempre que possível! Tendem a ser dependentes da plataforma, websockets! Limitar e adpatar frequência das invocações! E.g. apenas envia nova localização se a actual se alterou siginifcativamente Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 9 Servidor: caching das páginas! Executar código em cada pedido é lento! Servidor/proxy pode fazer cache dos resultados e servir o cliente sem contactar o servidor aplicacional! RubyOnRails fornece solução: http://guides.rubyonrails.org/caching_with_rails.html Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 10
Servidor: base de dados! Base de dados é crucial no desempenho! Acesso é ordens de grandeza mais lento que computação! Aspectos a ter em consideração! Indices são fundamentais para bom desempenho! E.g. indices a criar dependem das pesquisas que se fazem! Minimizar complexidade das pesquisas efectuadas! Joins são pesados proibitivos se não existirem os indices correctos! Minimizar tempo de execução das transacções Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 11 Caching dos resultados da base de dados! Repetir as queries à base de dados leva a um mau desempenho! Solução: fazer caching dos resultados! RubyOnRails fornece solução: http://guides.rubyonrails.org/caching_with_rails.html Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 12
Particionamento e caching distribuído! A partir de certo nível de carga, é necessário ter mais servidores a executar! Aproximação simples! Várias máquinas correm servidor aplicacional! Continua a existir uma únca base de dados! Para escalar, é fundamental acesso eficiente aos dados! Solução: memcached! Memcached servidor de caching distribuído! Sistema distribuído de cache de objectos http://railslab.newrelic.com/scaling-rails Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 13 Particionamento! A partir de certo nível de carga, é necessário ter mais servidores a executar! Aproximações mais complexas:! Divisão em funcionalidades independentes servidas por diferentes servidores! Particionamento dos dados, de forma a serem servidors por diferentes servidores Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 14
Scaling rails http://railslab.newrelic.com/scaling-rails Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 15 Medir desempenho! Existe um grande número de ferramentas para testar a escalabilidade do servidor! RubyonRails! http://guides.rubyonrails.org/performance_testing.html#generatingperformance-tests! Apache Jmeter http://jmeter.apache.org/! Httperf http://www.hpl.hp.com/research/linux/httperf/! Medir desempenho através de re-execução de logs! http://www.igvita.com/2008/09/30/load-testing-with-log-replay/ Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 16