DEV Community

Lucas Amaral
Lucas Amaral

Posted on • Originally published at Medium on

Lei de Little e o dimensionamento de Testes de Performance

Você acabou de implantar uma nova funcionalidade e o seu líder pede para você realizar um teste de carga. O objetivo? Garantir que o sistema aguente 500 requisições por segundo. Você abre uma ferramenta como o JMeter ou o Locust e se depara com a pergunta de um milhão de dólares: “Quantos usuários virtuais eu devo configurar para atingir esse objetivo?”

Se você tentar adivinhar, provavelmente vai derrubar o servidor ou criar um teste que não reflete a realidade. É aqui que entra a Lei de Little , uma fórmula matemática simples que vai se auxiliar no dimensionamento para seus testes de performance de software.

Neste artigo, vamos desmistificar esse conceito, entender o comportamento humano nos testes e mostrar como aplicar tudo isso na prática.

O que é a Lei de Little?

Formulada pelo professor John Little em 1961, essa lei nasceu no contexto da engenharia de produção e teoria das filas (como filas de banco ou supermercados). Ela dita que, em um sistema estável, existe uma relação fixa entre três variáveis:

  1. O número de itens dentro do sistema (Inventário).
  2. A velocidade com que os itens entram e saem (Taxa de transferência).
  3. O tempo que cada item passa lá dentro (Tempo de permanência).

A fórmula matemática oficial é:

Traduzindo para o mundo do Software

Para desenvolvedores, os “itens” são as requisições ou os usuários, e o “sistema” é a nossa aplicação (API, banco de dados, servidor). Reescrevendo os termos para a nossa realidade, temos:

  • L (Concorrência / WIP): O número médio de requisições sendo processadas simultaneamente no servidor.
  • λ (Throughput / Vazão): A taxa de sucesso das requisições (ex: requisições por segundo — RPS).
  • W (Response Time / Tempo de Resposta): O tempo médio que o sistema leva para responder a uma requisição.

Analogia do Restaurante: Imagine um restaurante onde entram 2 clientes por minuto (λ = 2) e cada cliente passa, em média, 30 minutos jantando (W = 30). Quantas pessoas estão dentro do restaurante ao mesmo tempo (L)?

L = 2 x 30 = 60 clientes

Se o restaurante tiver apenas 40 cadeiras, haverá fila na porta! O mesmo acontece com a memória e a CPU do seu servidor.

Expandindo a Fórmula: O Fator Humano e o Think Time

Quando testamos aplicações web, há um detalhe crucial: seres humanos não se comportam como robôs hiperativos. Se você entrar em um e-commerce, você não clica na Home Page e, em 0,001 segundos, clica em um produto. Você entra na página, gasta alguns segundos lendo os destaques, escolhe o produto, lê as especificações e só depois clica em “Adicionar ao carrinho”.

Esse intervalo de tempo em que o usuário está consumindo a informação na tela, pensando ou digitando, sem enviar nenhuma requisição para o servidor , é chamado de Think Time (Z).

Para incluir o comportamento humano no teste de carga, expandimos a Lei de Little para a Lei do Tempo de Resposta do Sistema Central :

Onde:

  • N = Número de Usuários Virtuais ativos (Concorrência).
  • X = Throughput desejado (Requisições por segundo).
  • R = Tempo de resposta do servidor.
  • Z = Think Time (Tempo de pensamento do usuário).

Por que o Think Time é o herói anônimo do seu teste?

Negligenciar o Think Time é o erro número um de quem está começando em performance. Sem ele, seus usuários virtuais agem como uma “metralhadora de requisições”. As consequências disso são graves:

  • Superfaturamento Artificial de Carga: Se 100 usuários reais com Think Time geram 20 RPS (visto que passam a maior parte do tempo lendo a tela), esses mesmos 100 usuários virtuais sem Think Time podem gerar 2.000 RPS. Você vai derrubar o servidor e reportar um bug falso, pois esse cenário de estresse não existe no mundo real.
  • Desperdício de Dinheiro em Nuvem: Ao ver o servidor travar com poucos usuários virtuais, a liderança pode achar que o sistema é fraco e gastar milhares de dólares escalando máquinas na AWS/Azure desnecessariamente.
  • Simulação Fiel de Recursos: O servidor lida de forma diferente com “100 conexões abertas e ociosas esperando o clique” (consome memória para manter a sessão aberta, mas não CPU) versus “100 conexões processando dados na velocidade máxima”. O Think Time equilibra essa balança.

