O App Engine gera relatórios de uso sobre o desempenho do aplicativo e a utilização de recursos. Abaixo estão listadas as estratégias em potencial para gerenciar os recursos com mais eficiência. Para mais informações, consulte a página de preços.
Como ver relatórios de uso
Ao avaliar o desempenho do aplicativo, você precisa verificar o número de instâncias em que o aplicativo está em execução e como ele consome recursos.
Ver os relatórios de uso do painel
Nas seções a seguir, você verá algumas estratégias para gerenciar recursos.
Como gerenciar o escalonamento dinâmico de instância
Como diminuir a latência
A latência do aplicativo afeta o número de instâncias necessárias para processar o tráfego. Ao diminuir a latência, é possível reduzir o número de instâncias usadas para exibir o aplicativo. O Cloud Trace é uma ferramenta útil para visualizar dados sobre latência e entender possíveis alterações para diminuí-la.
Depois de usar o Cloud Trace para ver a latência, execute algumas das seguintes estratégias para reduzir a latência:
- Aumente o armazenamento em cache de dados compartilhados e frequentemente acessados: ou seja, use o Memcache do App Engine. Além disso, definir cabeçalhos de controle de cache do aplicativo pode impactar a eficiência com que os dados são armazenados em cache pelos servidores e navegadores. O armazenamento de dados em cache, mesmo que seja feito por alguns segundos, pode afetar a eficiência da veiculação do tráfego pelo aplicativo.
- Usar o Memcache do App Engine de maneira mais eficiente: use chamadas em lote para as operações get, set, delete etc., em vez de uma série de chamadas individuais. Considere usar a API Memcache Async.
- Usar tarefas para um recurso não vinculado a uma solicitação: se o aplicativo executar um trabalho que possa ser feito além do escopo de uma solicitação voltada para o usuário, coloque-o em uma tarefa. Se você enviar esse trabalho para a fila de tarefas em vez de aguardar a conclusão dele antes do retorno de uma resposta, será possível reduzir significativamente a latência do usuário. Assim, a fila de tarefas oferece muito mais controle sobre as taxas de execução e ajuda a reduzir a carga.
- Use o Firestore no modo Datastore (Datastore) com mais eficiência: consulte abaixo mais detalhes.
- Execute várias chamadas de busca de URL em paralelo:
- Reúna em lote várias chamadas de busca de URL, em vez de lidar com cada uma em solicitações individuais voltadas para o usuário, e processe-as em uma tarefa off-line em paralelo por meio da busca de URL assíncrona.
- Use a API URL Fetch assíncrona.
- Grave de maneira assíncrona em sessões HTTP: o Java permite configurar o aplicativo para gravar dados da sessão HTTP de maneira assíncrona no Datastore adicionando
<async-session-persistence enabled="true"/>
aoappengine-web.xml
. Os dados da sessão são sempre gravados de maneira síncrona no Memcache do App Engine. Se uma solicitação tentar ler os dados da sessão quando o Memcache do App Engine não estiver disponível, ela falhará no Datastore, que talvez ainda não tenha a atualização mais recente. Isso significa que há uma pequena chance de que aplicativo veja dados desatualizados da sessão. No entanto, na maioria dos aplicativos, o benefício da latência compensa esse risco.
Alterar configurações de desempenho do escalonamento automático
O arquivo de configuração appengine-web.xml
contém várias definições que podem ser usadas para ajustar a compensação entre desempenho e carga de recursos de uma versão específica do aplicativo. Para uma lista das configurações de escalonamento automático disponíveis, consulte os elementos de escalonamento.
Assista ao vídeo Novas configurações do programador (em inglês) do App Engine para ver os efeitos dessas configurações.
Como ativar solicitações simultâneas no Java
Ativar essa configuração diminuirá o número de instâncias necessárias para exibir o tráfego do aplicativo. No entanto, é preciso que o aplicativo seja threadsafe para que isso funcione corretamente. Leia sobre como usar solicitações simultâneas ativando o threadsafe no seu arquivo appengine-web.xml
.
Como definir configurações da fila de tarefas
As configurações padrão de fila de tarefas são ajustadas visando o desempenho. Com esses padrões, quando você coloca várias tarefas em uma fila simultaneamente, é provável que novas instâncias de front-end sejam iniciadas. Veja algumas sugestões para o ajuste da fila de tarefas que visam preservar as horas da instância:
- Defina o cabeçalho X-AppEngine-FailFast nas tarefas que não sejam sensíveis à latência. Esse cabeçalho instrui o programador a cancelar imediatamente a solicitação se uma instância não estiver disponível. A fila de tarefas tentará novamente e recuará até que uma instância fique disponível para atender à solicitação. No entanto, é importante observar que, quando as solicitações com o conjunto X-AppEngine-FailFast ocupam instâncias, ainda será possível que as solicitações sem esse conjunto de cabeçalho causem a inicialização de novas instâncias.
- Defina as configurações da fila de tarefas.
- Ao definir o parâmetro "rate" com um valor menor, a fila de tarefas executará as tarefas mais lentamente.
- Ao definir o parâmetro "max_concurrent_requests" com um valor menor, menos tarefas serão executadas simultaneamente.
Exibir conteúdo estático quando possível
A exibição de conteúdo estático em Java é gerenciada pela infraestrutura especializada do App Engine, que não consome instância/horas. Se você precisar configurar cabeçalhos personalizados, use a API Blobstore. A exibição real da resposta do Blob não consome instância/horas.
Como gerenciar o armazenamento de aplicativos
O App Engine calcula os custos de armazenamento com base no tamanho das entidades no Datastore, no tamanho dos índices do armazenamento de dados, no tamanho das tarefas na fila de tarefas e no volume de dados armazenados no Blobstore. Execute estes procedimentos para não armazenar mais dados do que o necessário:
- Exclua todas as entidades ou os blobs de que o aplicativo não precisa mais.
- Remova todos os índices desnecessários, conforme abordado na seção Como gerenciar o uso do Datastore abaixo, para reduzir os custos de armazenamento do índices.
Como gerenciar o uso do Datastore
O App Engine é responsável pelo número de operações realizadas no Datastore. Estas são algumas das estratégias capazes de reduzir o consumo de recursos do Datastore, além de diminuir a latência em solicitações para o Datastore:
- O visualizador de dados do console do Google Cloud mostra o número de operações de gravação que foram necessárias para criar cada entidade no Datastore local. Use essas informações para compreender o custo da gravação de cada entidade. Consulte Noções básicas sobre os custos de gravação para saber mais sobre como interpretar esses dados.
- Remova qualquer índice desnecessário. Isso reduzirá os custos de armazenamento e gravação da entidade. Use a funcionalidade "Get Indexes" para ver quais índices estão definidos no aplicativo. É possível ver os índices em exibição no momento para seu aplicativo na página de pesquisa do console do Google Cloud.
- Ao projetar o modelo de dados, grave as consultas de modo a evitar índices personalizados. Leia a documentação sobre Consultas e índices para saber mais sobre como o App Engine gera índices.
- Sempre que possível, substitua as propriedades com índice (que são o padrão) por propriedades sem índice (Java). Isso reduz o número de operações de gravação no Datastore ao incluir uma entidade. Cuidado: se mais tarde você decidir que precisa realizar consultas na propriedade sem índice, será necessário modificar o código para voltar a usar propriedades com índice, bem como executar uma redução de mapa em todas as entidades para incluí-las novamente.
- Devido às melhorias no planejador de consultas do Datastore nas versões 1.5.2 e 1.5.3 do App Engine, as consultas agora exigem menos índices do que antes. Mesmo podendo manter certos índices personalizados por motivos de desempenho, é possível excluir outros para reduzir custos de armazenamento e gravação de entidade.
- Reconfigure o modelo de dados para substituir consultas por busca por chave, que é mais acessível e mais eficiente.
- Use consultas apenas por chaves em vez de consultas de entidade, quando possível.
- Para diminuir a latência, substitua os
get()
s de várias entidades por umget()
em lote. - Use os cursores do Datastore para paginação em vez de deslocamento.
- Carregue em paralelo várias RPCs do Datastore por meio da API Async Datastore.
Observação: pequenas operações do Datastore incluem para alocar IDs do Datastore ou consultas apenas por chaves. Consulte a página de preços para mais informações sobre custos.
Como gerenciar a largura de banda
Para reduzir a largura de banda de saída,
defina o cabeçalho Cache-Control
apropriado nas respostas e prazos de validade razoáveis
para arquivos estáticos. Usar cabeçalhos Cache-Control
públicos dessa maneira permitirá
que os servidores proxy e o navegador dos clientes armazenem em cache as respostas
do período designado.
A largura de banda de entrada é mais difícil de controlar, já que é a quantidade de dados que os usuários enviam ao seu aplicativo. No entanto, é possível usar regras de firewall do App Engine para permitir ou restringir intervalos de endereços IP e sub-redes.