Ao modelar um teste de performance, uma das decisões mais importantes e que requer bom planejamento é frequentemente ignorada, a escolha do modelo de carga que será utilizado.
Essa escolha impacta diretamente na fidelidade do cenário e do ambiente de carga que se deseja reproduzir, sendo uma peça chave na confiabilidade dos resultados obtidos.
O K6 suporta dois modelos de carga distintos: o modelo fechado e o modelo aberto. Cada um deles possui características próprias, casos de uso específicos e executores dedicados.
Neste artigo, vamos explorar as diferenças entre esses modelos, e como se aplicam aos diferentes tipos de testes de performance.
Pré-requisitos📑
- K6 instalado
Modelos de carga⚖️
Antes de abordar o assunto modelos abertos e fechados, é importante entender que em um teste de performancea, eles representam a forma como o sistema controla a chegada e a saída de usuários virtuais (VUs) durante o ciclo de execução de um teste.
A escolha do modelo muda completamente a semântica do teste de performance planejado. Em alguns cenários por exemplo, esperamos controlar melhor quantos usuários estão ativos ao mesmo tempo, já em outros, podemos estar mais preocupados em garantir que uma determinada taxa de requisições(RPS) seja mantida, independentemente de quantos usuários são necessários para atingir.
Modelo Fechado🔒
No modelo fechado, o número de VUs é fixo e controlado. Um novo usuário só inicia sua próxima iteração quando a anterior é concluída. Isso significa que a concorrência permanece constante ao longo do teste.
export const options = {
scenarios: {
modelo_fechado: {
executor: 'constant-vus',
vus: 50,
duration: '1m',
},
},
};
export default function () {
// sua lógica de teste
}
Utilizar esse modelo nos gera uma consequência importante: se o sistema ficar lento, a taxa de requisições cai automaticamente, pois as VUs ficam aguardando a resposta antes de iniciar uma nova iteração. O pool de usuários ativos nunca cresce além do valor configurado.
Quando utilizar o modelo fechado?
O modelo fechado é ideal para sistemas onde o número de usuários simultâneos é previsível e limitado, como:
- Aplicações internas corporativas: onde apenas um grupo fixo de funcionários acessa o sistema simultaneamente.
- Sistemas com sessões controladas: como plataformas de streaming com limite de conexões por conta.
- Testes de resistência (Soak Tests): onde o objetivo é manter uma carga constante por longos períodos e observar o comportamento do sistema ao longo do tempo.
Executores do modelo fechado
| Executor | Descrição |
|---|---|
| constant-vus | Mantém um número fixo de VUs durante a execução do teste. |
| ramping-vus | Aumenta ou diminui gradualmente o número de VUs ao longo do tempo. |
| per-vu-iterations | Cada VU executa um número fixo de iterações antes de encerrar. |
| shared-iterations | Um pool de VUs compartilha um número total fixo de iterações. |
Modelo Aberto 🔓
No modelo aberto, novos usuários chegam em uma taxa constante e independente do que os usuários já ativos estão fazendo. Esse comportamento é muito mais próximo do que acontece em sistemas reais, onde usuários chegam continuamente sem esperar que outros terminem.
export const options = {
scenarios: {
modelo_aberto: {
executor: 'constant-arrival-rate',
rate: 100,
timeUnit: '1s',
duration: '1m',
preAllocatedVUs: 50,
maxVUs: 200,
},
},
};
export default function () {
// sua lógica de teste
}
No script acima temos um rate constante de 100 VUs, e um numero máximo de 200 VUs que podem ser utilizadas, com 50 pré alocadas antes de o testes de percormance iniciar.
O comportamento é o oposto do modelo fechado: se o sistema ficar lento, o K6 precisará de mais VUs para manter a taxa configurada.
Quando utilizar o modelo aberto?
O modelo aberto é ideal para sistemas de alto tráfego, onde a taxa de chegada de usuários é independente do tempo de resposta, como:
- APIs REST públicas: onde múltiplos clientes realizam requisições continuamente.
- E-commerces e portais web: onde os usuários chegam de forma independente.
- Testes de pico (Spike Tests): onde o objetivo é simular um aumento repentino e intenso de tráfego para verificar como o sistema reage.
- Testes de capacidade (Capacity Tests): onde o objetivo é descobrir quantas requisições por segundo o sistema consegue sustentar antes de degradar.
Executores do modelo aberto
| Executor | Descrição |
|---|---|
| constant-arrival-rate | Mantém uma taxa fixa de iterações por unidade de tempo. |
| ramping-arrival-rate | Aumenta ou diminui gradualmente a taxa de chegada de iterações ao longo do tempo. |
Comparando os modelos🧠
A tabela resumimos as principais diferenças entre os dois modelos:
| Característica | Modelo Fechado | *Modelo Aberto * |
|---|---|---|
| O que é controlado | Número de VUs | Taxa de chegada de iterações |
| Comportamento sob lentidão | Taxa de requisições cai | Número de VUs aumenta |
| Realismo | Menor | Maior para sistemas web |
| Tipos de teste | Smoke, Soak, Load, Stress | Load, Spike, Capacity |
| Executores K6 |
constant-vus, ramping-vus
|
constant-arrival-rate, ramping-arrival-rate
|
Um erro comum na escolha🙅🏻♂️
Muitos times ainda utilizam o modelo fechado para todos os seus testes por ser o padrão e o mais simples de configurar. o que é um problema em sistemas web com tráfego orgânico, isso pode mascarar problemas sérios de performance.
Imagine o cenário: o sistema começa a responder lentamente devido a uma sobrecarga.
- No modelo fechado as VUs ficam aguardando as respostas, e a taxa de requisições cai automaticamente, o que reduz a pressão sobre a aplicação e pode resultar em uma falsa impressão de que ele estabilização do ambiente. - No modelo aberto, o comportamento seria o inverso, novos usuários continuariam chegando na taxa configurada, expondo a degradação real da aplicação.
// Modelo fechado: a taxa de requisições cai quando o sistema fica lento
executor: 'constant-vus', vus: 100
// Modelo aberto: a pressão é mantida, e o sistema é exposto
executor: 'constant-arrival-rate', rate: 100, timeUnit: '1s'
Conclusão❤️
O K6 oferece uma flexibilidade na modelagem de cenários de carga, e entender a diferença entre os modelos aberto e fechado é fundamental para criar testes que realmente reflitam o comportamento do seu sistema em produção.
Use o modelo fechado quando o número de usuários simultâneos é o que importa, e o modelo aberto quando a taxa de chegada de requisições é o fator crítico.
Gostou do conteúdo e quer saber mais sobre testes de performance com K6? Confira meu curso na Udemy!
Top comments (1)
Desculpe a minha ignorância oque é k6?