Como você estima quanta memória comprar?

10

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.

Martin Brown
fonte
Eu seria muito cauteloso ao projetar o uso de memória com base em 2 pontos de dados tão próximos. Eu teria sérias dúvidas de que o uso de memória (e E / S, nesse caso) seja dimensionado linearmente. Pode, mas suspeito que tenderá a não-linear à medida que você avança para grandes números. Eu testava com vários pontos de dados, progredindo de pequeno a grande até o desempenho se tornar problemático (paginação, saturação de E / S, etc.) e projetar a partir daí. Se for possível atualizar incrementalmente a máquina e continuar simulando com números maiores de clientes, eu o faria até ter uma boa ideia do formato da curva.
Evan Anderson
Você também precisa dar uma idéia melhor do que é isso. É web? aspx? php? Algo caseiro? Trabalhos em lote? O comportamento do asp.net é diferente das cargas de exes em execução em uma caixa. Você precisa de uma idéia básica do que o sistema usa por usuário - aprox. figuras - e depois um envelope antigo. Como você obtém esses números depende de como o seu sistema funciona.
31812 Ian Murphy
@Evan. Eu sempre pegaria mais de dois pontos de dados.
Martin Brown
@ Ian: "alguma idéia básica do que o sistema usa por usuário" é ansiosamente o que estou tentando descobrir. Se soubesse disso, não precisaria fazer a pergunta. Atualizei a pergunta para tentar cobrir seus outros pontos.
Martin Brown

Respostas:

8

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:

  1. 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)

  2. 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)

  3. 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.

  4. 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).

  5. Comprar muita RAM hoje é mais barato do que fazer com que seu ambiente caia amanhã.

    • Primeiro corolário: se você compra um servidor um pouco maior do que o necessário, é o administrador anterior que manteve a empresa em funcionamento. Você será amplamente ignorado e não apreciado.
    • Segundo corolário: se você subestima a máquina e há problemas, você é o bufão incompetente que não podia prever um crescimento de 500% e todo mundo o odeia.
voretaq7
fonte
Eu aprovo os corolários.
mfinni
Obrigado por isso. Embora tenhamos esse sistema ativo, ele atualmente está suportando um teste muito pequeno, o que significa que não consigo obter bons números dele.
Martin Brown
0

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:

2Tb of memory = 1024Gb = 1024*1024Mb = 1048576Mb
1048576Mb / 13000 connections = around 80mb per session

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.

Ian Murphy
fonte