Reinicializações de instância de função causadas por atualizações do sistema operacional da VM do Azure
Este artigo discute os efeitos das atualizações do sistema operacional (SO) da VM (máquina virtual) do Microsoft Azure na reinicialização de instâncias de função. Ele contém detalhes sobre agendamentos de atualização do sistema operacional e do agente convidado, impactos e requisitos de serviço, notificação, detecção e como resolver problemas comuns.
Atualizar agendas do
Aproximadamente mensalmente, a Microsoft lança uma nova versão do sistema operacional convidado para VMs de PaaS (plataforma como serviço) do Azure. O agendamento exato varia e a tendência histórica pode ser vista nas versões do sistema operacional convidado do Azure e na matriz de compatibilidade do SDK. Durante essa distribuição, o Controlador de Malha do Azure faz duas passagens (uma passagem do sistema operacional do host e uma passagem do sistema operacional convidado) por todos os datacenters. Uma atualização periódica do agente convidado do Azure também é executada dentro da VM.
As seções a seguir fornecem mais detalhes sobre os dois passes de atualização e a atualização do agente convidado.
Passe 1: sistema operacional host
A primeira passagem atualiza o sistema operacional host. O sistema operacional host reinicia as instâncias de função e o controlador de malha garante que apenas as instâncias de um domínio de atualização por vez sejam reiniciadas. Durante essa reinicialização, suas instâncias de função passam pelo processo de desligamento padrão. Em seguida, o RoleEnvironment.OnStop
evento é executado para dar a você a chance de desligar a instância normalmente.
A atualização do sistema operacional do host pode levar vários dias para que a malha coordene as atualizações em todos os diferentes serviços hospedados e domínios de atualização em um datacenter. Normalmente, diferentes instâncias de sua implantação são atualizadas com várias horas de intervalo.
Para obter mais informações sobre o processo de atualização do sistema operacional do host, consulte o artigo do blog Atualizações do host do Azure: por que, quando e como o Azure.
Passe 2: sistema operacional convidado
Depois que o sistema operacional host termina de atualizar no datacenter, o sistema operacional convidado é atualizado para serviços configurados para usar versões automáticas do sistema operacional convidado. Essa atualização continua usando regras de domínio de atualização padrão para seu serviço. Sua VM é reiniciada e a partição do Windows (a unidade D) é recriada usando o sistema operacional atualizado.
O processo de atualização do sistema operacional convidado é muito mais rápido do que a atualização do sistema operacional host. Isso ocorre porque a malha precisa coordenar apenas a atualização dentro do serviço hospedado e dos domínios de atualização. A duração do processo de atualização do sistema operacional convidado para o serviço depende muito dos seguintes fatores:
- O número de instâncias de função
- O número de domínios de atualização
- Quanto tempo seu serviço leva para desligar (
Stopping
OnStop
e eventos) - Quanto tempo seu serviço leva para iniciar (tarefas de inicialização e o
OnStart
evento)
Agente convidado
O agente convidado do Azure é atualizado aproximadamente mensalmente. Quando o agente convidado é atualizado, ocorrem as seguintes ações:
- O processo de host que executa sua função (normalmente WaWorkerHost ou WaWebHost) é desligado normalmente.
- O agente convidado se atualiza.
- O processo do host é iniciado novamente.
Para obter mais informações sobre o processo do agente convidado e como ele interage com o serviço, consulte Fluxo de trabalho da arquitetura de VM clássica do Windows Azure.
Impactos e requisitos de serviço
A lista a seguir descreve os impactos e os requisitos do serviço de nuvem:
Se qualquer uma de suas funções tiver apenas uma instância, seu serviço poderá sofrer tempo de inatividade. Você deve ter pelo menos duas instâncias de cada função, pois o SLA (contrato de nível de serviço) requer um tempo de atividade de 99,95%.
Espere que suas instâncias de função sejam reiniciadas para a atualização do sistema operacional host aproximadamente uma vez por mês. Se você tiver atualizações automáticas do sistema operacional convidado, espere que suas instâncias sejam reiniciadas novamente. Normalmente, as reinicializações têm várias horas de intervalo. No entanto, esse período de tempo pode mudar dependendo da composição dos diferentes serviços existentes em um datacenter.
Sua função deve aderir às regras que regem as atualizações do sistema operacional do host. Em particular, as instâncias de função devem atingir o
Ready
estado dentro de 30 minutos após o início das tarefas de inicialização. Para obter mais informações sobre essa limitação, consulte Como uma atualização prossegue.A atualização do sistema operacional host causa uma reinicialização da instância da função e a atualização do sistema operacional convidado causa o equivalente a uma nova imagem da instância. Devido a esses eventos, suas instâncias de função devem ser capazes de lidar com os seguintes procedimentos:
- Reiniciar
- Recriação de imagem
- Recycle
Notificação
Atualmente, a plataforma do Azure não oferece notificações proativas quando uma atualização do sistema operacional está ocorrendo. Suas instâncias de função receberão um RoleEnvironment.Stopping
evento antes de serem desligadas. Você pode usar esse evento para encerrar normalmente qualquer trabalho que a instância de função esteja fazendo ou para notificar um administrador de que uma instância está sendo desligada.
Você pode assinar o feed RSS de atualizações do sistema operacional do Azure. Esse feed deve ser atualizado no mesmo dia em que as atualizações do sistema operacional começam a ser distribuídas no datacenter. O feed normalmente não fornece notificação proativa avançada, mas ajuda a identificar quando as atualizações estão ocorrendo. O processo de atualização pode levar vários dias para ser concluído. Portanto, talvez seja necessário aguardar um ou mais dias entre a atualização do feed RSS e o início da atualização do serviço hospedado.
A lista de versões do sistema operacional convidado do Azure e a lista de versões do sistema operacional disponíveis para seleção no portal do Azure normalmente são atualizadas após a conclusão da distribuição do sistema operacional convidado. Você não deve usar a entrada mais recente nessas listas como uma indicação de quando as atualizações do sistema operacional estão em andamento.
Detecção
Atualmente, não há uma maneira direta de detectar uma atualização do sistema operacional host. No entanto, você pode ver a evidência da reinicialização nos logs da VM. Para fazer isso, siga um destes procedimentos:
No aplicativo Visualizador de Eventos, pesquise nos logs de eventos do sistema a origem do evento USER32, ID de evento 1074. Esse evento contém a seguinte mensagem:
O processo D:\Packages\GuestAgent\WaAppAgent.exe (RD00155D50206D) iniciou o desligamento do RD00155D50206D do computador em nome do usuário NT AUTHORITY\SYSTEM pelo seguinte motivo: Desligamento da API herdada
Essa mensagem indica que o agente convidado (WaAppAgent.exe) de malha do Azure iniciou um desligamento da VM.
Em um editor de texto, pesquise um arquivo de log de tempo de execução do agente de aplicativo antigo (AppAgentRuntime.log.old) para uma
_Context_Start
mensagem na qual oContext
é igual aStopContainer()
. Para obter mais informações sobre como examinar entradas de contexto no log de runtime do agente de aplicativo, consulte Cenário de solução de problemas 6 – Reciclagem de função após a execução por algum tempo no arquivo do blog do Azure.
Problemas comuns e soluções
As seções a seguir discutem alguns problemas comuns que envolvem reinicializações de instância de função e como você pode resolvê-los. Para obter mais informações sobre os processos em execução e o local dos arquivos de log que você pode usar para solução de problemas, consulte Fluxo de trabalho da arquitetura de VM clássica do Windows Azure.
Problema 1: as tarefas de inicialização ou o código não são executados pela segunda vez após a reinicialização do sistema operacional host
As tarefas de inicialização ou o código na função or Run
podem falhar na segunda vez após a reinicialização do OnStart
sistema operacional host. A reinicialização deve invocar suas tarefas de inicialização para serem executadas novamente. Essa falha impede que a instância de função atinja o Ready
estado.
E se você estiver fazendo algo em uma tarefa de inicialização e, em seguida, executar um comando que retorna um erro após ser executado pela segunda vez? Nesse caso, sua tarefa de inicialização falhará e fará com que sua instância de função comece a reciclar. Por exemplo, se você usar o comando APPCMD set config para adicionar uma seção de configuração no IIS (Serviços de Informações da Internet), o comando falhará em sua segunda execução. O comando gera a mensagem de erro: "Novo objeto de adição sem atributos necessários. Não é possível adicionar entrada de coleção duplicada do tipo..." Em seguida, a instância de função começa a reciclar.
Solução 1: Conecte-se à VM e depure a inicialização ou falha de código remotamente
Para solucionar esse tipo de falha, use o RDP (Remote Desktop Protocol) para se conectar à VM remotamente. Examine os logs de eventos em busca de erros e verifique se há falhas na tarefa de inicialização no arquivo WaHostBootstrapper.log . Durante o processo típico de desenvolvimento e teste, você deve iniciar proativamente uma reinicialização de suas instâncias de função no portal do Azure. Esta etapa ajuda você a testar seu serviço para garantir que ele funcione corretamente nesse cenário.
Uma correção comum para falhas de tarefa de inicialização é adicionar um exit /b 0
comando ao final do script da tarefa de inicialização. Esse comando exit encerra o script usando um código de saída que indica êxito. Para obter mais informações sobre por que esse comando é necessário, consulte Como configurar e executar tarefas de inicialização para um Serviço de Nuvem do Azure (clássico).
Problema 2: a tarefa ou o código de inicialização não é executado depois que a partição do Windows é recriada
A partição do Windows (unidade D) é normalmente onde as instalações de programas e as alterações do registro são armazenadas. Durante a parte do sistema operacional convidado de uma atualização, a partição do Windows é recriada. Isso pode fazer com que essas instalações e alterações sejam perdidas. Se o código de inicialização assumir erroneamente que determinadas alterações do Registro ainda existem depois que a partição do Windows for recriada, a instância de função poderá não funcionar corretamente. Essa falha impede que a instância de função atinja o Ready
estado.
Por exemplo, a tarefa de inicialização pode fazer uma alteração no Registro. Em seguida, ele armazena um registro dessa alteração na unidade C ou E para garantir que a alteração do registro não seja executada uma segunda vez. No entanto, a alteração do registro na unidade D será perdida devido à recriação da imagem, e a tarefa de inicialização não restaurará essa alteração do registro porque a tarefa não acha necessária. A alteração do registro ausente pode eventualmente fazer com que o restante da tarefa de inicialização falhe.
Solução 2: testar a recriação de imagens de instâncias de função no portal do Azure
Durante o processo típico de desenvolvimento e teste, você deve iniciar proativamente uma reformulação de suas instâncias de função no portal do Azure. Esta etapa ajuda você a testar seu serviço e garantir que ele funcione corretamente nesse cenário.
Problema 3: o código de inicialização leva mais de 30 minutos para ser concluído
Se o código de inicialização demorar mais de 30 minutos para ser concluído, você poderá ter mais de uma instância de função fora de serviço ao mesmo tempo. Esse cenário ocorre mais comumente quando uma tarefa de inicialização executa uma destas ações:
- Instala um programa ou recurso
- Baixa dados de cache
- Downloads de informações do site
Solução 3: Analise os impactos e os requisitos do serviço
Examine a seção Impactos e requisitos do serviço para saber o que esperar e como você pode evitar ou mitigar atrasos na inicialização.
Problema 4: o Azure não reinicia o sistema operacional host ou convidado após uma atualização
Em raras ocasiões, o Azure pode não reiniciar o sistema operacional host ou convidado após uma atualização. Nesse cenário, você provavelmente verá uma mensagem "Aguardando Host" no portal que não será alterada após 30 minutos ou mais.
Solução 4a: corrija o código de inicialização
Se você conseguir usar o RDP (Remote Desktop Protocol) para se conectar à instância de função, poderá haver uma falha no código de inicialização que você pode corrigir. Para obter mais informações sobre como corrigir o código de inicialização, consulte Solução 1: conectar-se à VM e depurar a inicialização ou a falha de código remotamente.
Solução 4b: Excluir a implantação
Se você não puder usar o RDP para se conectar à instância de função, provavelmente a única maneira de recuperar a instância é excluir a implantação.
Problema 5: Uma ou mais instâncias de função não estão disponíveis durante a atualização do sistema operacional
Se alguma instância de função estiver indisponível durante a atualização do sistema operacional, isso poderá causar uma redução na capacidade de serviço. Por exemplo, suponha que você tenha duas instâncias de uma função Web e ambas as instâncias normalmente sejam executadas com 75% de uso da CPU. Se uma instância for reiniciada durante a atualização, o tráfego será redirecionado para a instância restante. Essa instância não pode lidar com a carga extra. Isso causa uma redução na disponibilidade do serviço.
Solução 5: Mantenha o excesso de capacidade suficiente em seu serviço
Certifique-se de que seu serviço tenha excesso de capacidade suficiente para absorver uma determinada porcentagem de instâncias de função indisponíveis. Para calcular a quantidade de excesso de capacidade que você precisa disponibilizar, divida o número um pelo número de domínios de atualização. Por exemplo, se você tiver dois domínios de atualização, precisará de 1/2 = 50% de excesso de capacidade para lidar com a indisponibilidade de um domínio de atualização. Se você tiver cinco domínios de atualização, precisará de 1/5 = 20% de excesso de capacidade para lidar com a perda de disponibilidade em um dos cinco domínios de atualização.
Problema 6: Os clientes sofrem interrupções ou tempos limite porque seu site demora muito para aquecer
Seu site leva vários minutos para aquecer? (Por exemplo, o aquecimento do site pode consistir em pré-compilação padrão do IIS ou ASP.NET e carregamento de módulo, ou pode estar aquecendo um cache ou outras tarefas específicas do aplicativo.) Nesse caso, seus clientes podem sofrer uma interrupção ou tempos limite aleatórios.
Depois que uma instância de função é reiniciada e seu OnStart
código conclui sua execução, sua instância de função é restaurada para a rotação do balanceador de carga. A instância de função começará a receber solicitações de entrada. Se o seu site ainda estiver aquecendo, todas as solicitações recebidas serão enfileiradas e expiradas. Suponha que você tenha apenas duas instâncias de sua função Web. Nesse caso, a IN_0
instância receberá 100% das solicitações recebidas enquanto a IN_1
instância estiver sendo reiniciada para a atualização do sistema operacional convidado. No entanto, a IN_0
instância ainda está esquentando. Esse cenário pode causar uma interrupção completa do serviço até que o site termine de aquecer em ambas as instâncias.
Solução 6: Impedir que uma instância de função receba solicitações de entrada até que o aquecimento seja concluído
Recomendamos que você mantenha o OnStart
código de manipulação de eventos para sua instância de função de terminar até que o site conclua seu aquecimento. Para implementar esse processo de evento, você pode usar o seguinte código de exemplo:
public class WebRole : RoleEntryPoint {
public override bool OnStart () {
// For information about handling configuration changes, see the article
// "Customize the Lifecycle of a Web or Worker role in .NET" at
// https://learn.microsoft.com/azure/cloud-services/cloud-services-role-lifecycle-dotnet.
IPHostEntry ipEntry = Dns.GetHostEntry (Dns.GetHostName ());
string ip = null;
foreach (IPAddress ipaddress in ipEntry.AddressList) {
if (ipaddress.AddressFamily.ToString () == "InterNetwork") {
ip = ipaddress.ToString ();
}
}
string urlToPing = "https://" + ip;
HttpWebRequest req = HttpWebRequest.Create (urlToPing) as HttpWebRequest;
WebResponse resp = req.GetResponse ();
return base.OnStart ();
}
}
Mais informações
Entre em contato conosco para obter ajuda
Se você tiver dúvidas ou precisar de ajuda, crie uma solicitação de suporte ou peça ajuda à comunidade de suporte do Azure. Você também pode enviar comentários sobre o produto para a comunidade de comentários do Azure.