Como aplicar a Lei de Little em seus Testes de Carga

Como um desenvolvedor Júnior pode usar esse conhecimento no dia a dia? Aqui estão os dois principais casos de uso:

1. Planejando o Cenário de Teste (Sem adivinhação)

Imagine o seguinte cenário passado pelo seu Product Owner (PO): “Precisamos validar se nossa API aguenta 100 requisições por segundo (X). Sabemos que o tempo de resposta atual dela é de 500ms (R = 0,5s) e estimamos que o usuário espera 1,5 segundos (Z) entre as ações.”

Quantos usuários simulados você deve colocar na ferramenta de teste? Vamos aplicar a fórmula expandida:

N = 100 x (0,5 + 1,5)

N = 100 x 2 = 200 usuários virtuais

Pronto! Você descobriu matematicamente que precisa configurar exatamente 200 usuários virtuais para atingir o objetivo de negócio de forma realista.

2. Identificando Mentiras nos Gráficos (Sanity Check)

Ferramentas de teste e painéis de monitoramento (como Grafana) podem falhar ou exibir dados distorcidos se a infraestrutura estiver sobrecarregada. A Lei de Little serve como o seu detector de mentiras.

Imagine que, durante um teste com 100 usuários fixos (N), o tempo de resposta da API (R) de repente dobrou devido a uma lentidão no banco de dados.

Pela matemática da Lei de Little, se o tempo de resposta (R) subiu e o número de usuários (N) permaneceu igual, a taxa de transferência (X) obrigatoriamente precisa cair. Se o seu gráfico mostrar que o Throughput continuou alto, há algo errado com a máquina que está disparando os testes (ela pode estar sem memória e enfileirando os dados localmente).

O Ponto de Inflexão: Quando o sistema satura

A Lei de Little funciona perfeitamente enquanto o sistema está estável. Porém, todo software tem um limite físico (limite de conexões com o banco, threads de CPU, etc.).

Quando esse limite é atingido, o Throughput (X) para de crescer e se estabiliza em um teto. Se você continuar adicionando usuários (N) além desse ponto, o tempo de resposta (R) começará a subir vertiginosamente, pois as novas requisições ficarão presas em uma fila de espera (backlog). O Think Time (Z) funciona aqui como um amortecedor, atrasando o momento em que o sistema atinge esse colapso.

Dica de Ouro: Configurando o Think Time nas Ferramentas

Como humanos não gastam exatamente o mesmo tempo em cada página, você deve evitar usar um valor fixo. Use valores aleatórios ou distribuições estatísticas dentro de uma faixa de tempo. Veja como fazer:

  • No Locust (Python):
  • Python
from locust import HttpUser, task, between  

class UsuarioEcommerce(HttpUser):
  # Simula um think time aleatório entre 1 e 5 segundos entre as ações     
  wait_time = between(1, 5)
  @task
  def acessar_home(self):
    self.client.get("/")
Enter fullscreen mode Exit fullscreen mode
  • No JMeter: Adicione o componente Gaussian Random Timer ou Uniform Random Timer dentro do seu fluxo de requisições.
  • No Gatling (Java/Kotlin): Use o método .pause(min, max) entre as requisições HTTP.

Conclusão

Para quem está começando, testes de performance podem parecer uma caixa preta cheia de dados aleatórios. A Lei de Little e o entendimento do Think Time trazem clareza e embasamento científico para o seu trabalho, permitindo que você justifique suas configurações de teste para arquitetos e líderes técnicos com segurança.

Da próxima vez que abrir uma ferramenta de teste, lembre-se: Performance não é sobre simular ataques de negação de serviço (DDoS) robóticos, é sobre entender e modelar o fluxo real dos seus usuários.

Referências para se aprofundar:

  • Little, J. D. C. (1961). A Proof for the Queuing Formula: L = λ x W. Operations Research. (O artigo científico original).
  • Jain, R. (1991). The Art of Computer Systems Performance Analysis. Wiley. (Considerada a bíblia da análise de performance de sistemas).
  • Documentação das Ferramentas: Os guias oficiais do Gatling, JMeter e Locust possuem seções ricas detalhando o uso de Timers e Pauses baseados na modelagem de carga de Little.

Artigo escrito auxiliado por Google Gemini

Top comments (0)