Eu tenho um aplicativo de servidor personalizado que é executado no Windows 2008 R2. É um serviço Windows desenvolvido em casa, escrito em .Net, que suporta vários terminais personalizados. Eu tenho uma máquina de teste que tem uma especificação semelhante ao servidor ativo e um conjunto de simuladores de clientes que posso usar para produzir uma carga que é uma aproximação razoável do sistema real. Preciso suportar 12.000 delas e, atualmente, o servidor está ficando sem memória (a paginação está passando do teto).
Meu plano era iniciar apenas 100 dos simuladores, medir o uso de memória e, em seguida, iniciar mais 100 medidas de memória novamente e repetir até que a paginação comece a subir (na realidade, eu vou usar mais de três pontos de dados). a quantidade de memória extra necessária para 100 simuladores e me permite projetar quanta memória é necessária. Eu só preciso de uma idéia aproximada de +/- 30 GB para evitar comprar os 2 TB completos (valor de US $ 150.000) que o servidor levará. Minha pergunta é se esse é um método razoável de usar e, em caso afirmativo, quais contadores de desempenho você monitoraria para fornecer a quantidade de memória realmente usada?
Estou falando especificamente sobre memória aqui, pois a diferença entre conjunto de trabalho, bytes privados, confirmada, compartilhada, virtual e todos os outros termos de memória me confunde. Acho que consigo monitorar a CPU, E / S e redes sozinho. A outra coisa que notei é que o .Net Cache ajusta seu uso de memória dependendo do que está disponível, o que dificulta a visualização de uma tendência.
fonte
Respostas:
Honestamente? EU NÃO .
Ao especificar um servidor que verá qualquer tipo de carga de trabalho real, eu acumulo tanta RAM quanto posso razoavelmente (os sistemas tendem a acabar com restrição de RAM do que com CPU ou disco - o único outro gargalo garantido é o lado da frente ônibus).
Se você deseja descobrir quanta RAM seu aplicativo pode usar um teste de carga básico, como você propôs, é um bom começo, mas se você já possui esse sistema em produção (parece que você tem) e seu sistema de produção está trocando seu a tarefa é mais fácil: descubra quanto espaço de troca você está usando -> Adicione pelo menos 2x a quantidade de RAM (arredondada para ajustar-se às restrições de tamanho DIMM do sistema).
Se você realizar um teste de carga para obter números aproximados e extrapolar a partir daí, lembre-se de levar em consideração algumas coisas:
A curva de memória provavelmente será de dois segmentos distintos
(aumento acentuado inicial à medida que as estruturas / bibliotecas compartilhadas são armazenadas em cache e, em seguida, uma curva um pouco menos acentuada à medida que o código não compartilhável de cada novo aplicativo é colocado na memória)
Você ainda precisa de RAM grátis para armazenamento em cache de disco e biblioteca compartilhada e para o sistema operacional.
(Isso deve levar pelo menos alguns shows para o que seu aplicativo precisa)
TODO O software vaza memória (pelo menos, todo o software prático), portanto, preste atenção nos testes e verifique se você tem espaço para lidar com um vazamento.
Sua carga provavelmente aumentará ao longo da vida útil do servidor. Planeje adequadamente.
(Se você não tiver bons números de planejamento de capacidade, duplique a carga de trabalho de hoje e planeje lidar com isso).
Comprar muita RAM hoje é mais barato do que fazer com que seu ambiente caia amanhã.
fonte
Obrigado, a atualização pelo menos dá a todos uma pista. O fato de você estar pensando em 2 TB de memória significa que está jogando em um estádio diferente das configurações usuais. Grande sistema. odeio pensar em quanto calor isso vai colocar para fora.
Dado que é um processo interno do servidor e que você está ficando sem memória (não diz em que nível inicia a paginação), eu gostaria de eliminar a possibilidade de que o processo do servidor esteja consumindo quantidades cada vez maiores de memória antes de usar qualquer mais longe. Se isso ocorrer, não faz diferença o que você faz, o sistema irá parar em algum momento.
Não conheço nenhuma ferramenta genérica que você possa usar para fornecer muito mais do que uma visão geral básica do que está acontecendo ... o que vem com o Windows. O processo de serviço em si é uma caixa preta e sua equipe de desenvolvimento precisa fornecer ferramentas de monitoramento.
Retorno rápido do cálculo do envelope:
Isso não estaria fora do alcance do conjunto de trabalho normal de um .net exe.
O serviço possui vários threads? Se eles estiverem lançando um encadeamento para cada conexão, vale a pena examinar como eles estão fazendo isso. ProcExp.exe da microsoft é uma maneira fácil de ver se você tem vários threads e o que esses threads estão consumindo. Ele não conhece o .net, mas fornecerá contadores win32.
Você pode indicar quanta memória e quantas conexões você tinha ao fazer seu teste antes de iniciar a paginação?
Então, como estabelecer se o processo do servidor tem problemas de vazamento de memória? Pode estar acumulando mais memória com cada sessão conectada, ou pode estar acumulando memória e não a liberando.
O que você pode fazer é - escolha um número de sessões que não provoque paginação e simule esse número de conexões. - Execute a simulação por algumas horas e use perfmon para assistir aos contadores de memória básicos. - Repita esses testes com sessões que se conectam brevemente e desconectam.
A idéia é verificar se o serviço está consumindo cada vez mais memória a cada sessão ou se as sessões abertas provocam um aumento no uso da memória.
fonte