O que significa “A operação de E / S no endereço do bloco lógico # para o nº do disco foi repetido”? quando visto no log de eventos do Windows Server System?

20

Eu tenho o servidor de configuração do IO do multipath 2012 blade que mostra avisos como o seguinte durante a falha do caminho do MPIO:

The IO operation at logical block address 0 for Disk 7 was retried.

Eu sei o que está causando o aviso, então não estou procurando a causa, mas o que essa mensagem realmente significa?

Isso significa que, se esse IO fosse uma operação de gravação, o servidor realmente perderia os dados que estava tentando gravar?

Obrigado por qualquer luz que você possa lançar sobre o significado desta mensagem de aviso.

    
por Chris Magnuson 14.04.2013 / 19:48

3 respostas

26

Não, isso não significa que os dados foram perdidos. Significa simplesmente que o IRP (IO Request Packet) atingiu o tempo limite enquanto o IO System aguardava sua conclusão e, portanto, foi tentado novamente. Quando um thread inicia qualquer operação de E / S, o gerente de E / S cria um IRP para representar a operação conforme ela passa pelo sistema.

O IRP é armazenado em seu estado inicial em uma lista de buffer / look-aside, para que possa ser tentada novamente se falhar na primeira vez. Isso fornece a atomicidade que se esperaria de qualquer sistema transacional para que possamos ter mais confiança de que você não obterá muitos dados corrompidos ou incompletos gravados em seu disco.

Este evento faz todo o sentido no caso de uma falha no MPIO. Digamos que o Windows leia ou escreva algo do armazenamento SAN. A solicitação é enviada e, no mesmo instante, eu cortei um dos cabos para a SAN. Essa solicitação nunca será concluída e, assim, o Windows tentará a solicitação novamente, somente que, desta vez, a solicitação seguirá o outro caminho.

Esses eventos também ocorrem quando os discos estão sobrecarregados ou muito lentos. Você pode notar que essas mensagens coincidem com backups agendados, etc. O disco pode estar lento e ocupado, e algum IRP aleatório atingiu o tempo limite e teve que tentar novamente. O IRP pode estar ficando preso em uma rotina de serviço de interrupção, ou uma chamada de procedimento adiada, ou o que quer que seja.

Eu pude ver muitos drivers de filtro de E / S em sua pilha exacerbando esse problema também.

Não é que esse comportamento não tenha ocorrido exatamente como nas versões anteriores do Windows, mas sim que a Microsoft aparentemente decidiu exibir esses eventos no Win8 / Server 2012.

Editar: Você pode encontrar os IRPs pendentes de um thread com um depurador de kernel: kd> !irp 1a2b3c4d , onde você encontrou esse endereço anteriormente emitindo o comando kd> !process 8f7d6c4a , que listará todos os IRPs associados aos encadeamentos associados a esse processo. kd> !process 0 0 para listar todos os processos em execução.

Depois de listar as informações sobre um IRP usando o comando! irp, você poderá identificar facilmente qual driver tratou pela última vez o IRP porque ele terá um > apontando para ele na lista. Em seguida, para obter mais informações sobre o que o driver estava fazendo com esse IRP, faça um kd> !devobj 1a2b3c4d5e6f , onde esse é o endereço real do objeto do dispositivo.

Em seguida, faça um kd> dt 0x1a2b3c3c2b1a _CLASS_PRIVATE_FDO_DATA usando o endereço da estrutura PrivateFdoData que você obteve.

Agora você está pronto para despejar a estrutura de dados AllTransferPacketsList que você obteve de PrivateFdoData.

A idéia é, você está rastreando o que o motorista estava fazendo com o IRP da última vez que foi visto. Se o IRP for AWOL por muito tempo, ele será expirado e tentado novamente desde o início. Isso pode ser causado por tantas coisas ... até mesmo um raio cósmico perdido. Mas o importante é que a transação será repetida desde o início e não será considerada completa até que o gerente de IO diga que é.

Ah, e há também IO agnóstico de thread, que é uma lata de worms completamente diferente. :)

Para mais informações sobre este tópico, eu altamente recomendo o capítulo 8, Sistema I / O, do Windows Internals 6ª edição, de Mark Russinovich, Margosis, et al.

** Editar: ** Eu finalmente encontrei a KB oficial para este erro: link

A operação IO deve ser repetida 8 vezes, uma vez por minuto, até que o Windows desista.

Editar: conforme prometido: link

    
por 14.04.2013 / 21:30
5

Não, haveria uma mensagem diferente e (espero) que uma das camadas do aplicativo lançaria uma exceção se não conseguisse salvar os dados com êxito.

Antes do Windows Server 2012 (ou do hotfix 2819485, se no Windows Server 2008 R2), o sistema tentava silenciosamente quando esses tempos limites ocorriam. O objetivo da mensagem é aumentar a visibilidade sobre essas ocorrências. Eles podem indicar um problema de capacidade ou defeito do driver e, no caso do iSCSI, outros defeitos do sistema operacional podem ser atribuídos ao atraso.

No caso de armazenamento externo (não conectado diretamente), alguns fornecedores no passado aumentaram o valor de tempo limite, por exemplo, para 60 segundos. No entanto, dado o número padrão de tentativas de componentes de camada superior, como o iniciador iSCSI, isso pode significar que vários minutos podem decorrer antes que o sistema inicie um failover. Isso obviamente seria um comportamento sub-ótimo.

Mais informações:

Entradas de registro para drivers SCSI Miniport link

link

A Microsoft lançou uma atualização que fornece a capacidade de especificar o limite para as operações do storport.sys.

Depois de instalar esta atualização, você pode registrar um evento quando o tempo de latência para E / S para armazenamento for igual ou maior que um limite. O valor limite pode ser definido pelo usuário. Essa operação é executada no nível do Driver do Adaptador para que você possa ver se há um problema de desempenho na SAN. Em seguida, você pode entrar em contato com um fornecedor de armazenamento para resolver o problema.

Observação: essa atualização restaura a funcionalidade fornecida no Windows 7 e no Windows Server 2008 R2. Quando a funcionalidade está ativada, o valor limite é medido em 100 nanossegundos (0,0001 milissegundos). Além disso, os seguintes valores são registrados no evento:

BuildIoDuration : período de tempo que o MINIPORT gastou na função build I / O para esta solicitação StartIoDuration : período de tempo que o MINIPORT gastou na função de E / S inicial para esta solicitação DataTransferLength : tamanho da transferência em bytes

Atualização que melhora os recursos de log do driver Storport.sys no Windows Server 2012
link

Atualização cumulativa do Windows 8 e Windows Server 2012: abril de 2013
link

    
por 14.04.2013 / 21:49
3

Pode ser uma postagem atrasada, mas descobri que isso pode ser causado com o VSS. Nós tínhamos um cliente que estava rodando véu, mas tinha se esquecido de desligar o servidor windows (o disco foi removido). Isso causou uma grande quantidade de problemas e esse erro foi o principal.

Parou o backup e não houve erros.

    
por 03.01.2014 / 09:02