O limite de serviço do Windows trava os serviços na inicialização

6

Desenvolvemos um serviço personalizado do Windows em C # como parte de um grande aplicativo corporativo. Nosso departamento de QA testa várias versões deste serviço.

O laboratório de controle de qualidade tem várias (mais de 20) cópias deste serviço instaladas em uma caixa de teste do Windows 2003. Cada cópia está em sua própria pasta e possui um nome de serviço exclusivo, embora cada arquivo executável tenha o mesmo nome (OurWindowsService.exe, por exemplo). Cada serviço usa as mesmas credenciais do Windows (um usuário do domínio).

A finalidade deste serviço é manipular mensagens do MSMQ. As mensagens enfileiradas fazem todo tipo de coisas importantes.

Por algum motivo, eles podem executar apenas 5 desses serviços por vez. Quando começamos a sexta, o serviço falha na inicialização.

Por exemplo, posso iniciar # 1, # 2, # 3, # 4 e # 5. Quando eu começo o 6, ele cai. No entanto, se eu parar # 1 e começar # 6, # 6 é executado corretamente, e agora # 1 falha ao iniciar.

Quando os serviços falham, o seguinte erro aparece no log de eventos do Windows:

Faulting application OurWindowsService.exe, version 5.40.1.1, faulting module kernel32.dll, version 5.2.3790.4480, fault address 0x0000bef7.

Consegui usar o WinDbg para gerar um arquivo de despejo postmortem. O arquivo de despejo revelou que a falha ocorre ao tentar atrasar o carregamento de SHLWAPI.dll:

0:000> kb100
ChildEBP RetAddr  Args to Child              
0012ece4 79037966 c06d007e 00000000 00000001 KERNEL32!RaiseException+0x53
0012ed4c 790099ba 00000008 0012ed08 7c82860c mscoree!__delayLoadHelper2+0x139
0012ed98 790075b1 001550c8 0012edac 0012fb34 mscoree!_tailMerge_**SHLWAPI_dll**+0xd
0012edb0 79007623 001550c8 0012edf8 0012edf4 mscoree!XMLGetVersionWithSupported+0x22
0012ee00 790069a4 aa06f1b0 00000000 000001fe mscoree!RuntimeRequest::GetRuntimeVersion+0x56
0012f478 790077aa 00000001 7903fb4c 0012fb34 mscoree!RuntimeRequest::ComputeVersionString+0x5bd
0012f89c 79007802 00000001 0012f8b4 7903fb4c mscoree!RuntimeRequest::FindVersionedRuntime+0x11c
0012f8b8 79007b19 00000001 00000000 aa06fa6c mscoree!RuntimeRequest::RequestRuntimeDll+0x2c
0012ffa4 79007c02 00000001 0012ffbc 00000000 mscoree!GetInstallation+0x72
0012ffc0 77e6f23b 00000000 00000000 7ffdf000 mscoree!_CorExeMain+0x12
0012fff0 00000000 79007bf0 00000000 78746341 KERNEL32!BaseProcessStart+0x23

Eu acredito que o código de erro entregue ao Kernel32.RaiseException, c06d007e, significa Module Not Found, mas não tenho certeza.

Isso soa familiar para alguém? Estamos atingindo algum limite no número de instâncias de serviço em algum nome de arquivo? O MSMQ não gosta de mais de 5 serviços de escuta?

    
por Paul Williams 31.08.2010 / 21:34

2 respostas

1

Se o seu serviço estiver carregando uma cópia do driver de fila de mensagens (Mqac.sys) por instância, é provável que você esteja recuperando o pool de memória do System View Space . Cada instância do MSMQ usa 4 MB desse pool e, por padrão, o tamanho do pool é de apenas 16 MB.

Se isso realmente está acontecendo, realmente dependerá de como (se é que) seu serviço usa o sistema MSMQ e se ele faz referência diretamente a ele (carrega suas bibliotecas) ou usa algum outro método, como sockets, para se comunicar com ele. / p>

Se você estiver carregando várias instâncias do MSMQ, poderá atenuar o problema aumentando o pool de espaço de exibição do sistema. Isso pode ser feito por:

  1. Abra a chave de registro HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Gerenciador de sessão \ Gerenciamento de memória.
  2. Crie um novo valor DWORD chamado SystemViewSize.
  3. Calcule e especifique esse valor da seguinte forma:
    • Use esta fórmula: (16 + (o número de recursos do Message Queuing carregados x 4)).
    • Por exemplo, o valor de um cluster com três recursos do serviço de enfileiramento de mensagens é igual a 28.
  4. Reiniciar
por 01.09.2010 / 03:13
0

Esse travamento significa que o SHLWAPI.dll não foi encontrado em seu computador. Analise sua pilha de chamadas, "XMLGetVersionWithSupported" chamar uma API exportada por SHLWAPI.dll em alguma condição, como sua descrição, a API foi chamada quando você executa serviços excedem 5 vezes.

    
por 26.10.2013 / 09:39