<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>loadtest.app</title><description>Ferramentas de teste de carga analisadas e comparadas, e guias para rodar e ler testes de carga.</description><link>https://loadtest.app/</link><language>pt-BR</language><item><title>Lei de Amdahl: fórmula, exemplos e limites</title><link>https://loadtest.app/pt-br/amdahls-law/</link><guid isPermaLink="true">https://loadtest.app/pt-br/amdahls-law/</guid><description>A lei de Amdahl explicada: fórmula, tabela de aceleração e exemplos, mais a lei de Gustafson, a USL e o que elas significam para testes de carga.</description><pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;A lei de Amdahl (Amdahl&amp;#39;s law) diz que a aceleração obtida ao executar um trabalho em paralelo é limitada pela parte que não pode rodar em paralelo. Se uma fração p do trabalho se divide entre n processadores, servidores ou threads, a aceleração é S = 1 / ((1 − p) + p/n), e por mais que n cresça ela nunca passa de 1 / (1 − p). Com 95% do trabalho em paralelo, o teto é de 20 vezes, mesmo em mil máquinas.&lt;/p&gt;
&lt;p&gt;Os números abaixo são aritmética, sem nenhum teste executado por trás. Os artigos citados foram conferidos em 1º de novembro de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fração paralela p&lt;/th&gt;
&lt;th&gt;n = 2&lt;/th&gt;
&lt;th&gt;n = 8&lt;/th&gt;
&lt;th&gt;n = 64&lt;/th&gt;
&lt;th&gt;n → ∞&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;0,50&lt;/td&gt;
&lt;td&gt;1,33&lt;/td&gt;
&lt;td&gt;1,78&lt;/td&gt;
&lt;td&gt;1,97&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,90&lt;/td&gt;
&lt;td&gt;1,82&lt;/td&gt;
&lt;td&gt;4,71&lt;/td&gt;
&lt;td&gt;8,77&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,95&lt;/td&gt;
&lt;td&gt;1,90&lt;/td&gt;
&lt;td&gt;5,93&lt;/td&gt;
&lt;td&gt;15,42&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,99&lt;/td&gt;
&lt;td&gt;1,98&lt;/td&gt;
&lt;td&gt;7,48&lt;/td&gt;
&lt;td&gt;39,26&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;O que a lei diz em termos simples?&lt;/h2&gt;
&lt;p&gt;Um trabalho não pode terminar mais rápido do que sua parte sequencial, então workers extras só encurtam o resto. Quando a parte paralela já é pequena perto da sequencial, mais workers quase não mudam o tempo total.&lt;/p&gt;
&lt;p&gt;Pense em um trabalho de 10 segundos em que 1 segundo é sequencial (um lock, uma escrita única) e 9 segundos se dividem por igual, ou seja, p = 0,9. Oito workers o terminam em 1 + 9/8 = 2,125 segundos (4,71 vezes mais rápido); sessenta e quatro precisam de cerca de 1,14 segundo. Nada o leva abaixo de 1 segundo, então 10 é o teto.&lt;/p&gt;
&lt;h2&gt;De onde vem a lei?&lt;/h2&gt;
&lt;p&gt;Gene Amdahl apresentou o argumento em 1967, na AFIPS Spring Joint Computer Conference, em um artigo que defendia a abordagem de processador único.&lt;/p&gt;
&lt;p&gt;Não lemos o texto completo de &lt;a href=&quot;https://doi.org/10.1145/1465482.1465560&quot;&gt;Validity of the single processor approach to achieving large scale computing capabilities&lt;/a&gt;. Mark Hill e Michael Marty o resumem em &lt;a href=&quot;https://research.cs.wisc.edu/multifacet/amdahl/&quot;&gt;Amdahl&amp;#39;s Law in the Multicore Era&lt;/a&gt; (IEEE Computer, 2008): uma fração paralelizável sem limite e sem custo de escalonamento, o resto totalmente sequencial, e a aceleração descrita sem apresentar uma equação (&amp;quot;without presenting an equation&amp;quot;).&lt;/p&gt;
&lt;h2&gt;O que isso significa para testes de carga e de capacidade?&lt;/h2&gt;
&lt;p&gt;A vazão para de crescer no ritmo dos servidores, threads ou pods assim que um componente compartilhado atende parte de cada requisição uma de cada vez. Um teste de carga mostra isso como uma curva de vazão que se achata enquanto você continua adicionando capacidade.&lt;/p&gt;
&lt;p&gt;O artigo de Neil Gunther de 2008, citado abaixo, escreve a mesma lei como N / (1 + σ(N − 1)), com σ como fração sequencial, e mede a escalabilidade como a vazão com N dividida pela vazão com 1. Em um sistema web, a parte sequencial é tudo por onde cada requisição precisa passar na sua vez: um lock ou uma linha que toda requisição atualiza, um único banco de dados primário que recebe todas as escritas, um único consumidor de fila ou uma API de terceiros com limite de taxa.&lt;/p&gt;
&lt;h2&gt;Como encontrar a parte sequencial em um teste de carga?&lt;/h2&gt;
&lt;p&gt;Rode o mesmo teste em vários níveis de carga e observe qual recurso satura enquanto a vazão se achata. O componente que está no limite quando a capacidade extra deixa de compensar é a parte sequencial, ou a fila na frente dela.&lt;/p&gt;
&lt;p&gt;Sinais típicos: a vazão estaciona enquanto a camada de aplicação ainda tem CPU livre, as esperas crescem em um único ponto compartilhado (locks, conexões com o banco, profundidade da fila), e o tempo de resposta sobe no mesmo ritmo que os usuários, que é a &lt;a href=&quot;https://loadtest.app/pt-br/littles-law-load-testing/&quot;&gt;lei de Little&lt;/a&gt; diante de um teto. Uma execução com carga constante não consegue mostrar isso, então suba a carga em degraus. A configuração &lt;a href=&quot;https://loadfocus.com/docs/guides/load-testing/what-is-ramp-up-steps-in-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=amdahls-law&quot;&gt;Ramp Up Steps&lt;/a&gt; da LoadFocus adiciona usuários virtuais em lotes iguais. O &lt;a href=&quot;https://loadfocus.com/docs/guides/load-testing/reading-the-capacity-panel?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=amdahls-law&quot;&gt;painel Capacity&lt;/a&gt; (página em inglês) agrupa uma execução terminada por usuários virtuais ativos e, nos planos pagos, lista o p95, as requisições por segundo e a taxa de erro de cada degrau nas execuções com um só gerador de carga. Só indica um nível de capacidade quando a execução passou por pelo menos três degraus e o mais alto foi pelo menos o dobro do mais baixo. Ele não ajusta nenhum modelo de escalabilidade, então o ajuste mais abaixo fica com você.&lt;/p&gt;
&lt;h2&gt;O que é a lei de Gustafson?&lt;/h2&gt;
&lt;p&gt;É o contraponto: se o problema cresce junto com a máquina, a parte sequencial continua pequena e a aceleração cresce quase de forma linear. Amdahl fixa o trabalho; Gustafson fixa o tempo de execução.&lt;/p&gt;
&lt;p&gt;A nota de John Gustafson de 1988, &lt;a href=&quot;https://doi.org/10.1145/42411.42415&quot;&gt;Reevaluating Amdahl&amp;#39;s law&lt;/a&gt;, relatou acelerações de 1016 a 1021 em um hipercubo de 1024 processadores em Sandia, para aplicações com parte sequencial de 0,4 a 0,8%, e argumentou que os usuários aumentam o problema até preencher o tempo de que dispõem. Com s&amp;#39; como a parte sequencial medida na execução paralela, a aceleração escalada, uma fórmula que a nota atribui a E. Barsis, de Sandia, é N + (1 − N)s&amp;#39;.&lt;/p&gt;
&lt;p&gt;Com s&amp;#39; = 0,05 e 64 processadores, isso dá 60,85, contra 15,42 segundo Amdahl, porque os dois valores de 5% são medidos em máquinas diferentes. Em um sistema web, Gustafson se aplica quando cada servidor adicionado trabalha com sua própria parte dos dados; Amdahl se aplica quando cada usuário a mais continua tocando a mesma linha compartilhada.&lt;/p&gt;
&lt;h2&gt;O que a Universal Scalability Law acrescenta?&lt;/h2&gt;
&lt;p&gt;Um segundo termo de coerência, o custo de manter dados compartilhados consistentes entre workers, que cresce com o número de pares de workers. Com ele, a vazão pode chegar a um máximo e depois cair à medida que você adiciona capacidade.&lt;/p&gt;
&lt;p&gt;O artigo de Gunther &lt;a href=&quot;https://arxiv.org/abs/0808.1431&quot;&gt;A General Theory of Computational Scalability Based on Rational Functions&lt;/a&gt; (arXiv, 2008) formula a Universal Scalability Law (USL) assim:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;C(N) = N / (1 + σ(N - 1) + κN(N - 1))
peak at N* = sqrt((1 - σ) / κ)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;σ é a contenção (serialização ou filas) e κ é a coerência (cópias inconsistentes dos dados); com κ = 0 sobra a fórmula de Amdahl. Entre os exemplos de Gunther para o pior caso está a atualização de registros em banco de dados, e ele chama de &amp;quot;retrograde&amp;quot;, ou seja, decrescente, a vazão além de N*. Com os valores de exemplo σ = 0,05 e κ = 0,001, o máximo fica perto de 31 workers: a vazão relativa é 9,03 com 32 e 7,82 com 64, onde o termo σ sozinho prevê 15,42.&lt;/p&gt;
&lt;h2&gt;Como ajustar a USL a uma série de testes de carga?&lt;/h2&gt;
&lt;p&gt;Meça a vazão em vários níveis de concorrência, divida cada valor pela vazão com um usuário e ajuste σ e κ por mínimos quadrados.&lt;/p&gt;
&lt;p&gt;Rearranjada, a fórmula fica N / C − 1 = σ(N − 1) + κN(N − 1), que é linear em σ e κ. Os valores abaixo foram gerados a partir de σ = 0,05 e κ = 0,001; coloque em x suas próprias requisições por segundo de cada degrau:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import numpy as np

n = np.array([1, 2, 4, 8, 16, 32])          # virtual users
x = np.array([50, 95, 172, 284, 402, 452])  # req/s per level
c = x / x[0]                                # relative capacity
A = np.column_stack([n - 1, n * (n - 1)])
(s, k), *_ = np.linalg.lstsq(A, n / c - 1, rcond=None)
print(f&amp;quot;sigma={s:.3f} kappa={k:.4f}&amp;quot;)
print(f&amp;quot;peak near {np.sqrt((1 - s) / k):.0f} users&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O script imprime &lt;code&gt;sigma=0.050&lt;/code&gt;, &lt;code&gt;kappa=0.0010&lt;/code&gt; e um máximo perto de 31 usuários. Mude só a concorrência entre os degraus e inclua um degrau com um usuário, já que cada ponto é dividido por ele.&lt;/p&gt;
&lt;h2&gt;Onde esses modelos deixam de ser úteis?&lt;/h2&gt;
&lt;p&gt;Eles resumem uma curva de vazão em uma ou duas constantes, então não conseguem apontar o lock culpado nem acompanhar um sistema que muda sob carga. Use-os para ler uma curva medida e estendê-la um pouco: um ajuste com degraus muito abaixo do joelho diz pouco sobre o máximo.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parâmetros constantes. Um cache que esquenta, um autoscaler ou um pool que chega ao limite mudam σ e κ no meio do teste.&lt;/li&gt;
&lt;li&gt;Só vazão. O p95 e o p99 podem piorar antes: confira também a &lt;a href=&quot;https://loadtest.app/pt-br/tail-latency/&quot;&gt;latência de cauda&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;O gerador de carga. Se ele saturar primeiro, a curva plana é dele.&lt;/li&gt;
&lt;li&gt;Testes fechados. Um número fixo de usuários virtuais mede um &lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;sistema fechado&lt;/a&gt;; usuários reais chegam no próprio ritmo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Você pode explicar a lei de Amdahl de forma simples?&lt;/strong&gt;
Um trabalho nunca é mais rápido do que a parte que não pode ser dividida. Se um décimo do trabalho precisa rodar em série, nenhum número de workers extras o deixa mais de dez vezes mais rápido, porque esse décimo continua levando o mesmo tempo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O que é a lei de Gustafson?&lt;/strong&gt;
A lei de Gustafson diz que, quando o problema cresce com o número de processadores, a aceleração cresce quase de forma linear, como N + (1 − N)s&amp;#39;, em que s&amp;#39; é a parte sequencial da execução paralela. John Gustafson a publicou em 1988 (atribuindo a fórmula a seu colega de Sandia E. Barsis) como contraponto à suposição de Amdahl de um problema de tamanho fixo.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/littles-law-load-testing/&quot;&gt;Lei de Little em teste de carga: dimensionar e conferir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/throughput-vs-latency/&quot;&gt;Vazão vs latência: como se relacionam sob carga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;Modelo de carga aberto vs fechado: qual usar e quando&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/tail-latency/&quot;&gt;Latência de cauda: o que é e como medir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/queueing-theory/&quot;&gt;Teoria das filas: o que é e por que a latência dispara&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Teoria das filas: o que é e por que a latência dispara</title><link>https://loadtest.app/pt-br/queueing-theory/</link><guid isPermaLink="true">https://loadtest.app/pt-br/queueing-theory/</guid><description>Teoria das filas explicada: chegadas, servidores, notação de Kendall, por que a latência dispara perto de 100% de uso e o que isso muda nos seus testes.</description><pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;A teoria das filas (em inglês, queueing theory) é a matemática da espera: a partir do ritmo em que o trabalho chega, de quanto cada tarefa demora e de quantos servidores existem, ela prevê quanto tempo as tarefas esperam e quanto a fila cresce. Para software, o resultado mais útil é que o tempo de resposta cresce devagar com carga moderada e depois de forma brusca quando um servidor se aproxima de 100% de ocupação. No modelo mais simples, um servidor ocupado 90% do tempo responde em média dez vezes mais devagar que um ocioso.&lt;/p&gt;
&lt;p&gt;Os números abaixo são aritmética a partir de fórmulas padrão, conferidos com um script, sem nenhum teste por trás. As fontes foram conferidas em 1º de novembro de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Utilização ρ&lt;/th&gt;
&lt;th&gt;Tempo no sistema W ÷ tempo de atendimento S&lt;/th&gt;
&lt;th&gt;Se S = 20 ms&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;0,5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;40 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,7&lt;/td&gt;
&lt;td&gt;3,3&lt;/td&gt;
&lt;td&gt;67 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,8&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;100 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,9&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;200 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,95&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;400 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,99&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;2.000 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;São médias para a fila M/M/1: um servidor, chegadas de Poisson e tempos de atendimento exponenciais.&lt;/p&gt;
&lt;h2&gt;O que é teoria das filas?&lt;/h2&gt;
&lt;p&gt;É o ramo da probabilidade que modela trabalho que chega, espera e é atendido. Uma fila é descrita pelas chegadas, pelos tempos de atendimento, pelo número de servidores e pela disciplina de fila, ou seja, a ordem em que as tarefas em espera são atendidas.&lt;/p&gt;
&lt;p&gt;O livro &lt;a href=&quot;https://web.mit.edu/urban_or_book/www/book/chapter4/4.2.html&quot;&gt;Urban Operations Research&lt;/a&gt;, de Larson e Odoni, um texto aberto do MIT, cita caixas de banco, caixas de supermercado e praças de pedágio como casos clássicos. Um servidor web cabe no mesmo esquema: as requisições chegam, threads ou núcleos as atendem e o resto espera numa fila.&lt;/p&gt;
&lt;h2&gt;De onde vem a teoria das filas?&lt;/h2&gt;
&lt;p&gt;Da central telefônica, onde A. K. Erlang chegou aos primeiros resultados para a Companhia Telefônica de Copenhague.&lt;/p&gt;
&lt;p&gt;Segundo a &lt;a href=&quot;https://mathshistory.st-andrews.ac.uk/Biographies/Erlang/&quot;&gt;biografia no MacTutor&lt;/a&gt;, o artigo de Erlang de 1909 mostrou que chamadas feitas ao acaso seguem a distribuição de Poisson, e sua fórmula de 1917 para perdas e tempo de espera logo passou a ser usada por companhias telefônicas de muitos países. O artigo de David Kendall de 1953, &lt;a href=&quot;https://doi.org/10.1214/aoms/1177728975&quot;&gt;Stochastic Processes Occurring in the Theory of Queues and their Analysis by the Method of the Imbedded Markov Chain&lt;/a&gt;, introduziu a notação usada até hoje, como registra o &lt;a href=&quot;https://arxiv.org/abs/0810.1091&quot;&gt;relato da obra dele&lt;/a&gt; escrito por Geoffrey Grimmett. A &lt;a href=&quot;https://doi.org/10.1287/opre.9.3.383&quot;&gt;prova de L = λW&lt;/a&gt; de Little e os resultados de Kingman sobre tráfego intenso vieram em 1961.&lt;/p&gt;
&lt;h2&gt;O que significa a notação de Kendall, como M/M/1?&lt;/h2&gt;
&lt;p&gt;Ela nomeia uma fila em três partes, A/S/c: a distribuição dos intervalos entre chegadas, a dos tempos de atendimento e o número de servidores. M/M/1 significa chegadas aleatórias, tempos de atendimento exponenciais e um servidor.&lt;/p&gt;
&lt;p&gt;M vem de memoryless, sem memória (chegadas de Poisson ou tempos exponenciais), D de determinístico e G de general, ou seja, qualquer distribuição: M/D/1 é um servidor com tempo de atendimento constante.&lt;/p&gt;
&lt;h2&gt;Como o tempo de resposta cresce com a utilização?&lt;/h2&gt;
&lt;p&gt;Numa fila M/M/1, o tempo médio no sistema é W = 1/(μ − λ), que é igual a S/(1 − ρ). Quando a utilização ρ se aproxima de 1, W cresce sem limite.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;lambda = arrival rate        mu = service rate (1 / S)
rho    = lambda / mu         (utilization, must stay below 1)
W      = 1 / (mu - lambda)   = S / (1 - rho)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Larson e Odoni deduzem isso para uma &lt;a href=&quot;https://web.mit.edu/urban_or_book/www/book/chapter4/4.6.1.html&quot;&gt;central de atendimento com uma só telefonista&lt;/a&gt; e mostram que não há estado estacionário com ρ ≥ 1: a fila não para de crescer. A mesma fonte mostra que o tempo no sistema segue uma distribuição exponencial, então cada percentil cresce pelo mesmo fator 1/(1 − ρ), e o p95 fica em torno de três vezes a média: 600 ms na linha 0,9 acima.&lt;/p&gt;
&lt;h2&gt;Por que a latência faz um joelho antes de a CPU chegar a 100%?&lt;/h2&gt;
&lt;p&gt;Porque uma requisição espera sempre que encontra o servidor ocupado, e isso acontece com mais frequência à medida que a utilização sobe. Com as premissas do M/M/1, o tempo de resposta já dobrou a 50% de utilização.&lt;/p&gt;
&lt;p&gt;O recurso que satura também pode ser um pool de conexões, um lock do banco de dados ou um event loop de uma só thread, e o mais carregado define a curva. Esse joelho precoce explica por que a utilização alvo fica bem abaixo de 100%. Faça a conta de trás para frente a partir do seu orçamento de latência: com S = 20 ms e uma média alvo de 100 ms, a tabela permite cerca de 80%, e um alvo de 60 ms cerca de 67%, antes que os picos levem a parte deles.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://loadfocus.com/docs/guides/load-testing/reading-the-capacity-panel?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=queueing-theory&quot;&gt;painel Capacity&lt;/a&gt; da LoadFocus (página em inglês) agrupa um teste concluído pelo número de usuários virtuais ativos e informa o último nível que aguentou antes de a taxa de erros passar de 1% ou de o p95 passar do dobro do melhor nível, desde que nenhum nível mais alto tenha se recuperado. Ele precisa de um teste com um único gerador de carga que suba por pelo menos três degraus de carga, com o mais alto pelo menos o dobro do mais baixo. Pela conta acima, se o nível mais leve deixou o gargalo quase ocioso, a duplicação dispara logo acima de 50% de utilização; se o nível mais leve já o carregava a ρ0, ela dispara mais tarde, acima de (1 + ρ0)/2 no M/M/1.&lt;/p&gt;
&lt;h2&gt;Por que a variabilidade importa tanto quanto a utilização?&lt;/h2&gt;
&lt;p&gt;Filas nascem do acaso: chegadas em rajadas e tarefas lentas de vez em quando. Com tráfego intenso, o tempo de espera cresce com a variabilidade de ambas, multiplicada por um termo ρ/(1 − ρ).&lt;/p&gt;
&lt;p&gt;O artigo de Kingman de 1961, &lt;a href=&quot;https://doi.org/10.1017/S0305004100036094&quot;&gt;The single server queue in heavy traffic&lt;/a&gt;, mostra que, quando a intensidade de tráfego de um servidor único se aproxima de 1, a fila fica longa e o tempo de espera é aproximadamente exponencial. Notas de aula da &lt;a href=&quot;https://www.win.tue.nl/~iadan/2V050/h10.pdf&quot;&gt;TU Eindhoven&lt;/a&gt; e do &lt;a href=&quot;https://serveng.technion.ac.il/files/Lectures/Lecture_GGQ&apos;s_FULL_Marked.pdf&quot;&gt;Technion&lt;/a&gt; dão uma aproximação para a média (o Technion a chama de aproximação de Allen-Cunneen; ela também é amplamente conhecida como fórmula de Kingman):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Wq ≈ rho / (1 - rho) × (ca² + cs²) / 2 × S
ca, cs = coefficient of variation (std dev / mean)
         of arrival gaps and of service times
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wq é a espera antes de o atendimento começar, e ca, cs são os coeficientes de variação. Tempos exponenciais têm c² = 1, o que devolve a espera do M/M/1 de 9S a 90% de utilização. Um tempo de atendimento constante corta a espera pela metade, para 4,5S; com cs² = 4, o que uma mistura de acertos de cache e chamadas lentas ao banco de dados pode produzir, ela sobe para 22,5S. Tráfego sintético regular varia menos que o de produção, então um teste costuma mostrar menos fila do que os picos reais.&lt;/p&gt;
&lt;h2&gt;Como mais servidores (M/M/c) ajudam?&lt;/h2&gt;
&lt;p&gt;Vários servidores que compartilham uma fila absorvem rajadas aleatórias muito melhor que os mesmos servidores com uma fila cada, então cada servidor pode trabalhar mais ocupado com a mesma espera.&lt;/p&gt;
&lt;p&gt;Pelas &lt;a href=&quot;https://web.mit.edu/urban_or_book/www/book/chapter4/4.6.2.html&quot;&gt;fórmulas M/M/m&lt;/a&gt; de Larson e Odoni, com cada servidor 90% ocupado, W é 10S com um servidor, 5,3S com dois compartilhando a fila e 3,0S com quatro. Quatro instâncias atrás de um balanceador que escolhe uma livre se comportam como o último caso; quatro que recebem cada uma um quarto aleatório do tráfego, como filas M/M/1 separadas a 10S.&lt;/p&gt;
&lt;h2&gt;Onde entra a lei de Little?&lt;/h2&gt;
&lt;p&gt;A lei de Little, L = λW, liga o número médio de requisições num sistema à taxa de chegada e ao tempo que elas passam lá dentro, quaisquer que sejam as distribuições. A teoria das filas dá W, e a lei de Little o transforma em L.&lt;/p&gt;
&lt;p&gt;Na linha 0,9, 45 requisições por segundo com W = 200 ms significam em média 9 requisições dentro do sistema. Nosso &lt;a href=&quot;https://loadtest.app/pt-br/littles-law-load-testing/&quot;&gt;artigo sobre a lei de Little&lt;/a&gt; usa a mesma lei para dimensionar e conferir testes de carga.&lt;/p&gt;
&lt;h2&gt;Onde esses modelos deixam de valer em teste de carga?&lt;/h2&gt;
&lt;p&gt;Eles supõem um fluxo aberto de chegadas independentes e um estado estacionário. Um teste com número fixo de usuários virtuais é um sistema fechado, em que as chegadas desaceleram quando as respostas desaceleram.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Testes fechados. Com N usuários virtuais há no máximo N requisições no sistema, então a taxa de requisições cai onde uma fila aberta cresceria, e o &lt;a href=&quot;https://loadtest.app/pt-br/think-time-in-load-testing/&quot;&gt;tempo de pensamento&lt;/a&gt; a reduz ainda mais. Nosso artigo sobre o &lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;modelo de carga aberto vs fechado&lt;/a&gt; explica por que isso esconde a saturação.&lt;/li&gt;
&lt;li&gt;A LoadFocus roda &lt;a href=&quot;https://loadfocus.com/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=queueing-theory&quot;&gt;scripts k6&lt;/a&gt;, mas os cenários arrival-rate rodam lá com um número fixo de usuários, como avisa o validador de scripts dela. Leia esses testes como fechados: depois do joelho, espere uma taxa de requisições estável e tempos de resposta subindo.&lt;/li&gt;
&lt;li&gt;Estado estacionário. Aquecimento, caches e autoscaling mudam a taxa de atendimento durante o teste, então compare níveis mantidos por tempo suficiente para se estabilizar.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Escreve-se queueing theory ou queuing theory?&lt;/strong&gt;
As duas grafias em inglês estão corretas e nomeiam o mesmo campo. O artigo de Kingman de 1961 escreve &amp;quot;queueing time&amp;quot;, enquanto a prova de Little do mesmo ano traz &amp;quot;Queuing Formula&amp;quot; no título.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A teoria das filas exige chegadas de Poisson?&lt;/strong&gt;
Só para os resultados exatos do M/M/1. Aproximações G/G/1 como a fórmula de Kingman usam a média e a variabilidade dos intervalos entre chegadas e dos tempos de atendimento, e a lei de Little não supõe nada sobre as distribuições.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/littles-law-load-testing/&quot;&gt;Lei de Little em teste de carga: dimensionar e conferir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;Modelo de carga aberto vs fechado: qual usar e quando&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/throughput-vs-latency/&quot;&gt;Vazão vs latência: como se relacionam sob carga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/tail-latency/&quot;&gt;Latência de cauda: o que é e como medir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/think-time-in-load-testing/&quot;&gt;Tempo de pensamento em teste de carga: como definir&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>SLO vs SLA: a diferença, os SLIs e o orçamento de erros</title><link>https://loadtest.app/pt-br/slo-vs-sla/</link><guid isPermaLink="true">https://loadtest.app/pt-br/slo-vs-sla/</guid><description>SLO vs SLA explicado: quem define o quê, o que é um SLI, o orçamento de erros, quanta indisponibilidade 99,9% permite e como checar um SLO sob carga.</description><pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;Um SLA (acordo de nível de serviço) é um contrato com um cliente que diz o que acontece quando um serviço não atinge um nível prometido, em geral um crédito de serviço. Um SLO (objetivo de nível de serviço) é a meta interna com que uma equipe opera o serviço; o livro de SRE recomenda defini-la mais rígida que o SLA, para que os problemas sejam resolvidos antes de o contrato ser violado. Um SLI (indicador de nível de serviço) é a medida em que os dois são escritos, como a parcela de requisições bem-sucedidas.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;SLI&lt;/th&gt;
&lt;th&gt;SLO&lt;/th&gt;
&lt;th&gt;SLA&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;O que é&lt;/td&gt;
&lt;td&gt;Uma medida&lt;/td&gt;
&lt;td&gt;Uma meta para um SLI&lt;/td&gt;
&lt;td&gt;Um contrato baseado em SLOs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quem define&lt;/td&gt;
&lt;td&gt;Engenharia&lt;/td&gt;
&lt;td&gt;Product owner e engenharia&lt;/td&gt;
&lt;td&gt;Times de negócio e jurídico&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Se não for cumprido&lt;/td&gt;
&lt;td&gt;Nada por si só&lt;/td&gt;
&lt;td&gt;Orçamento de erros gasto&lt;/td&gt;
&lt;td&gt;Créditos de serviço ou multas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exemplo&lt;/td&gt;
&lt;td&gt;Chamadas de checkout com sucesso&lt;/td&gt;
&lt;td&gt;99,95% em quatro semanas&lt;/td&gt;
&lt;td&gt;99,9% ao mês, ou um crédito&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Os exemplos são ilustrativos; as fontes são o livro e o workbook de SRE do Google e o SLA de computação da AWS, conferidos em 1º de novembro de 2026.&lt;/p&gt;
&lt;h2&gt;O que significam SLI, SLO e SLA?&lt;/h2&gt;
&lt;p&gt;Service level indicator, service level objective e service level agreement: indicador, objetivo e acordo de nível de serviço. O indicador é o que você mede, o objetivo é o valor que você busca e o acordo é o que você promete a outra pessoa, com consequências.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://sre.google/sre-book/service-level-objectives/&quot;&gt;capítulo &amp;quot;Service Level Objectives&amp;quot; do livro de SRE&lt;/a&gt; define um SLA como &amp;quot;um contrato explícito ou implícito com seus usuários que inclui consequências por cumprir (ou não cumprir) os SLOs que ele contém&amp;quot;. O teste do capítulo é uma única pergunta: o que acontece se os SLOs não forem cumpridos? Se não há consequência explícita, você quase certamente está diante de um SLO.&lt;/p&gt;
&lt;p&gt;O capítulo acrescenta que a maioria das pessoas quer dizer SLO quando diz SLA, e que uma violação real de SLA pode acabar num processo por quebra de contrato. Então, quando uma reunião virar uma discussão de SLA vs SLO, pergunte primeiro se há uma consequência, em geral dinheiro, prevista em contrato.&lt;/p&gt;
&lt;p&gt;O livro de SRE aconselha manter uma margem de segurança: &amp;quot;um SLO interno mais rígido que o SLO anunciado aos usuários dá espaço para responder a problemas crônicos antes que fiquem visíveis externamente&amp;quot;. O capítulo &amp;quot;Embracing Risk&amp;quot; aplica a mesma ideia a um contrato: uma meta externa de 99,9% apoiada por uma interna mais exigente.&lt;/p&gt;
&lt;h2&gt;O que é um orçamento de erros?&lt;/h2&gt;
&lt;p&gt;É 100% menos o SLO: a parcela das requisições ou do tempo que pode falhar dentro da janela. Enquanto sobra orçamento, a equipe continua entregando; quando ele acaba, o trabalho de confiabilidade vem primeiro.&lt;/p&gt;
&lt;p&gt;O capítulo &lt;a href=&quot;https://sre.google/workbook/implementing-slos/&quot;&gt;&amp;quot;Implementing SLOs&amp;quot; do workbook de SRE&lt;/a&gt; faz a conta: com um SLO de 99,9%, um serviço que recebe 3 milhões de requisições em quatro semanas pode falhar 3.000 delas, então uma queda com 1.500 erros gasta metade do orçamento. O capítulo &lt;a href=&quot;https://sre.google/sre-book/embracing-risk/&quot;&gt;&amp;quot;Embracing Risk&amp;quot;&lt;/a&gt; do livro explica o propósito: a gestão de produto define o SLO, o monitoramento mede a disponibilidade real e a diferença é a margem de falta de confiabilidade que resta para o trimestre. Quando esse orçamento acaba, os deploys param ou desaceleram.&lt;/p&gt;
&lt;h2&gt;Quanto tempo de indisponibilidade 99,9% permite?&lt;/h2&gt;
&lt;p&gt;Cerca de 43 minutos numa janela de 30 dias. Cada nove a mais divide a margem por dez, então 99,99% deixa pouco mais de 4 minutos.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SLO&lt;/th&gt;
&lt;th&gt;Orçamento de erros&lt;/th&gt;
&lt;th&gt;Indisponibilidade em 30 dias&lt;/th&gt;
&lt;th&gt;Falhas por milhão&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;99%&lt;/td&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;td&gt;7 h 12 min&lt;/td&gt;
&lt;td&gt;10.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99,5%&lt;/td&gt;
&lt;td&gt;0,5%&lt;/td&gt;
&lt;td&gt;3 h 36 min&lt;/td&gt;
&lt;td&gt;5.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99,9%&lt;/td&gt;
&lt;td&gt;0,1%&lt;/td&gt;
&lt;td&gt;43 min 12 s&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99,95%&lt;/td&gt;
&lt;td&gt;0,05%&lt;/td&gt;
&lt;td&gt;21 min 36 s&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99,99%&lt;/td&gt;
&lt;td&gt;0,01%&lt;/td&gt;
&lt;td&gt;4 min 19 s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Multiplique os 43.200 minutos de uma janela de 30 dias pelo orçamento de erros. Lembre do aviso do workbook: cada nove adicional custa mais, enquanto o valor dele para os usuários tende a zero.&lt;/p&gt;
&lt;h2&gt;Como é um SLA de verdade?&lt;/h2&gt;
&lt;p&gt;Ele traz uma porcentagem medida, um período de cobrança, uma tabela de créditos e o que não conta. O SLA de computação da AWS é um exemplo público e curto.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://aws.amazon.com/compute/sla/&quot;&gt;Amazon Compute Service Level Agreement&lt;/a&gt; (atualizado em 25 de maio de 2022; conferido em 1º de novembro de 2026) se compromete com uma Monthly Uptime Percentage de pelo menos 99,99% por região para instâncias EC2 distribuídas em duas ou mais Availability Zones, e 99,5% para uma instância isolada. A disponibilidade é 100% menos a parcela dos minutos em que o EC2 ficou indisponível. Pelo Region-Level SLA, abaixo de 99,99% o crédito é de 10% da fatura mensal de EC2 na região, abaixo de 99,0% é de 30% e abaixo de 95,0% é de 100%; para uma instância isolada, a faixa de 10% começa abaixo de 99,5%. Os créditos são aplicados a pagamentos futuros, precisam ser solicitados pelo suporte da AWS e são o remédio &amp;quot;único e exclusivo&amp;quot;, salvo disposição em contrário no contrato do cliente.&lt;/p&gt;
&lt;p&gt;Comparada com a tabela acima, a faixa de 10% do Region-Level SLA vai de cerca de 4 minutos a 7 horas de indisponibilidade num mês de 30 dias. Um SLA limita o que o fornecedor deve; evitar que as quedas prejudiquem seus usuários é tarefa dos seus próprios objetivos.&lt;/p&gt;
&lt;h2&gt;Como escolher SLIs de latência e disponibilidade?&lt;/h2&gt;
&lt;p&gt;Meça a latência como percentil e a disponibilidade como eventos bons divididos por todos os eventos, o mais perto possível do usuário. Médias e números só do servidor escondem as requisições de que as pessoas reclamam.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Latência.&lt;/strong&gt; O livro de SRE prefere percentis à média, porque uma média pode ficar estável enquanto as requisições mais lentas ficam bem mais lentas. O workbook escreve SLIs de latência como uma razão, por exemplo as chamadas concluídas em menos de 100 ms divididas por todas as chamadas. Então &amp;quot;99% das chamadas de checkout em menos de 400 ms&amp;quot; é o mesmo que &amp;quot;p99 do checkout abaixo de 400 ms&amp;quot; na janela, o que vai direto para um teste. Nosso artigo sobre &lt;a href=&quot;https://loadtest.app/pt-br/tail-latency/&quot;&gt;latência de cauda&lt;/a&gt; explica por que o p99 importa assim que uma página chama vários serviços.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disponibilidade.&lt;/strong&gt; A disponibilidade por tempo conta os minutos no ar, como faz o SLA da AWS. A disponibilidade por requisições conta as requisições bem-sucedidas: &amp;quot;Embracing Risk&amp;quot; descreve um serviço com 2,5 milhões de requisições por dia e uma meta diária de 99,99%, que pode devolver 250 erros e ainda cumprir a meta.&lt;/p&gt;
&lt;h2&gt;Onde os SLOs dão errado?&lt;/h2&gt;
&lt;p&gt;Quase sempre por excesso de objetivos, metas de 100% e indicadores medidos onde os usuários não estão. Cada um deixa um número que ninguém usa para agir, ou um que parece bom enquanto os usuários sofrem.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SLOs demais.&lt;/strong&gt; O livro de SRE aconselha ter o mínimo possível: se citar um SLO nunca ajuda a ganhar uma discussão sobre prioridades, provavelmente ele não vale a pena.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metas de 100%.&lt;/strong&gt; O workbook diz que 100% é a meta errada: componentes falham, mudanças são a principal fonte de quedas e um SLO de 100% só deixa tempo para reagir.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Medir só no servidor.&lt;/strong&gt; Métricas do servidor deixam passar problemas que os usuários sentem, como um script lento na página. O workbook sugere medir no balanceador de carga ou no cliente.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;O que o teste de carga tem a ver com SLOs?&lt;/h2&gt;
&lt;p&gt;Um SLO dá ao teste de carga seus critérios de aprovação, e um teste no pico esperado mostra se o SLO de latência se sustenta antes de esse tráfego chegar. O monitoramento em produção só conta depois.&lt;/p&gt;
&lt;p&gt;O livro de SRE observa que mais requisições por segundo (QPS) costumam trazer latências maiores e que é comum os serviços terem um penhasco de desempenho a partir de certo limiar de carga. Um teste de carga pode encontrar esse penhasco se rodar no pico esperado, com um mix realista de requisições, e medir o mesmo SLI que o SLO usa. Defina cada limite de aprovação do teste um pouco mais rígido que o SLO, como descreve nosso guia de &lt;a href=&quot;https://loadtest.app/pt-br/load-test-pass-fail-criteria/&quot;&gt;critérios de aprovação de um teste de carga&lt;/a&gt;. Uma execução dura minutos, então não consegue medir a disponibilidade mensal.&lt;/p&gt;
&lt;p&gt;A LoadFocus, que publica este site, avalia testes de carga com &lt;a href=&quot;https://loadfocus.com/docs/guides/load-testing/pass-fail-thresholds?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=slo-vs-sla&quot;&gt;limites de aprovação&lt;/a&gt; salvos no teste: Max P95 e Max P99 do tempo de resposta, uma taxa de erros máxima e uma vazão mínima, para testes cloud, JMeter e k6. O monitoramento de APIs dela tem &lt;a href=&quot;https://loadfocus.com/docs/guides/api-monitoring/sla-slo-reports?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=slo-vs-sla&quot;&gt;relatórios de SLA e SLO&lt;/a&gt; que definem uma meta de SLO por monitor e mostram a disponibilidade, o orçamento de erros consumido e um status OK ou Breached.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;O que significa SLO?&lt;/strong&gt;
Service level objective, ou objetivo de nível de serviço: um valor-alvo para um nível de serviço medido, como 99,9% das requisições bem-sucedidas em quatro semanas. Ele é definido internamente, por produto e engenharia, e, sozinho, não traz nenhuma multa contratual.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dá para ter um SLO sem um SLA?&lt;/strong&gt;
Sim. O livro de SRE cita a busca do Google como um serviço importante sem SLA público que, mesmo assim, é gerido com SLIs e SLOs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Um SLO deveria ser de 100% em algum caso?&lt;/strong&gt;
Não. Um objetivo de 100% não deixa orçamento de erros, então qualquer falha o viola e nenhuma mudança fica segura para entregar.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/load-test-pass-fail-criteria/&quot;&gt;Critérios de aprovação de um teste de carga: como definir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/tail-latency/&quot;&gt;Latência de cauda: o que é e como medir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/apdex-score/&quot;&gt;Pontuação Apdex: o que é e como calcular&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/throughput-vs-latency/&quot;&gt;Vazão vs latência: como se relacionam sob carga&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>TPC-H: o que o benchmark mede e como executá-lo</title><link>https://loadtest.app/pt-br/tpc-h/</link><guid isPermaLink="true">https://loadtest.app/pt-br/tpc-h/</guid><description>TPC-H explicado: 8 tabelas, 22 consultas, fator de escala, QphH, testes de potência e de vazão, execuções auditadas ou informais e quando usar TPC-DS.</description><pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;O TPC-H é o benchmark de suporte à decisão do Transaction Processing Performance Council (TPC): 22 consultas de negócio e duas funções de atualização rodam sobre oito tabelas que o programa dbgen do TPC preenche com um fator de escala escolhido, em que o fator 1 equivale a cerca de 1 GB. A métrica dele, QphH@Size, combina um teste de potência com um único fluxo e um teste de vazão com vários fluxos, e os resultados oficiais acrescentam um preço por kQphH@Size. Só resultados auditados e publicados no tpc.org são oficiais; qualquer número no estilo TPC-H publicado fora do tpc.org conta como carga derivada pelas regras de uso justo do TPC e não pode ser comparado com resultados oficiais.&lt;/p&gt;
&lt;p&gt;Não executamos o benchmark para este guia. Os fatos vêm do tpc.org, da especificação na revisão 3.0.1, que o tpc.org indica como atual, e da documentação de cada ferramenta, tudo conferido em 1º de novembro de 2026. As avaliações são nossas.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;TPC-H&lt;/th&gt;
&lt;th&gt;TPC-C&lt;/th&gt;
&lt;th&gt;TPC-DS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Carga&lt;/td&gt;
&lt;td&gt;Suporte à decisão: consultas ad hoc mais atualizações de dados&lt;/td&gt;
&lt;td&gt;OLTP: os pedidos de um atacadista&lt;/td&gt;
&lt;td&gt;Suporte à decisão: consultas mais manutenção de dados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escopo&lt;/td&gt;
&lt;td&gt;8 tabelas, 22 consultas, 2 funções de atualização&lt;/td&gt;
&lt;td&gt;9 tipos de tabela, 5 tipos de transação&lt;/td&gt;
&lt;td&gt;Esquema floco de neve, 7 tabelas fato, 99 consultas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Métrica principal&lt;/td&gt;
&lt;td&gt;QphH@Size e $/kQphH@Size&lt;/td&gt;
&lt;td&gt;tpmC&lt;/td&gt;
&lt;td&gt;QphDS@SF e $/kQphDS@SF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versão atual&lt;/td&gt;
&lt;td&gt;3.0.1&lt;/td&gt;
&lt;td&gt;5.11.0&lt;/td&gt;
&lt;td&gt;4.0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;O que o TPC-H mede?&lt;/h2&gt;
&lt;p&gt;A rapidez com que um sistema responde a consultas analíticas complexas sobre um grande volume de dados enquanto vendas novas chegam e antigas são apagadas. Uma única especificação define o esquema, as consultas, os dados e as regras.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://www.tpc.org/tpch/&quot;&gt;página do TPC-H&lt;/a&gt; descreve um conjunto de consultas ad hoc orientadas a negócio com modificações de dados simultâneas (conferido em 1º de novembro de 2026). A &lt;a href=&quot;https://www.tpc.org/TPC_Documents_Current_Versions/pdf/TPC-H_v3.0.1.pdf&quot;&gt;especificação&lt;/a&gt; define oito tabelas: PART, PARTSUPP, LINEITEM, ORDERS, CUSTOMER, SUPPLIER, NATION e REGION. Todas, menos as duas últimas, crescem com o fator de escala; a LINEITEM, a maior, tem cerca de 6.000.000 de linhas por unidade. A função de atualização RF1 insere linhas novas em ORDERS e LINEITEM, e a RF2 remove vendas antigas (conferido em 1º de novembro de 2026).&lt;/p&gt;
&lt;h2&gt;Como a pontuação do TPC-H é calculada?&lt;/h2&gt;
&lt;p&gt;Uma execução é um teste de potência seguido de um teste de vazão, e o QphH@Size é a média geométrica dos dois resultados. A métrica de preço é o preço total do sistema dividido pelo QphH@Size, vezes 1.000.&lt;/p&gt;
&lt;p&gt;No teste de potência, um fluxo de atualização roda a RF1, uma única sessão de consultas roda as 22 consultas uma vez, depois o fluxo de atualização roda a RF2. O Power@Size é 3.600 vezes o fator de escala, dividido pela média geométrica desses 24 tempos. No teste de vazão, vários fluxos de consultas rodam ao lado de um fluxo de atualização: no mínimo 2 com fator 1, chegando a 11 com fator 100.000. O Throughput@Size é o número de consultas por hora somando todos os fluxos, vezes o fator de escala. Um teste completo tem duas execuções, e o patrocinador informa a que tem o QphH mais baixo (tudo segundo a &lt;a href=&quot;https://www.tpc.org/TPC_Documents_Current_Versions/pdf/TPC-H_v3.0.1.pdf&quot;&gt;especificação&lt;/a&gt;, conferido em 1º de novembro de 2026).&lt;/p&gt;
&lt;p&gt;A média geométrica dá o mesmo peso a cada consulta, então reduzir pela metade o tempo de uma única consulta aumenta o Power em só cerca de 3%. Um resultado oficial usa um fator de escala de uma lista fixa: 1, 10, 30, 100 e assim por diante até 100.000.&lt;/p&gt;
&lt;h2&gt;Quem publica resultados do TPC-H, e quais contam?&lt;/h2&gt;
&lt;p&gt;Os fornecedores que patrocinam um teste publicam resultados auditados no tpc.org, e só esses são oficiais. Qualquer outra execução é uma carga derivada, com regras próprias.&lt;/p&gt;
&lt;p&gt;A especificação exige uma auditoria independente feita por um auditor certificado pelo TPC. A &lt;a href=&quot;https://www.tpc.org/TPC_Documents_Current_Versions/pdf/Fair_Use_Quick_Reference_v1.0.0.pdf&quot;&gt;referência rápida de uso justo (fair use)&lt;/a&gt; do TPC só permite o nome do TPC ao lado de resultados oficiais publicados. Todo o resto precisa do prefixo &amp;quot;Derived from&amp;quot;, não pode usar a métrica do TPC, deve trazer um aviso de que não é comparável aos resultados publicados, deveria descrever o ambiente e os desvios e não pode ser comparado com resultados oficiais (conferido em 1º de novembro de 2026).&lt;/p&gt;
&lt;h2&gt;Como você roda o TPC-H por conta própria?&lt;/h2&gt;
&lt;p&gt;Gere os dados e o texto das consultas, carregue as tabelas e depois rode o teste de potência seguido do teste de vazão. Você pode usar as ferramentas do TPC, um kit feito para um banco específico ou um motor com gerador embutido.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://www.tpc.org/tpc_documents_current_versions/current_specifications5.asp&quot;&gt;página de especificações atuais&lt;/a&gt; do TPC oferece um pacote de ferramentas gratuito: você se cadastra, aceita uma licença e recebe o link por e-mail. Segundo a especificação, o DBGen deve produzir os dados e o QGen o texto das consultas (conferido em 1º de novembro de 2026).&lt;/p&gt;
&lt;p&gt;Para PostgreSQL, a &lt;a href=&quot;https://wiki.postgresql.org/wiki/TPC-H&quot;&gt;página TPC-H da wiki&lt;/a&gt; não traz um procedimento passo a passo e aponta para o &lt;a href=&quot;https://wiki.postgresql.org/wiki/DBT-3&quot;&gt;DBT-3&lt;/a&gt;, um kit completo que a página do DBT-3 na wiki chama de implementação da especificação compatível com o uso justo. O &lt;strong&gt;HammerDB&lt;/strong&gt; traz o TPROC-H, que a &lt;a href=&quot;https://www.hammerdb.com/docs/ch11s01.html&quot;&gt;documentação&lt;/a&gt; dele descreve como uma carga de código aberto derivada do TPC-H e não comparável aos resultados publicados. Ele roda no PostgreSQL, MySQL, Oracle e outros motores, e a documentação recomenda comparar a &lt;a href=&quot;https://www.hammerdb.com/docs/ch11s02.html&quot;&gt;média geométrica dos tempos de consulta&lt;/a&gt; em vez de calcular um QphH (tudo conferido em 1º de novembro de 2026).&lt;/p&gt;
&lt;p&gt;O &lt;strong&gt;DuckDB&lt;/strong&gt; tem uma extensão &lt;code&gt;tpch&lt;/code&gt; que, segundo a &lt;a href=&quot;https://duckdb.org/docs/stable/core_extensions/tpch&quot;&gt;documentação&lt;/a&gt;, implementa o gerador de dados e as consultas. Estas linhas geram o fator 1, rodam a consulta 4 e listam as 22 consultas:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CALL dbgen(sf = 1);
PRAGMA tpch(4);
FROM tpch_queries();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A mesma página avisa que os dados diferem um pouco da especificação, que cada consulta roda com parâmetros fixos e que o &lt;code&gt;dbgen&lt;/code&gt; não apaga as tabelas existentes. Para dados totalmente conformes, ela aponta para o &lt;code&gt;tpchgen-cli&lt;/code&gt; (conferido em 1º de novembro de 2026).&lt;/p&gt;
&lt;h2&gt;Como ler resultados do TPC-H com honestidade?&lt;/h2&gt;
&lt;p&gt;Compare resultados só com o mesmo fator de escala e a mesma versão do benchmark, e leia cada métrica com o sufixo de tamanho. Um gráfico de tempos de consultas isoladas não mostra nem o teste de potência nem o teste de vazão.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://www.tpc.org/tpch/results/tpch_results5.asp&quot;&gt;página de resultados&lt;/a&gt; agrupa os resultados por tamanho do banco e traz três notas: resultados das versões 2 e 3 não são comparáveis, preço/desempenho em moedas diferentes não deve ser comparado, e comparações entre tamanhos de banco são enganosas (conferido em 1º de novembro de 2026). A especificação acrescenta que resultados com números de fluxos diferentes são comparáveis com o mesmo tamanho de banco.&lt;/p&gt;
&lt;p&gt;Numa execução informal, procure o que as regras de uso justo pedem: hardware e memória, mudanças no esquema ou no texto das consultas e se as funções de atualização rodaram. Um post que mede as 22 consultas uma vez, com cache quente e sem fluxo de atualização, só se aproxima da parte de consultas de um teste de potência, embora uma execução assim ainda ajude a acompanhar as suas próprias regressões. Sobre taxa de consultas e tempo de resposta, veja &lt;a href=&quot;https://loadtest.app/pt-br/throughput-vs-latency/&quot;&gt;vazão vs latência&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Quando usar outra coisa em vez do TPC-H?&lt;/h2&gt;
&lt;p&gt;Quando a carga é transacional, quando você quer um benchmark analítico mais novo ou quando a pergunta é o que os usuários sentem. O benchmark modela uma carga analítica, sem transações curtas nem camada de aplicação.&lt;/p&gt;
&lt;p&gt;Escolha o &lt;strong&gt;TPC-DS&lt;/strong&gt; para um teste de suporte à decisão mais amplo: a &lt;a href=&quot;https://www.tpc.org/TPC_Documents_Current_Versions/pdf/TPC-DS_v4.0.0.pdf&quot;&gt;especificação na versão 4.0.0&lt;/a&gt; usa um esquema floco de neve com sete tabelas fato e 99 consultas, e a &lt;a href=&quot;https://www.tpc.org/tpcds/&quot;&gt;página de apresentação&lt;/a&gt; diz que os resultados da versão 4 não são comparáveis com versões anteriores. Escolha o &lt;strong&gt;TPC-C&lt;/strong&gt;, ou o TPROC-C do HammerDB, para OLTP de entrada de pedidos: a &lt;a href=&quot;https://www.tpc.org/tpcc/&quot;&gt;página do TPC-C&lt;/a&gt; descreve cinco tipos de transação medidos em tpmC (tudo conferido em 1º de novembro de 2026). Para uma checagem rápida de um único banco, o &lt;a href=&quot;https://loadtest.app/pt-br/pgbench/&quot;&gt;pgbench&lt;/a&gt; cobre o PostgreSQL e o &lt;a href=&quot;https://loadtest.app/pt-br/sysbench/&quot;&gt;sysbench&lt;/a&gt; cobre o MySQL.&lt;/p&gt;
&lt;p&gt;A LoadFocus, que publica este site, não roda o TPC-H; os testes dela são voltados a endpoints web e de API. A LoadFocus &lt;a href=&quot;https://loadfocus.com/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tpc-h&quot;&gt;roda planos de teste JMeter e scripts k6&lt;/a&gt; a partir de 25 regiões de nuvem, sem driver JDBC e sem módulo SQL, então não consegue se conectar ao banco de dados. Para esse trabalho, escolha uma ferramenta de benchmark de banco de dados como a extensão do DuckDB, o DBT-3 ou o HammerDB em vez da LoadFocus, e use a LoadFocus para a camada web ou de API que fica na frente do banco, começando pelo &lt;a href=&quot;https://loadfocus.com/templates/load-testing-for-database-query-performance?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tpc-h&quot;&gt;template para os endpoints por trás das consultas pesadas&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Qual é a diferença entre TPC-H e TPC-DS?&lt;/strong&gt;
Os dois são benchmarks de suporte à decisão do TPC. O TPC-H usa 8 tabelas e 22 consultas e informa o QphH@Size, enquanto o TPC-DS usa um esquema floco de neve com sete tabelas fato e 99 consultas e informa o QphDS@SF.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O que significa QphH@Size no TPC-H?&lt;/strong&gt;
É a métrica composta de consultas por hora: a média geométrica dos resultados do teste de potência e do teste de vazão em um tamanho de banco. O sufixo indica esse tamanho, por exemplo QphH@1000GB, e resultados em tamanhos diferentes não devem ser comparados.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A LoadFocus consegue rodar o TPC-H?&lt;/strong&gt;
Não. A LoadFocus roda planos de teste JMeter e scripts k6 voltados a endpoints web e de API e não tem conexão SQL, então use uma ferramenta de benchmark de banco de dados para o TPC-H e a LoadFocus para a camada de aplicação na frente do banco.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/pgbench/&quot;&gt;pgbench: benchmark e teste de carga do PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/sysbench/&quot;&gt;Como usar o sysbench: benchmarks de CPU, disco e MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/ycsb/&quot;&gt;YCSB: cargas de trabalho A-F, execução e limites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/redis-benchmark/&quot;&gt;redis-benchmark: como usar e ler os resultados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/throughput-vs-latency/&quot;&gt;Vazão vs latência: como se relacionam sob carga&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>pgbench: benchmark e teste de carga do PostgreSQL</title><link>https://loadtest.app/pt-br/pgbench/</link><guid isPermaLink="true">https://loadtest.app/pt-br/pgbench/</guid><description>pgbench explicado: inicialize com -s, rode com -c, -j e -T, escreva scripts próprios, limite a taxa com -R e leia tps, latência e transações com falha.</description><pubDate>Sat, 31 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;O pgbench é o programa de benchmark que vem com o PostgreSQL: ele roda a mesma transação SQL sem parar em várias sessões simultâneas de banco de dados e informa as transações por segundo e a latência. Você cria as tabelas de teste com &lt;code&gt;pgbench -i -s 50 mydb&lt;/code&gt; e depois roda algo como &lt;code&gt;pgbench -c 10 -j 2 -T 300 mydb&lt;/code&gt; para dez clientes em duas threads durante cinco minutos. Ele mede só o banco de dados, então não diz nada sobre o que os usuários sentem através da aplicação que fica na frente.&lt;/p&gt;
&lt;p&gt;Não rodamos o pgbench para este guia. Os fatos vêm da página do pgbench na documentação do PostgreSQL 18, a versão que o postgresql.org marca como atual, conferidos em 31 de outubro de 2026, e as avaliações são nossas.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Opção&lt;/th&gt;
&lt;th&gt;O que faz&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-i&lt;/code&gt; / &lt;code&gt;-s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Criar as tabelas de teste / fator de escala (100.000 contas por unidade)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-c&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Clientes, ou seja, sessões simultâneas de banco de dados (padrão 1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-j&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Threads de trabalho dentro do pgbench (padrão 1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-T&lt;/code&gt; / &lt;code&gt;-t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Duração em segundos, ou transações por cliente (padrão 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-b&lt;/code&gt; / &lt;code&gt;-f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Um script embutido ou um arquivo seu, com um &lt;code&gt;@peso&lt;/code&gt; opcional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-P&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Relatório de progresso a cada N segundos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-R&lt;/code&gt; / &lt;code&gt;-L&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Taxa alvo em tps / limite de latência em ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-r&lt;/code&gt; / &lt;code&gt;-l&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Latências por comando / uma linha de log por transação&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;O que o pgbench mede?&lt;/h2&gt;
&lt;p&gt;Ele roda um script de transação repetidas vezes num número fixo de sessões de banco de dados e informa a taxa média de transações e a latência. O script padrão se baseia livremente no benchmark bancário TPC-B.&lt;/p&gt;
&lt;p&gt;Segundo a &lt;a href=&quot;https://www.postgresql.org/docs/current/pgbench.html&quot;&gt;documentação do pgbench&lt;/a&gt;, o cenário padrão é inspirado no TPC-B sem ser de fato TPC-B, daí o nome: a saída o chama de &lt;code&gt;TPC-B (sort of)&lt;/code&gt; (conferido em 31 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Como preparar um banco de dados para o pgbench?&lt;/h2&gt;
&lt;p&gt;Rode &lt;code&gt;pgbench -i&lt;/code&gt; contra um banco de dados existente, com &lt;code&gt;-s&lt;/code&gt; para o fator de escala. O comando cria quatro tabelas e apaga qualquer tabela existente com o mesmo nome, então dê a ele um banco só seu.&lt;/p&gt;
&lt;p&gt;Com fator 1, &lt;code&gt;pgbench_branches&lt;/code&gt; tem uma linha, &lt;code&gt;pgbench_tellers&lt;/code&gt; 10, &lt;code&gt;pgbench_accounts&lt;/code&gt; 100.000 e &lt;code&gt;pgbench_history&lt;/code&gt; nenhuma, e &lt;code&gt;-s&lt;/code&gt; multiplica essas linhas: &lt;code&gt;-s 100&lt;/code&gt; gera 10.000.000 de linhas em &lt;code&gt;pgbench_accounts&lt;/code&gt;. A documentação não informa o tamanho em disco, então meça depois de inicializar (conferido em 31 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Quais scripts embutidos o pgbench traz?&lt;/h2&gt;
&lt;p&gt;Três: &lt;code&gt;tpcb-like&lt;/code&gt; (o padrão), &lt;code&gt;simple-update&lt;/code&gt; e &lt;code&gt;select-only&lt;/code&gt;. Você escolhe um com &lt;code&gt;-b&lt;/code&gt; ou com os atalhos &lt;code&gt;-N&lt;/code&gt; e &lt;code&gt;-S&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;O padrão envia sete comandos por transação: &lt;code&gt;BEGIN&lt;/code&gt;, um update e um select numa conta aleatória, updates em &lt;code&gt;pgbench_tellers&lt;/code&gt; e &lt;code&gt;pgbench_branches&lt;/code&gt;, um insert em &lt;code&gt;pgbench_history&lt;/code&gt; e &lt;code&gt;END&lt;/code&gt;. O &lt;code&gt;simple-update&lt;/code&gt; tira os dois updates das tabelas pequenas, o que evita contenção nelas e, segundo a documentação, afasta o teste ainda mais do TPC-B. O &lt;code&gt;select-only&lt;/code&gt; envia só o select.&lt;/p&gt;
&lt;h2&gt;Como escrever um script próprio para o pgbench?&lt;/h2&gt;
&lt;p&gt;Coloque seu SQL num arquivo, defina variáveis com &lt;code&gt;\set&lt;/code&gt; e as funções aleatórias, e passe o arquivo com &lt;code&gt;-f&lt;/code&gt;. Cada execução do arquivo conta como uma transação.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;\set aid random(1, 100000 * :scale)
\set delta random(-5000, 5000)
BEGIN;
UPDATE pgbench_accounts SET abalance = abalance + :delta
  WHERE aid = :aid;
SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
END;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Um peso depois de &lt;code&gt;@&lt;/code&gt; define com que frequência cada script é escolhido: &lt;code&gt;-f update.sql@9 -b select-only@1&lt;/code&gt; escolhe o arquivo em cerca de nove de cada dez vezes. A documentação também lista &lt;code&gt;random_exponential&lt;/code&gt;, &lt;code&gt;random_gaussian&lt;/code&gt; e &lt;code&gt;random_zipfian&lt;/code&gt;, com as quais dá para concentrar o acesso em poucas linhas. O &lt;code&gt;\sleep&lt;/code&gt; adiciona uma pausa, a versão de banco de dados do &lt;a href=&quot;https://loadtest.app/pt-br/think-time-in-load-testing/&quot;&gt;tempo de pensamento&lt;/a&gt;. Se você roda só os seus próprios arquivos, passe o fator de escala do banco com &lt;code&gt;-s&lt;/code&gt;; senão &lt;code&gt;:scale&lt;/code&gt; fica em 1 e o script acima só mexe nas primeiras 100.000 contas. Com tabelas próprias, deixe de fora o &lt;code&gt;-i&lt;/code&gt; e adicione &lt;code&gt;-n&lt;/code&gt; para o pgbench não rodar VACUUM nas tabelas padrão (conferido em 31 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Quais opções transformam o pgbench num teste de carga?&lt;/h2&gt;
&lt;p&gt;A concorrência vem de &lt;code&gt;-c&lt;/code&gt; e &lt;code&gt;-j&lt;/code&gt;, a duração de &lt;code&gt;-T&lt;/code&gt; e o formato da carga de &lt;code&gt;-R&lt;/code&gt;. Sem &lt;code&gt;-R&lt;/code&gt;, cada cliente inicia a próxima transação assim que a anterior termina.&lt;/p&gt;
&lt;p&gt;Esse padrão é um modelo de carga fechado, explicado no nosso artigo sobre o &lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;modelo de carga aberto vs fechado&lt;/a&gt;. Com &lt;code&gt;-R&lt;/code&gt;, o pgbench inicia as transações num cronograma com distribuição de Poisson que avança a partir do início do cliente, não importa o que aconteceu com as transações anteriores. A latência informada passa a contar a partir de cada início previsto e inclui o atraso em relação ao cronograma (schedule lag), cuja média e máximo aparecem à parte: é a correção que o nosso artigo sobre &lt;a href=&quot;https://loadtest.app/pt-br/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt; descreve. O número de clientes fica fixo, então se o atraso não para de crescer, o sistema não aguenta essa taxa com os clientes e threads escolhidos: reduza o &lt;code&gt;-R&lt;/code&gt; ou adicione clientes.&lt;/p&gt;
&lt;p&gt;O &lt;code&gt;--latency-limit&lt;/code&gt; (&lt;code&gt;-L&lt;/code&gt;) conta como atrasadas as transações que passam de um limite em milissegundos; com &lt;code&gt;-R&lt;/code&gt;, o pgbench também pula as transações que já estão atrasadas demais em relação ao cronograma e as informa como puladas. O &lt;code&gt;-M prepared&lt;/code&gt; usa prepared statements, que segundo a documentação rodam mais rápido que os outros modos (conferido em 31 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Como ler a saída do pgbench?&lt;/h2&gt;
&lt;p&gt;O resumo mostra as configurações, as transações processadas e com falha, a latência média, o tempo de conexão inicial e os tps. O formato abaixo vem da documentação, sem os números:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;transaction type: &amp;lt;builtin: TPC-B (sort of)&amp;gt;
number of transactions actually processed: ...
number of failed transactions: ... (...%)
latency average = ... ms
latency stddev = ... ms   (only with -P, -R or -L)
initial connection time = ... ms
tps = ... (without initial connection time)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As transações com falha são erros de serialização ou deadlocks, que o &lt;code&gt;--max-tries&lt;/code&gt; pode repetir. Os outros erros de SQL abortam o cliente afetado e deixam o código de saída em 2. O resumo não traz percentis: para a &lt;a href=&quot;https://loadtest.app/pt-br/tail-latency/&quot;&gt;latência de cauda&lt;/a&gt;, registre cada transação com &lt;code&gt;-l&lt;/code&gt;, que grava a duração dela em microssegundos, e calcule você mesmo o p95 ou o p99.&lt;/p&gt;
&lt;p&gt;Sem &lt;code&gt;-P&lt;/code&gt;, &lt;code&gt;-R&lt;/code&gt; ou &lt;code&gt;-L&lt;/code&gt;, a latência média do resumo não é medida: o pgbench a deduz a partir da duração e do número de clientes, ou seja, a &lt;a href=&quot;https://loadtest.app/pt-br/littles-law-load-testing/&quot;&gt;lei de Little&lt;/a&gt; aplicada ao contrário, com as falhas incluídas. Adicione &lt;code&gt;-P&lt;/code&gt; quando a latência importar.&lt;/p&gt;
&lt;h2&gt;Como obter números confiáveis do pgbench?&lt;/h2&gt;
&lt;p&gt;Faça cada execução durar vários minutos, repita, mantenha o fator de escala pelo menos igual ao número de clientes e fique de olho no VACUUM. Se o próprio pgbench virar o gargalo, leve-o para outra máquina.&lt;/p&gt;
&lt;p&gt;A primeira orientação da seção &amp;quot;Good Practices&amp;quot; da documentação avisa para não acreditar em nenhum teste que dure só alguns segundos, e acrescenta que números reproduzíveis podem levar horas (conferido em 31 de outubro de 2026). Com o script padrão, um fator de escala menor que o número de clientes mede principalmente a contenção dos updates, porque &lt;code&gt;pgbench_branches&lt;/code&gt; tem só &lt;code&gt;-s&lt;/code&gt; linhas e cada transação altera uma delas. Linhas mortas e o autovacuum mudam os resultados de uma execução para outra. Com muitas sessões, o pgbench pode saturar a própria máquina: rode-o numa máquina separada com baixa latência de rede, ou distribua várias instâncias por várias máquinas.&lt;/p&gt;
&lt;h2&gt;Quando o pgbench não é a ferramenta certa?&lt;/h2&gt;
&lt;p&gt;Quando a pergunta é sobre os usuários, sobre outro banco de dados ou sobre um mix OLTP padrão. O pgbench mede o PostgreSQL sozinho, sem o seu pool de conexões, ORM, cache ou camada HTTP.&lt;/p&gt;
&lt;p&gt;Para ver o que os usuários sentem, coloque carga na camada HTTP ou de API que fica na frente. A LoadFocus, que publica este site, não roda o pgbench e não consegue se conectar diretamente ao PostgreSQL: ela &lt;a href=&quot;https://loadfocus.com/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=pgbench&quot;&gt;roda planos de teste JMeter e scripts k6&lt;/a&gt; a partir de 25 regiões na nuvem contra endpoints web e de API, e o &lt;a href=&quot;https://loadfocus.com/templates/load-testing-for-database-query-performance?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=pgbench&quot;&gt;template para os endpoints por trás das consultas pesadas&lt;/a&gt; é um ponto de partida.&lt;/p&gt;
&lt;p&gt;Escolha o &lt;strong&gt;sysbench&lt;/strong&gt; para MySQL: o &lt;a href=&quot;https://github.com/akopytov/sysbench&quot;&gt;repositório&lt;/a&gt; dele descreve uma ferramenta de benchmark programável e multithread com testes de banco de dados no estilo OLTP. Escolha o &lt;strong&gt;HammerDB&lt;/strong&gt; para um mix no estilo TPC-C: a &lt;a href=&quot;https://www.hammerdb.com/docs/ch03.html&quot;&gt;documentação&lt;/a&gt; descreve o TPROC-C, uma carga derivada do TPC-C, que ele roda no &lt;a href=&quot;https://www.hammerdb.com/&quot;&gt;PostgreSQL e em outros bancos&lt;/a&gt;. Escolha o &lt;strong&gt;JMeter&lt;/strong&gt; com o &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html&quot;&gt;sampler JDBC Request&lt;/a&gt; para misturar SQL e HTTP num mesmo plano de teste nas suas próprias máquinas (tudo conferido em 31 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Para que serve a opção -s do pgbench?&lt;/strong&gt;
Ela define o fator de escala na inicialização. Cada unidade adiciona 100.000 linhas a pgbench_accounts, então -s 100 cria 10.000.000 de linhas. Com o script padrão, mantenha o valor pelo menos igual ao seu número de clientes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qual é a diferença entre -c e -j no pgbench?&lt;/strong&gt;
A opção -c define o número de clientes simulados, cada um uma sessão simultânea de banco de dados. A opção -j define quantas threads de trabalho do pgbench dividem esses clientes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A LoadFocus consegue rodar o pgbench?&lt;/strong&gt;
Não. A LoadFocus roda planos de teste JMeter e scripts k6 e não tem conexão direta com o PostgreSQL, então com ela você coloca carga na camada web ou de API que fica na frente do banco de dados.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/coordinated-omission/&quot;&gt;Coordinated omission: o que é e como evitar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;Modelo de carga aberto vs fechado: qual usar e quando&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/tail-latency/&quot;&gt;Latência de cauda: o que é e como medir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/littles-law-load-testing/&quot;&gt;Lei de Little em teste de carga: dimensionar e conferir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/sysbench/&quot;&gt;Como usar o sysbench: benchmarks de CPU, disco e MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/ycsb/&quot;&gt;YCSB: cargas de trabalho A-F, execução e limites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/redis-benchmark/&quot;&gt;redis-benchmark: como usar e ler os resultados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/tpc-h/&quot;&gt;TPC-H: o que o benchmark mede e como executá-lo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>redis-benchmark: como usar e ler os resultados</title><link>https://loadtest.app/pt-br/redis-benchmark/</link><guid isPermaLink="true">https://loadtest.app/pt-br/redis-benchmark/</guid><description>Como usar o redis-benchmark: opções principais, ler a vazão e a latência, o efeito do pipelining e dos clientes e por que sua aplicação vê outros números.</description><pubDate>Sat, 31 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;O redis-benchmark é o utilitário de benchmark que vem com o Redis: ele abre um número de conexões de cliente (50 por padrão), envia um número fixo de comandos (100.000 por padrão) e informa, para cada teste, as requisições por segundo e a latência. Rode &lt;code&gt;redis-benchmark -q -n 100000&lt;/code&gt; contra um servidor em execução, restrinja com &lt;code&gt;-t&lt;/code&gt; aos comandos que interessam e leia o resultado como a velocidade de uma única instância do Redis sob comandos sintéticos. Sua aplicação acrescenta o próprio caminho de rede, a biblioteca cliente e o seu mix de comandos, então espere números diferentes.&lt;/p&gt;
&lt;p&gt;Rodamos o teste em 31 de outubro de 2026 num notebook Apple M1 Max, com servidor e cliente Redis 7.2.6 na mesma máquina via loopback e sem persistência. Cada linha é uma execução de 100.000 requisições, com as requisições por segundo arredondadas para o milhar; o p50 aparece como a ferramenta imprimiu.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Execução&lt;/th&gt;
&lt;th&gt;O que muda&lt;/th&gt;
&lt;th&gt;Requisições por segundo&lt;/th&gt;
&lt;th&gt;p50 (ms)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t set,get&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nada: 50 clientes, valores de 3 bytes&lt;/td&gt;
&lt;td&gt;SET 113.000, GET 118.000&lt;/td&gt;
&lt;td&gt;0,367; 0,351&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t set,get -P 16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;16 comandos por ida e volta&lt;/td&gt;
&lt;td&gt;SET 1.010.000, GET 1.190.000&lt;/td&gt;
&lt;td&gt;0,711; 0,583&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t set,get -c 200&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;200 clientes&lt;/td&gt;
&lt;td&gt;SET 117.000, GET 123.000&lt;/td&gt;
&lt;td&gt;1,135; 1,071&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t set -d 1024&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Valores de 1.024 bytes&lt;/td&gt;
&lt;td&gt;SET 114.000&lt;/td&gt;
&lt;td&gt;0,367&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t set -r 100000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chaves aleatórias entre 100.000&lt;/td&gt;
&lt;td&gt;SET 116.000&lt;/td&gt;
&lt;td&gt;0,359&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;script load &amp;quot;...&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Um comando próprio&lt;/td&gt;
&lt;td&gt;106.000&lt;/td&gt;
&lt;td&gt;0,415&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Como rodar o redis-benchmark?&lt;/h2&gt;
&lt;p&gt;Aponte a ferramenta para um servidor em execução com &lt;code&gt;-h&lt;/code&gt; e &lt;code&gt;-p&lt;/code&gt;; sem opções, ela roda a bateria de testes padrão contra 127.0.0.1:6379. Use &lt;code&gt;-t&lt;/code&gt; para escolher os testes e &lt;code&gt;-q&lt;/code&gt; para ver uma linha por teste.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;redis-benchmark -h 10.0.0.12 -p 6379 -c 50 -n 100000 \
  -t set,get -q
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A &lt;a href=&quot;https://redis.io/docs/latest/operate/oss_and_stack/management/optimization/benchmarks/&quot;&gt;página oficial de benchmark do Redis&lt;/a&gt; e a saída de &lt;code&gt;--help&lt;/code&gt; da versão 7.2.6 listam, entre outras, estas opções (conferido em 31 de outubro de 2026):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-c&lt;/code&gt; conexões em paralelo (padrão 50) e &lt;code&gt;-n&lt;/code&gt; total de requisições (padrão 100.000).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-d&lt;/code&gt; tamanho dos valores de SET e GET em bytes (padrão 3).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-P&lt;/code&gt; comandos por pipeline (padrão 1, sem pipelining).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-t&lt;/code&gt; uma lista de testes separados por vírgula; &lt;code&gt;-q&lt;/code&gt; saída resumida; &lt;code&gt;--csv&lt;/code&gt; saída em CSV.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-r&lt;/code&gt; chaves aleatórias num espaço de chaves desse tamanho. Sem essa opção, todos os comandos usam a mesma chave.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-k 1&lt;/code&gt; mantém as conexões abertas (padrão) e &lt;code&gt;-k 0&lt;/code&gt; reconecta.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--threads&lt;/code&gt; liga o modo multithread e &lt;code&gt;--cluster&lt;/code&gt; o modo cluster, em que &lt;code&gt;-c&lt;/code&gt; precisa ser pelo menos igual ao número de nós.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Como ler a saída do redis-benchmark?&lt;/h2&gt;
&lt;p&gt;Com &lt;code&gt;-q&lt;/code&gt; você recebe uma linha por teste: requisições por segundo e latência mediana. Sem &lt;code&gt;-q&lt;/code&gt;, cada teste imprime suas configurações, uma distribuição da latência por percentil e um resumo com média, mínimo, p50, p95, p99 e máximo.&lt;/p&gt;
&lt;p&gt;O cabeçalho também mostra as configurações &lt;code&gt;save&lt;/code&gt; e &lt;code&gt;appendonly&lt;/code&gt; do servidor, que dizem se a persistência fez parte do teste. Nossa execução completa de GET deu 119.617 requisições por segundo, média de 0,352 ms, p95 de 0,559 ms, p99 de 0,623 ms e máximo de 0,759 ms. Uma requisição que chama o Redis muitas vezes tem mais chance de pegar uma chamada lenta, então olhe também o p99; nosso artigo sobre &lt;a href=&quot;https://loadtest.app/pt-br/tail-latency/&quot;&gt;latência de cauda&lt;/a&gt; explica por quê.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--csv&lt;/code&gt; imprime o resumo como uma linha por teste. Repita as execuções antes de confiar numa diferença pequena: duas execuções do mesmo teste SET nos deram cerca de 113.000 e 125.000 requisições por segundo.&lt;/p&gt;
&lt;h2&gt;Por que o pipelining muda tanto os números?&lt;/h2&gt;
&lt;p&gt;Sem &lt;code&gt;-P&lt;/code&gt;, cada cliente espera uma resposta antes de enviar o próximo comando, e cada comando paga uma ida e volta completa. Com &lt;code&gt;-P 16&lt;/code&gt;, cada cliente envia 16 de uma vez, e na nossa execução o SET subiu de cerca de 113.000 para 1.010.000 requisições por segundo e o GET de 118.000 para 1.190.000.&lt;/p&gt;
&lt;p&gt;A página oficial considera o pipelining realista, já que muitas aplicações Redis o usam, e recomenda um tamanho de pipeline próximo da média que sua aplicação consegue usar de fato. Nossa latência mediana subiu ao mesmo tempo, para 0,711 e 0,583 ms.&lt;/p&gt;
&lt;h2&gt;O que acontece quando você adiciona clientes?&lt;/h2&gt;
&lt;p&gt;Com o gargalo já saturado, mais clientes só acrescentam espera. Num único notebook, ele pode ser o servidor ou o cliente de benchmark, que usa uma só thread.&lt;/p&gt;
&lt;p&gt;Indo de 50 para 200 clientes, a vazão ficou quase estável (cerca de 117.000 requisições SET e 123.000 GET por segundo) enquanto a latência mediana quase triplicou, para 1,135 e 1,071 ms. É a &lt;a href=&quot;https://loadtest.app/pt-br/littles-law-load-testing/&quot;&gt;lei de Little&lt;/a&gt; em ação. Cada cliente tem no máximo um comando em andamento, então &lt;code&gt;-c&lt;/code&gt; fixa quantos estão no sistema, e se a vazão não pode crescer, o tempo que cada um passa ali precisa crescer. Na nossa execução completa de GET, 50 clientes ÷ 119.617 requisições por segundo dão 0,42 ms por volta de cliente, um pouco acima da média medida de 0,352 ms. Com 200 clientes, a mesma conta dá 1,63 ms.&lt;/p&gt;
&lt;p&gt;Por isso a ferramenta também segue um modelo de carga fechado: quando o Redis trava, os clientes esperam, e os comandos que sua aplicação teria enviado nesse meio-tempo nunca aparecem. Nem a página oficial nem o &lt;code&gt;--help&lt;/code&gt; trazem uma opção de taxa de requisições fixa, então leia os percentis com a &lt;a href=&quot;https://loadtest.app/pt-br/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt; em mente.&lt;/p&gt;
&lt;h2&gt;Como medir seu próprio comando ou um script Lua?&lt;/h2&gt;
&lt;p&gt;Escreva o comando depois das opções. A ferramenta passa a rodar só esse comando e ignora &lt;code&gt;-t&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;redis-benchmark -n 100000 -q \
  script load &amp;quot;redis.call(&amp;#39;set&amp;#39;,&amp;#39;foo&amp;#39;,&amp;#39;bar&amp;#39;)&amp;quot;
redis-benchmark -r 10000 -n 10000 \
  eval &amp;#39;return redis.call(&amp;quot;ping&amp;quot;)&amp;#39; 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A primeira linha é o exemplo da página oficial; no nosso notebook ela rodou a cerca de 106.000 requisições por segundo. &lt;code&gt;SCRIPT LOAD&lt;/code&gt; só carrega o script, então use &lt;code&gt;eval&lt;/code&gt;, como na segunda linha, tirada do &lt;code&gt;--help&lt;/code&gt;, para medir a execução. Com &lt;code&gt;-r&lt;/code&gt;, a ajuda diz que &lt;code&gt;__rand_int__&lt;/code&gt; num argumento vira um número aleatório de 12 dígitos nesse intervalo, e no modo cluster a chave precisa conter uma &lt;code&gt;{tag}&lt;/code&gt; para chegar ao nó certo.&lt;/p&gt;
&lt;h2&gt;Por que sua aplicação vê outros números?&lt;/h2&gt;
&lt;p&gt;Sua aplicação mede todo o caminho até o Redis: rede, biblioteca cliente, serialização e o próprio mix de comandos. A página oficial lista armadilhas que vale conferir antes de comparar.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um loop de comandos síncronos mede sobretudo a rede e a biblioteca cliente.&lt;/li&gt;
&lt;li&gt;Com cliente e servidor na mesma máquina, a CPU limita o benchmark. Sockets de domínio Unix podem chegar a cerca de 50% mais vazão que o loopback TCP, no Linux por exemplo.&lt;/li&gt;
&lt;li&gt;Strings de 4 KB a 100.000 requisições por segundo precisam de cerca de 3,2 Gbit/s, mais do que um link de 1 Gbit/s comporta.&lt;/li&gt;
&lt;li&gt;Para comparar o Redis com um banco de dados transacional, ligue o AOF e escolha uma política de fsync adequada.&lt;/li&gt;
&lt;li&gt;Notebooks variam a frequência da CPU, o que prejudica a repetibilidade.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INFO&lt;/code&gt; em intervalos regulares provavelmente não atrapalha uma execução, enquanto &lt;code&gt;MONITOR&lt;/code&gt; deixa o Redis bem mais lento. O panorama de &lt;a href=&quot;https://loadfocus.com/blog/comparisons/redis-monitoring-tools/?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=redis-benchmark&quot;&gt;ferramentas de monitoramento do Redis&lt;/a&gt; da LoadFocus, que publica este site, cobre as métricas que valem acompanhar.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Esses números de notebook mostram a capacidade real do Redis?&lt;/h2&gt;
&lt;p&gt;Não. Eles mostram um notebook conversando consigo mesmo, sem rede, com valores de 3 bytes na maioria das execuções, sem persistência e com uma execução por linha.&lt;/p&gt;
&lt;p&gt;A tabela mostra como cada opção mexe nos números. A capacidade depende do seu servidor, da sua rede, do tamanho dos seus valores e das suas configurações de persistência.&lt;/p&gt;
&lt;h2&gt;Quando o redis-benchmark é a ferramenta errada?&lt;/h2&gt;
&lt;p&gt;Quando você quer saber o que os usuários sentem. Ele envia comandos sintéticos só para o Redis, enquanto o tempo de resposta de uma página inclui também o código da aplicação e as outras chamadas que ela faz.&lt;/p&gt;
&lt;p&gt;Para isso, aplique carga na aplicação ou na API que usa o Redis e acompanhe o Redis durante o teste. A LoadFocus, que publica este site, trabalha nessa camada: ela &lt;a href=&quot;https://loadfocus.com/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=redis-benchmark&quot;&gt;roda planos de teste JMeter e scripts k6&lt;/a&gt; a partir de 25 regiões na nuvem contra sua aplicação web ou API. Ela não roda o redis-benchmark.&lt;/p&gt;
&lt;p&gt;Para ter mais controle sobre o tráfego do Redis, o repositório do &lt;a href=&quot;https://github.com/redis/memtier_benchmark&quot;&gt;memtier_benchmark&lt;/a&gt; cita clientes multithread, uma proporção de leitura e escrita, padrões de chave aleatórios ou sequenciais, Redis Cluster e TLS (conferido em 31 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;O redis-benchmark foi feito para o Redis parecer rápido?&lt;/strong&gt;
Não. A página oficial do Redis chama isso de um equívoco comum: por padrão, a ferramenta mantém no máximo uma consulta pendente por conexão, sem pipelining, e um cliente que usa pipelining consegue gerar mais vazão.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Como encher um banco Redis com o redis-benchmark?&lt;/strong&gt;
Rode só o teste SET com chaves aleatórias, como mostra a ajuda da ferramenta: &lt;code&gt;-t set -n 1000000 -r 100000000&lt;/code&gt; grava cerca de um milhão de chaves. Chaves aleatórias podem se repetir, então o total final fica um pouco abaixo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A LoadFocus consegue rodar o redis-benchmark?&lt;/strong&gt;
Não. A LoadFocus não roda o redis-benchmark. Os planos de teste JMeter e os scripts k6 dela miram a aplicação web ou a API que fica na frente do Redis.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/littles-law-load-testing/&quot;&gt;Lei de Little em teste de carga: dimensionar e conferir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/tail-latency/&quot;&gt;Latência de cauda: o que é e como medir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/coordinated-omission/&quot;&gt;Coordinated omission: o que é e como evitar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;Modelo de carga aberto vs fechado: qual usar e quando&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/http-benchmarking-tools/&quot;&gt;Ferramentas de benchmark HTTP: wrk, hey, oha, ab e mais&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/pgbench/&quot;&gt;pgbench: benchmark e teste de carga do PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/sysbench/&quot;&gt;Como usar o sysbench: benchmarks de CPU, disco e MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/ycsb/&quot;&gt;YCSB: cargas de trabalho A-F, execução e limites&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Como usar o sysbench: benchmarks de CPU, disco e MySQL</title><link>https://loadtest.app/pt-br/sysbench/</link><guid isPermaLink="true">https://loadtest.app/pt-br/sysbench/</guid><description>Como o sysbench funciona: testes de CPU, memória e E/S de arquivos, scripts OLTP para MySQL e PostgreSQL, opções principais, leitura da saída e limites.</description><pubDate>Sat, 31 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;O sysbench é uma ferramenta de benchmark open source e multithread, construída sobre LuaJIT, que traz testes de CPU, memória, E/S de arquivos, threads e mutex, além de scripts OLTP para MySQL e PostgreSQL. Os testes que precisam de dados seguem o mesmo ciclo: &lt;code&gt;prepare&lt;/code&gt; cria os arquivos ou as tabelas de teste, &lt;code&gt;run&lt;/code&gt; executa o benchmark por um tempo ou número de eventos definido, e &lt;code&gt;cleanup&lt;/code&gt; apaga os dados; os testes de CPU e memória só precisam de &lt;code&gt;run&lt;/code&gt;. Ele mede uma única máquina ou um único servidor de banco de dados, então não diz como a sua aplicação se comporta com tráfego real de usuários.&lt;/p&gt;
&lt;p&gt;Não rodamos o sysbench para este guia. Os fatos vêm do README e do código-fonte no branch master do GitHub, conferidos em 31 de outubro de 2026, e as recomendações são nossas.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tema&lt;/th&gt;
&lt;th&gt;sysbench&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licença&lt;/td&gt;
&lt;td&gt;GPLv2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escrito em&lt;/td&gt;
&lt;td&gt;C, com LuaJIT para os scripts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Última versão&lt;/td&gt;
&lt;td&gt;1.0.20 (24 de abril de 2020)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Último commit&lt;/td&gt;
&lt;td&gt;9 de março de 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testes embutidos&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cpu&lt;/code&gt;, &lt;code&gt;memory&lt;/code&gt;, &lt;code&gt;fileio&lt;/code&gt;, &lt;code&gt;threads&lt;/code&gt;, &lt;code&gt;mutex&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scripts de banco de dados&lt;/td&gt;
&lt;td&gt;Oito scripts &lt;code&gt;oltp_*&lt;/code&gt;, &lt;code&gt;bulk_insert&lt;/code&gt;, dois &lt;code&gt;select_random_*&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Drivers de banco de dados&lt;/td&gt;
&lt;td&gt;MySQL (padrão), PostgreSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plataformas&lt;/td&gt;
&lt;td&gt;Linux, macOS; Windows via WSL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;O sysbench ainda é mantido?&lt;/h2&gt;
&lt;p&gt;Pouco. A última versão, 1.0.20, saiu em abril de 2020; desde então o branch master recebeu commits ocasionais, nenhum deles lançado numa versão, o mais recente em março de 2025.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://github.com/akopytov/sysbench/releases/tag/1.0.20&quot;&gt;versão 1.0.20&lt;/a&gt; tem data de 24 de abril de 2020. O &lt;a href=&quot;https://github.com/akopytov/sysbench/commits/master&quot;&gt;histórico de commits&lt;/a&gt; mostra mudanças como uma distribuição uniforme por padrão para &lt;code&gt;--rand-type&lt;/code&gt; (2020), um LuaJIT do upstream (2023) e suporte às bibliotecas cliente do MariaDB (2023), depois quatro commits de build em 9 de março de 2025 (conferido em 31 de outubro de 2026). Os repositórios de pacotes citados no README são atualizados a cada versão, então essas mudanças exigem um build a partir do código-fonte.&lt;/p&gt;
&lt;h2&gt;Como funciona uma execução do sysbench?&lt;/h2&gt;
&lt;p&gt;Você informa um teste e um comando: &lt;code&gt;sysbench [options] [testname] [command]&lt;/code&gt;. O teste é um dos embutidos, um script Lua incluído ou o seu próprio script, e o comando costuma ser &lt;code&gt;prepare&lt;/code&gt;, &lt;code&gt;run&lt;/code&gt;, &lt;code&gt;cleanup&lt;/code&gt; ou &lt;code&gt;help&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Segundo o &lt;a href=&quot;https://github.com/akopytov/sysbench&quot;&gt;README&lt;/a&gt;, &lt;code&gt;prepare&lt;/code&gt; cria os arquivos do &lt;code&gt;fileio&lt;/code&gt; ou preenche o banco para os scripts OLTP, &lt;code&gt;cleanup&lt;/code&gt; apaga esses dados e &lt;code&gt;sysbench &amp;lt;testname&amp;gt; help&lt;/code&gt; lista as opções de um teste. Um teste de disco:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;sysbench fileio --file-total-size=8G prepare
sysbench fileio --file-total-size=8G \
  --file-test-mode=rndrw --time=300 run
sysbench fileio --file-total-size=8G cleanup
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/tests/fileio/sb_fileio.c&quot;&gt;código do fileio&lt;/a&gt; lista os modos &lt;code&gt;seqwr&lt;/code&gt;, &lt;code&gt;seqrewr&lt;/code&gt;, &lt;code&gt;seqrd&lt;/code&gt;, &lt;code&gt;rndrd&lt;/code&gt;, &lt;code&gt;rndwr&lt;/code&gt; e &lt;code&gt;rndrw&lt;/code&gt;, com 2 GB de arquivos por padrão. Arquivos que cabem na memória podem ser servidos pelo cache de páginas, então use um total maior que a RAM quando quiser medir o disco.&lt;/p&gt;
&lt;h2&gt;Como medir CPU e memória com o sysbench?&lt;/h2&gt;
&lt;p&gt;Com &lt;code&gt;sysbench cpu run&lt;/code&gt; e &lt;code&gt;sysbench memory run&lt;/code&gt;. O teste de CPU informa eventos por segundo, em que um evento verifica se cada número até um limite é primo, e o teste de memória informa operações e MiB transferidos por segundo.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;sysbench cpu --cpu-max-prime=20000 \
  --threads=4 --time=60 run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/tests/cpu/sb_cpu.c&quot;&gt;teste de CPU&lt;/a&gt; usa &lt;code&gt;--cpu-max-prime&lt;/code&gt; igual a 10000 por padrão, e o &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/tests/memory/sb_memory.c&quot;&gt;teste de memória&lt;/a&gt; aceita tamanho de bloco, tamanho total, operações de leitura ou escrita e acesso sequencial ou aleatório (conferido em 31 de outubro de 2026). Compare só execuções com configurações idênticas.&lt;/p&gt;
&lt;h2&gt;Como testar MySQL ou PostgreSQL com o sysbench?&lt;/h2&gt;
&lt;p&gt;Escolha um dos scripts OLTP incluídos, preencha as tabelas com &lt;code&gt;prepare&lt;/code&gt;, rode transações a partir de várias threads com &lt;code&gt;run&lt;/code&gt; e depois apague as tabelas com &lt;code&gt;cleanup&lt;/code&gt;. O MySQL é o driver padrão; o PostgreSQL exige &lt;code&gt;--db-driver=pgsql&lt;/code&gt; e um build com suporte a PostgreSQL.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;sysbench oltp_read_write --mysql-host=10.0.0.5 \
  --mysql-user=sbtest --mysql-password=secret \
  --tables=10 --table-size=1000000 prepare
sysbench oltp_read_write --mysql-host=10.0.0.5 \
  --mysql-user=sbtest --mysql-password=secret \
  --tables=10 --table-size=1000000 \
  --threads=16 --time=300 --report-interval=10 run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/lua/oltp_common.lua&quot;&gt;script OLTP comum&lt;/a&gt; cria uma tabela de 10.000 linhas se você não passar &lt;code&gt;--tables&lt;/code&gt; e &lt;code&gt;--table-size&lt;/code&gt;. No &lt;code&gt;oltp_read_write&lt;/code&gt;, cada transação roda 10 consultas por chave, quatro consultas por intervalo, dois updates e um delete seguido de um insert, entre &lt;code&gt;BEGIN&lt;/code&gt; e &lt;code&gt;COMMIT&lt;/code&gt; (conferido em 31 de outubro de 2026). Use mais dados que o buffer pool do servidor se quiser leituras de disco no resultado.&lt;/p&gt;
&lt;h2&gt;Quais opções do sysbench importam mais?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;--threads&lt;/code&gt; e &lt;code&gt;--time&lt;/code&gt; definem o tamanho e a duração de uma execução, &lt;code&gt;--rate&lt;/code&gt; define uma taxa-alvo de eventos, e &lt;code&gt;--report-interval&lt;/code&gt;, &lt;code&gt;--percentile&lt;/code&gt; e &lt;code&gt;--histogram&lt;/code&gt; decidem o que você vê.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--threads&lt;/code&gt;: threads de trabalho, 1 por padrão.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--time&lt;/code&gt;: segundos, 10 por padrão, 0 para sem limite. &lt;code&gt;--events&lt;/code&gt; limita o número de eventos, e os dois limites valem, então combine com &lt;code&gt;--time=0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--warmup-time&lt;/code&gt;: roda primeiro sem estatísticas, para que caches frios não distorçam o resultado. Só no branch master: a versão 1.0.20 não tem essa opção.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--rate&lt;/code&gt;: média de eventos por segundo somando todas as threads; 0, o padrão, significa o mais rápido possível.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--report-interval&lt;/code&gt;: números por intervalo a cada N segundos, para mostrar travamentos.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--percentile&lt;/code&gt;: o percentil de latência exibido, 95 por padrão.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--histogram&lt;/code&gt;: um histograma de latência no fim, definido em &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/sb_logger.c&quot;&gt;sb_logger.c&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;O sysbench usa um modelo de carga fechado ou aberto?&lt;/h2&gt;
&lt;p&gt;Fechado por padrão: um número fixo de threads dispara o próximo evento assim que o anterior termina, então um servidor lento recebe menos eventos. Com &lt;code&gt;--rate&lt;/code&gt;, os eventos chegam no próprio ritmo, o que fica mais perto de um modelo de carga aberto.&lt;/p&gt;
&lt;p&gt;Nosso artigo sobre o &lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;modelo de carga aberto vs fechado&lt;/a&gt; explica por que isso muda o que um benchmark mede. No modo padrão, um travamento também atrasa os eventos que teriam começado durante ele, e esses atrasos nunca chegam às latências: é a &lt;a href=&quot;https://loadtest.app/pt-br/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt;. O &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/sysbench.c&quot;&gt;arquivo-fonte principal&lt;/a&gt; mostra que &lt;code&gt;--rate&lt;/code&gt; põe os eventos numa fila em intervalos com distribuição exponencial, soma à latência de cada evento o tempo que ele esperou na fila e para com o erro &amp;quot;event queue is full&amp;quot; quando as threads não dão conta (conferido em 31 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Como ler a saída do sysbench?&lt;/h2&gt;
&lt;p&gt;Comece pela vazão: eventos por segundo, ou transações e consultas por segundo nos scripts OLTP. Depois leia o bloco de latência em milissegundos: mínimo, média, máximo, o percentil escolhido (p95 por padrão) e a soma.&lt;/p&gt;
&lt;p&gt;A versão 1.0.20 mostra, no lugar de &amp;quot;Throughput&amp;quot;, um bloco &amp;quot;General statistics&amp;quot; com o tempo total e o número total de eventos. Os nomes dos campos vêm do &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/db_driver.c&quot;&gt;código do relatório de banco de dados&lt;/a&gt; e do arquivo-fonte principal no master, aqui sem valores:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;SQL statistics:
    queries performed: read, write, other, total
    transactions, queries (N per sec.)
    ignored errors, reconnects (N per sec.)
Throughput:
    events/s (eps), time elapsed, total number of events
Latency (ms):
    min, avg, max, 95th percentile, sum
Threads fairness:
    events, execution time (avg/stddev)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Um percentil 95 deixa de fora o evento mais lento de cada vinte. Use &lt;code&gt;--percentile=99&lt;/code&gt; ou acrescente &lt;code&gt;--histogram&lt;/code&gt; quando a cauda importa; nosso guia de &lt;a href=&quot;https://loadtest.app/pt-br/tail-latency/&quot;&gt;latência de cauda&lt;/a&gt; explica por quê.&lt;/p&gt;
&lt;h2&gt;Quando o sysbench é a ferramenta errada?&lt;/h2&gt;
&lt;p&gt;Quando a sua pergunta é sobre a sua aplicação. Uma pontuação de CPU mostra a rapidez com que uma máquina verifica números primos, e uma execução OLTP mede o servidor de banco de dados com as tabelas e consultas do sysbench, sem o seu schema, o seu pool de conexões ou o caminho de rede.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Escolha o &lt;strong&gt;pgbench&lt;/strong&gt; para testes nativos de PostgreSQL: a &lt;a href=&quot;https://www.postgresql.org/docs/current/pgbench.html&quot;&gt;documentação do PostgreSQL&lt;/a&gt; descreve um cenário padrão vagamente baseado no TPC-B, além de arquivos de script próprios (conferido em 31 de outubro de 2026).&lt;/li&gt;
&lt;li&gt;Escolha o &lt;strong&gt;HammerDB&lt;/strong&gt; para testes no estilo TPC-C: a &lt;a href=&quot;https://www.hammerdb.com/document.html&quot;&gt;documentação&lt;/a&gt; dele cobre a carga TPROC-C, derivada do TPC-C, para SQL Server, Db2, Oracle, PostgreSQL, MariaDB e MySQL (conferido em 31 de outubro de 2026).&lt;/li&gt;
&lt;li&gt;Escolha o &lt;strong&gt;JMeter&lt;/strong&gt; com o sampler JDBC Request para misturar SQL e HTTP num mesmo plano de teste; o &lt;a href=&quot;https://jmeter.apache.org/usermanual/build-db-test-plan.html&quot;&gt;guia de planos de teste de banco de dados&lt;/a&gt; diz que o &lt;code&gt;.jar&lt;/code&gt; do driver vai na pasta &lt;code&gt;lib&lt;/code&gt; do JMeter.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A LoadFocus, que publica este site, não roda o sysbench e não consegue se conectar sozinha a MySQL ou PostgreSQL. Ela &lt;a href=&quot;https://loadfocus.com/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=sysbench&quot;&gt;roda planos de teste JMeter&lt;/a&gt; e scripts k6 a partir de 25 regiões na nuvem contra a camada web ou de API que fica na frente do banco. Uma combinação útil: uma execução do sysbench para dimensionar o servidor de banco de dados e depois um &lt;a href=&quot;https://loadfocus.com/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=sysbench&quot;&gt;teste de carga da aplicação&lt;/a&gt; para ver se as requisições reais chegam a esse limite.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;O sysbench ainda é mantido?&lt;/strong&gt;
Pouco. A última versão é a 1.0.20, de 24 de abril de 2020. O branch master recebeu desde então commits ocasionais, nenhum deles numa versão, o mais recente em 9 de março de 2025.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O que significa o percentil 95 na saída do sysbench?&lt;/strong&gt;
É a latência, em milissegundos, dentro da qual 95% dos eventos terminaram. 95 é o valor padrão da opção &lt;code&gt;--percentile&lt;/code&gt;, e você pode definir outro, como 99.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O sysbench consegue fazer benchmark do PostgreSQL?&lt;/strong&gt;
Sim. Os scripts OLTP incluídos rodam contra o PostgreSQL com &lt;code&gt;--db-driver=pgsql&lt;/code&gt; quando o sysbench foi compilado com suporte a PostgreSQL.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A LoadFocus consegue rodar o sysbench?&lt;/strong&gt;
Não. A LoadFocus roda planos de teste JMeter e scripts k6 contra sites e APIs a partir de 25 regiões na nuvem, e não se conecta diretamente a MySQL ou PostgreSQL.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;Modelo de carga aberto vs fechado: qual usar e quando&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/coordinated-omission/&quot;&gt;Coordinated omission: o que é e como evitar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/tail-latency/&quot;&gt;Latência de cauda: o que é e como medir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/http-benchmarking-tools/&quot;&gt;Ferramentas de benchmark HTTP: wrk, hey, oha, ab e mais&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/throughput-vs-latency/&quot;&gt;Vazão vs latência: como se relacionam sob carga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/pgbench/&quot;&gt;pgbench: benchmark e teste de carga do PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/ycsb/&quot;&gt;YCSB: cargas de trabalho A-F, execução e limites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/redis-benchmark/&quot;&gt;redis-benchmark: como usar e ler os resultados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/tpc-h/&quot;&gt;TPC-H: o que o benchmark mede e como executá-lo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>YCSB: cargas de trabalho A-F, execução e limites</title><link>https://loadtest.app/pt-br/ycsb/</link><guid isPermaLink="true">https://loadtest.app/pt-br/ycsb/</guid><description>YCSB explicado: o que o Yahoo! Cloud Serving Benchmark mede, as cargas de trabalho A a F, as fases load e run, como ler a saída e onde ele deixa a desejar.</description><pubDate>Sat, 31 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;O YCSB, Yahoo! Cloud Serving Benchmark, é uma ferramenta open source escrita em Java que carrega registros sintéticos num banco de dados e depois executa sobre eles uma mistura fixa de leituras, atualizações, inserções e scans enquanto registra a vazão e a latência de cada operação. Suas seis cargas de trabalho principais (core workloads), de A a F, são misturas padronizadas, então o mesmo teste pode rodar contra Cassandra, MongoDB, Redis, HBase e dezenas de outros bancos por meio de bindings. Ele mede só o banco de dados, por isso não diz nada sobre as consultas reais da sua aplicação nem sobre a latência que seus usuários veem.&lt;/p&gt;
&lt;p&gt;Não rodamos o YCSB para este artigo. Os fatos vêm do repositório no GitHub, da wiki e do código-fonte do projeto, conferidos em 31 de outubro de 2026, e as avaliações são nossas.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Carga de trabalho&lt;/th&gt;
&lt;th&gt;Mistura de operações&lt;/th&gt;
&lt;th&gt;Distribuição das chaves&lt;/th&gt;
&lt;th&gt;Exemplo dado pela wiki&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;A: muitas atualizações&lt;/td&gt;
&lt;td&gt;50% leituras, 50% atualizações&lt;/td&gt;
&lt;td&gt;zipfian&lt;/td&gt;
&lt;td&gt;Armazenamento de sessões que guarda ações recentes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B: quase só leitura&lt;/td&gt;
&lt;td&gt;95% leituras, 5% atualizações&lt;/td&gt;
&lt;td&gt;zipfian&lt;/td&gt;
&lt;td&gt;Marcação de fotos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C: só leitura&lt;/td&gt;
&lt;td&gt;100% leituras&lt;/td&gt;
&lt;td&gt;zipfian&lt;/td&gt;
&lt;td&gt;Cache de perfis de usuário&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D: ler o mais recente&lt;/td&gt;
&lt;td&gt;95% leituras, 5% inserções&lt;/td&gt;
&lt;td&gt;latest&lt;/td&gt;
&lt;td&gt;Atualizações de status de usuários&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E: intervalos curtos&lt;/td&gt;
&lt;td&gt;95% scans, 5% inserções&lt;/td&gt;
&lt;td&gt;zipfian (scans de até 100 registros)&lt;/td&gt;
&lt;td&gt;Threads de conversa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F: ler-modificar-gravar&lt;/td&gt;
&lt;td&gt;50% leituras, 50% ler-modificar-gravar&lt;/td&gt;
&lt;td&gt;zipfian&lt;/td&gt;
&lt;td&gt;Banco de dados de usuários&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;As misturas vêm dos arquivos do &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/tree/master/workloads&quot;&gt;diretório workloads&lt;/a&gt; e os exemplos da &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/wiki/Core-Workloads&quot;&gt;página Core Workloads&lt;/a&gt; (conferido em 31 de outubro de 2026). Cada arquivo vem com só 1.000 registros e 1.000 operações: o bastante para depurar uma instalação e pouco demais para um benchmark.&lt;/p&gt;
&lt;h2&gt;O que é o YCSB, e ele ainda é mantido?&lt;/h2&gt;
&lt;p&gt;É um gerador de carga com um conjunto de cargas de trabalho padronizadas para comparar bancos chave-valor e de &amp;quot;cloud serving&amp;quot;, publicado como open source pelo Yahoo! em 2010 sob a licença Apache 2.0. A última versão é de outubro de 2019, e o código ainda recebe pequenos commits.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/wiki/Papers-and-Presentations&quot;&gt;página de publicações&lt;/a&gt; cita o artigo original, &amp;quot;Benchmarking Cloud Serving Systems with YCSB&amp;quot;, de Cooper, Silberstein, Tam, Ramakrishnan e Sears (ACM SoCC 2010). A &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/releases/tag/0.17.0&quot;&gt;versão 0.17.0&lt;/a&gt; tem data de 6 de outubro de 2019 e não existe tag mais nova, enquanto o &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/commits/master&quot;&gt;histórico de commits&lt;/a&gt; mostra trabalho em 2026, como uma opção para seguir em frente quando uma inserção falha e uma mudança no binding do Cloud Spanner em 20 de outubro (conferido em 31 de outubro de 2026). Essas mudanças só chegam se você compilar a partir do código-fonte, o que exige o Maven 3.&lt;/p&gt;
&lt;h2&gt;Como rodar um benchmark com o YCSB?&lt;/h2&gt;
&lt;p&gt;Em duas fases que compartilham as mesmas propriedades: &lt;code&gt;load&lt;/code&gt; insere &lt;code&gt;recordcount&lt;/code&gt; registros e depois &lt;code&gt;run&lt;/code&gt; executa &lt;code&gt;operationcount&lt;/code&gt; operações com a mistura da carga de trabalho. Você informa o binding do seu banco e passa o arquivo da carga de trabalho com &lt;code&gt;-P&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;bin/ycsb load mongodb -s -P workloads/workloada \
  -p recordcount=1000000 \
  -p mongodb.url=mongodb://db1:27017/ycsb
bin/ycsb run mongodb -s -P workloads/workloada \
  -p recordcount=1000000 -p operationcount=5000000 \
  -p mongodb.url=mongodb://db1:27017/ycsb \
  -threads 32 -target 20000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/wiki/Running-a-Workload&quot;&gt;página Running a Workload&lt;/a&gt; traz os detalhes que mais pegam as pessoas (conferido em 31 de outubro de 2026). O cliente nunca cria tabelas, então antes você precisa mapear a &lt;code&gt;usertable&lt;/code&gt; para o que o seu banco exige, como uma tabela no MySQL ou um keyspace no Cassandra. Arquivos &lt;code&gt;-P&lt;/code&gt; posteriores sobrescrevem os anteriores, e &lt;code&gt;-p&lt;/code&gt; sobrescreve todos. A fase run precisa do mesmo &lt;code&gt;recordcount&lt;/code&gt; da carga, porque escolhe as chaves dentro de todo o conjunto de dados. &lt;code&gt;-s&lt;/code&gt; mostra uma linha de status a cada 10 segundos. Como D e E inserem registros, a página Core Workloads recomenda carregar uma vez com o arquivo de A, rodar A, B, C, F e D, depois apagar os dados e carregar de novo para E.&lt;/p&gt;
&lt;h2&gt;O que -threads e -target controlam?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;-threads&lt;/code&gt; define quantas threads de cliente enviam operações (uma por padrão), e &lt;code&gt;-target&lt;/code&gt; limita o total de operações por segundo. Sem alvo, cada thread envia a próxima operação assim que a anterior volta, então um banco mais lento simplesmente recebe menos carga.&lt;/p&gt;
&lt;p&gt;É um modelo de carga fechado, e nosso artigo sobre o &lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;modelo de carga aberto vs fechado&lt;/a&gt; explica o que ele esconde. O exemplo da wiki, 10 threads com alvo de 100 operações por segundo, só se sustenta enquanto a latência média fica abaixo de 100 ms; com threads de menos, a taxa alcançada fica abaixo do alvo. É a &lt;a href=&quot;https://loadtest.app/pt-br/littles-law-load-testing/&quot;&gt;lei de Little&lt;/a&gt; em ação: threads divididas pela latência média limitam a vazão. Se você rodar vários alvos e anotar a latência de cada um, obtém a curva do nosso guia sobre &lt;a href=&quot;https://loadtest.app/pt-br/throughput-vs-latency/&quot;&gt;vazão vs latência&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Como ler a saída do YCSB?&lt;/h2&gt;
&lt;p&gt;No fim de cada fase, o cliente imprime um bloco &lt;code&gt;[OVERALL]&lt;/code&gt; com o tempo de execução e a vazão, depois um bloco por tipo de operação com a contagem, as latências média, mínima, máxima e por percentil, e uma contagem por código de retorno.&lt;/p&gt;
&lt;p&gt;Estes nomes de campo vêm do código-fonte da 0.17.0; os valores são marcadores de posição:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[OVERALL], RunTime(ms), &amp;lt;total&amp;gt;
[OVERALL], Throughput(ops/sec), &amp;lt;rate&amp;gt;
[READ], Operations, &amp;lt;count&amp;gt;
[READ], AverageLatency(us), &amp;lt;value&amp;gt;
[READ], 95thPercentileLatency(us), &amp;lt;value&amp;gt;
[READ], 99thPercentileLatency(us), &amp;lt;value&amp;gt;
[READ], Return=OK, &amp;lt;count&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A saída de exemplo da wiki mostra milissegundos, mas a medição HdrHistogram padrão, tanto na 0.17.0 quanto no código atual, informa microssegundos, &lt;code&gt;(us)&lt;/code&gt;. A &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/wiki/Core-Properties&quot;&gt;página Core Properties&lt;/a&gt; e a versão 0.17.0 definem os percentis padrão como 95 e 99, que você muda com &lt;code&gt;hdrhistogram.percentiles&lt;/code&gt;; desde abril de 2025 o branch master acrescenta o 50, então um build a partir do código-fonte também mostra &lt;code&gt;50thPercentileLatency(us)&lt;/code&gt; (conferido em 31 de outubro de 2026). O &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB&quot;&gt;README&lt;/a&gt; chama a atenção para o P99 e além, avisa que não se tira média de percentis e recomenda, com vários clientes, salvar arquivos de histograma HDR com &lt;code&gt;hdrhistogram.fileoutput=true&lt;/code&gt; e juntá-los.&lt;/p&gt;
&lt;h2&gt;O YCSB leva em conta a coordinated omission?&lt;/h2&gt;
&lt;p&gt;Só se você pedir, e só com &lt;code&gt;-target&lt;/code&gt;. Por padrão, cada latência é medida a partir do momento em que a operação é de fato enviada, então uma travada que atrasa as operações seguintes quase não aparece.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/blob/master/core/src/main/java/site/ycsb/measurements/Measurements.java&quot;&gt;código-fonte das medições&lt;/a&gt; tem uma propriedade &lt;code&gt;measurement.interval&lt;/code&gt; que aceita &lt;code&gt;op&lt;/code&gt; (padrão), &lt;code&gt;intended&lt;/code&gt; ou &lt;code&gt;both&lt;/code&gt; (conferido em 31 de outubro de 2026). Com um alvo, cada thread anota o início previsto de cada operação; &lt;code&gt;intended&lt;/code&gt; mede a latência a partir desse ponto, e &lt;code&gt;both&lt;/code&gt; acrescenta blocos &lt;code&gt;Intended-&lt;/code&gt; como &lt;code&gt;[Intended-READ]&lt;/code&gt; ao lado dos habituais. A wiki não menciona a propriedade, então confira o código da versão que você compilar. Nosso guia sobre &lt;a href=&quot;https://loadtest.app/pt-br/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt; explica por que o início previsto dá o número honesto.&lt;/p&gt;
&lt;h2&gt;Quais bancos de dados o YCSB consegue testar?&lt;/h2&gt;
&lt;p&gt;Qualquer um que tenha um binding. O arquivo de build do branch master lista 46 módulos de binding, entre eles Cassandra, MongoDB, Redis, HBase, DynamoDB, Cloud Spanner, RocksDB e um binding JDBC genérico.&lt;/p&gt;
&lt;p&gt;A lista está no &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/blob/master/pom.xml&quot;&gt;pom.xml&lt;/a&gt;, e cada diretório de binding tem o próprio README com as propriedades de conexão, como &lt;code&gt;mongodb.url&lt;/code&gt; no &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/tree/master/mongodb&quot;&gt;binding do MongoDB&lt;/a&gt; (conferido em 31 de outubro de 2026). Segundo a página Running a Workload, uma única máquina cliente basta para clusters de umas 10 máquinas; acima disso, você sobe vários clientes, e a página &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/wiki/Running-a-Workload-in-Parallel&quot;&gt;Running a Workload in Parallel&lt;/a&gt; divide a carga entre eles com &lt;code&gt;insertstart&lt;/code&gt; e &lt;code&gt;insertcount&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Quando o YCSB não é a ferramenta certa?&lt;/h2&gt;
&lt;p&gt;Quando a sua pergunta é sobre a sua aplicação. A carga de trabalho principal grava registros sintéticos, 10 campos com comprimento de 100 cada por padrão, com operações simples por chave, então não consegue mostrar como suas próprias consultas, seus índices ou o código da sua API se comportam sob carga.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Para OLTP relacional, o &lt;a href=&quot;https://www.postgresql.org/docs/current/pgbench.html&quot;&gt;pgbench&lt;/a&gt; roda no PostgreSQL um script inspirado no TPC-B e aceita scripts seus, e o &lt;a href=&quot;https://github.com/akopytov/sysbench&quot;&gt;sysbench&lt;/a&gt; traz benchmarks em Lua no estilo OLTP (ambos conferidos em 31 de outubro de 2026).&lt;/li&gt;
&lt;li&gt;Para a latência que os usuários veem, coloque sob carga a camada HTTP ou de API que fica na frente do banco. A LoadFocus, que publica este site, &lt;a href=&quot;https://loadfocus.com/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=ycsb&quot;&gt;roda planos de teste JMeter e scripts k6&lt;/a&gt; a partir de 25 regiões na nuvem contra endpoints web e de API. A LoadFocus não roda o YCSB.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Quais são as cargas de trabalho principais do YCSB?&lt;/strong&gt;
Seis misturas padronizadas: A tem 50% de leituras e 50% de atualizações, B tem 95% de leituras, C só leituras, D privilegia os registros inseridos mais recentemente, E faz scans curtos e F faz operações de leitura-modificação-gravação.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qual a diferença entre ycsb load e ycsb run?&lt;/strong&gt;
A fase load insere o número de registros definido por &lt;code&gt;recordcount&lt;/code&gt;. A fase run depois executa &lt;code&gt;operationcount&lt;/code&gt; operações com a mistura da carga de trabalho sobre esses registros e informa a vazão e a latência.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O YCSB ainda é mantido?&lt;/strong&gt;
A última versão, 0.17.0, saiu em 6 de outubro de 2019. O repositório ainda recebe commits de vez em quando, o mais recente em 20 de outubro de 2026, então as correções novas exigem compilar a partir do código-fonte.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A LoadFocus consegue rodar benchmarks do YCSB?&lt;/strong&gt;
Não. A LoadFocus não roda o YCSB. Os planos de teste JMeter e os scripts k6 dela miram endpoints web e de API, ou seja, a camada que fica na frente do banco de dados.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/coordinated-omission/&quot;&gt;Coordinated omission: o que é e como evitar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/tail-latency/&quot;&gt;Latência de cauda: o que é e como medir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;Modelo de carga aberto vs fechado: qual usar e quando&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/littles-law-load-testing/&quot;&gt;Lei de Little em teste de carga: dimensionar e conferir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/throughput-vs-latency/&quot;&gt;Vazão vs latência: como se relacionam sob carga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/pgbench/&quot;&gt;pgbench: benchmark e teste de carga do PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/sysbench/&quot;&gt;Como usar o sysbench: benchmarks de CPU, disco e MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/redis-benchmark/&quot;&gt;redis-benchmark: como usar e ler os resultados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/tpc-h/&quot;&gt;TPC-H: o que o benchmark mede e como executá-lo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Teste de carga com NBomber: análise do framework .NET</title><link>https://loadtest.app/pt-br/nbomber-load-testing/</link><guid isPermaLink="true">https://loadtest.app/pt-br/nbomber-load-testing/</guid><description>Teste de carga com NBomber: cenários em C# e F#, simulações inject e constant, thresholds, plugin HTTP, modo cluster e a licença paga para empresas.</description><pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, que vende um serviço de teste de carga abordado neste artigo.&lt;/p&gt;&lt;p&gt;O NBomber é um framework de teste de carga para .NET: você escreve cada teste como um cenário em C# ou F#, adiciona a um projeto comum e roda como qualquer outro programa. O teste de carga com NBomber combina com times que já desenvolvem em .NET e querem os testes de carga na mesma linguagem, no mesmo repositório e no mesmo executor de testes. O NBomber só é gratuito para uso pessoal e acadêmico; uma empresa precisa de uma licença paga, e esse fato decide mais avaliações do que qualquer recurso.&lt;/p&gt;
&lt;p&gt;Não rodamos o NBomber para esta análise. Os fatos vêm da documentação, da página de preços, do repositório no GitHub e do pacote no NuGet do NBomber, conferidos em 21 de outubro de 2026, e as avaliações são nossas.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tema&lt;/th&gt;
&lt;th&gt;NBomber&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licença&lt;/td&gt;
&lt;td&gt;Gratuito para uso pessoal e acadêmico; pago para organizações&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preço para uma empresa&lt;/td&gt;
&lt;td&gt;Business US$ 1.500 por ano, Enterprise US$ 2.500 por ano&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versão atual&lt;/td&gt;
&lt;td&gt;6.7.1 (16 de outubro de 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;.NET Standard 2.1, ou seja, .NET Core 3.0 ou mais novo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testes escritos como&lt;/td&gt;
&lt;td&gt;Cenários em C# ou F#&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modelo de carga&lt;/td&gt;
&lt;td&gt;Inject (taxa de chegada) ou cópias constantes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Critérios de aprovação&lt;/td&gt;
&lt;td&gt;Thresholds durante a execução, asserts sobre as estatísticas finais&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escala&lt;/td&gt;
&lt;td&gt;NBomber Cluster, licença Enterprise&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Quem faz o NBomber, e ele é gratuito?&lt;/h2&gt;
&lt;p&gt;A NBomber LLC desenvolve o framework, com o código no GitHub. Ele é gratuito para uso pessoal, hobby e acadêmico, e a página de licença diz com todas as letras que o NBomber não é gratuito para organizações.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://nbomber.com/docs/getting-started/license/&quot;&gt;página de licença&lt;/a&gt; conta benchmarks, tutoriais e conteúdo de análise como uso pessoal. Dentro de uma empresa você precisa de uma licença Business ou Enterprise, emitida por organização e não por desenvolvedor, sem limite de instâncias ou de execuções em paralelo. A &lt;a href=&quot;https://nbomber.com/pricing&quot;&gt;página de preços&lt;/a&gt; traz US$ 1.500 por ano para Business e US$ 2.500 por ano para Enterprise, ambas com 30 dias de garantia de reembolso. A chave de licença vai para o executor com &lt;code&gt;.WithLicense(...)&lt;/code&gt; ou um argumento &lt;code&gt;--license&lt;/code&gt;, e o NBomber precisa de acesso à internet para validá-la, com validação offline disponível sob pedido por e-mail (conferido em 21 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;A versão mais recente é a &lt;a href=&quot;https://github.com/PragmaticFlow/NBomber/releases/tag/v6.7.1&quot;&gt;v6.7.1&lt;/a&gt;, publicada em 16 de outubro de 2026, quatro dias depois da 6.7.0 (conferido em 21 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Como funciona um cenário do NBomber?&lt;/h2&gt;
&lt;p&gt;Um cenário é um nome mais uma função assíncrona que o NBomber cronometra a cada chamada. Você anexa simulações de carga e thresholds, registra o cenário no &lt;code&gt;NBomberRunner&lt;/code&gt; e roda o programa.&lt;/p&gt;
&lt;p&gt;Este teste pula o warm-up, sobe a taxa de chegada para 50 novas cópias do cenário por segundo em dois minutos, mantém por dez minutos e termina com código de saída 1 se 1% ou mais das requisições tiverem falhado. Ele usa o plugin &lt;code&gt;NBomber.Http&lt;/code&gt; para a requisição:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;var http = Http.CreateDefaultClient();

var scenario = Scenario.Create(&amp;quot;browse&amp;quot;, async context =&amp;gt;
{
    var request = Http.CreateRequest(&amp;quot;GET&amp;quot;,
        &amp;quot;https://staging.example.com/products&amp;quot;);
    return await Http.Send(http, request);
})
.WithoutWarmUp()
.WithLoadSimulations(
    Simulation.RampingInject(rate: 50,
        interval: TimeSpan.FromSeconds(1),
        during: TimeSpan.FromMinutes(2)),
    Simulation.Inject(rate: 50,
        interval: TimeSpan.FromSeconds(1),
        during: TimeSpan.FromMinutes(10)))
.WithThresholds(
    Threshold.Create(s =&amp;gt; s.Fail.Request.Percent &amp;lt; 1));

var result = NBomberRunner
    .RegisterScenarios(scenario).Run();
return result.Thresholds.Any(t =&amp;gt; t.IsFailed) ? 1 : 0;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A &lt;a href=&quot;https://nbomber.com/docs/protocols/http/http-client/&quot;&gt;página do cliente HTTP&lt;/a&gt; recomenda &lt;code&gt;Http.CreateDefaultClient()&lt;/code&gt; em vez de um simples &lt;code&gt;new HttpClient()&lt;/code&gt; e diz que o plugin registra os códigos de status e os dados transferidos (conferido em 21 de outubro de 2026). Um threshold sozinho só registra a falha no relatório; é a última linha que transforma isso num código de saída que um pipeline consegue ler. Sem &lt;code&gt;.WithoutWarmUp()&lt;/code&gt;, o NBomber roda antes um warm-up de 30 segundos com as simulações do próprio cenário, segundo a &lt;a href=&quot;https://nbomber.com/docs/nbomber/scenario/&quot;&gt;página de cenários&lt;/a&gt; (conferido em 21 de outubro de 2026). Como o cenário é C# comum, tudo o que uma biblioteca .NET consegue chamar pode ser colocado sob carga do mesmo jeito.&lt;/p&gt;
&lt;h2&gt;Que modelos de carga o NBomber oferece?&lt;/h2&gt;
&lt;p&gt;Os dois. As simulações inject iniciam novas cópias a uma taxa fixa, não importa o que as anteriores estejam fazendo, o que é um modelo de carga aberto; as simulações constant mantêm um número fixo de cópias rodando, o que é um modelo fechado.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://nbomber.com/docs/nbomber/load-simulation/&quot;&gt;página de simulações de carga&lt;/a&gt; lista todas (conferido em 21 de outubro de 2026):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Abertas:&lt;/strong&gt; &lt;code&gt;Inject&lt;/code&gt;, &lt;code&gt;RampingInject&lt;/code&gt;, &lt;code&gt;InjectRandom&lt;/code&gt; e &lt;code&gt;IterationsForInject&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fechadas:&lt;/strong&gt; &lt;code&gt;KeepConstant&lt;/code&gt;, &lt;code&gt;RampingConstant&lt;/code&gt; e &lt;code&gt;IterationsForConstant&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Controle de tempo:&lt;/strong&gt; &lt;code&gt;Pause&lt;/code&gt;, que atrasa o início de um cenário ou o pausa por um tempo definido.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nosso artigo sobre o &lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;modelo de carga aberto vs fechado&lt;/a&gt; explica qual combina com o seu tráfego. Um site público costuma se comportar como o modelo aberto; um grupo fixo de clientes internos, como o fechado.&lt;/p&gt;
&lt;h2&gt;Como funcionam os thresholds e os critérios de aprovação?&lt;/h2&gt;
&lt;p&gt;Os thresholds em tempo de execução checam as estatísticas em andamento, a cada 5 segundos por padrão, e aparecem no relatório HTML. Os asserts, escritos em xUnit ou NUnit, checam as estatísticas finais depois da execução, e um assert que falha encerra a execução com status de falha.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://nbomber.com/docs/nbomber/asserts_and_thresholds/&quot;&gt;página de thresholds&lt;/a&gt; mostra checagens de porcentagem de erros, códigos de status, percentis de latência (p50, p75, p95, p99 e máximo), requisições por segundo e bytes transferidos. Por padrão um threshold não para o teste; &lt;code&gt;abortWhenErrorCount&lt;/code&gt; faz ele parar depois de um número definido de checagens que falharam (conferido em 21 de outubro de 2026). A página não informa um código de saída, por isso o exemplo acima devolve um a partir do resultado. Nosso guia de &lt;a href=&quot;https://loadtest.app/pt-br/load-test-pass-fail-criteria/&quot;&gt;critérios de aprovação de um teste de carga&lt;/a&gt; ajuda a escolher os limites.&lt;/p&gt;
&lt;h2&gt;Quais protocolos o NBomber consegue testar?&lt;/h2&gt;
&lt;p&gt;Qualquer protocolo que uma biblioteca .NET fale, porque o NBomber só cronometra o código que você entrega. Há plugins prontos para HTTP, WebSockets, MQTT e AMQP, além de uma opção WebBrowser.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://nbomber.com/docs/getting-started/overview/&quot;&gt;página de visão geral&lt;/a&gt; descreve o framework como independente de protocolo, e a página de preços inclui esses plugins em todos os planos, inclusive no gratuito. Isso vale também para bancos de dados e filas de mensagens que você chama pelos próprios clientes .NET (conferido em 21 de outubro de 2026). Em troca, fora dos plugins você escreve e mantém o código do cliente.&lt;/p&gt;
&lt;h2&gt;Como escalar um teste do NBomber?&lt;/h2&gt;
&lt;p&gt;Com o NBomber Cluster: um Coordinator orquestra a execução e os Agents rodam os cenários, todos conversando por um broker de mensagens NATS. O Cluster faz parte da licença Enterprise.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://nbomber.com/docs/cluster/overview/&quot;&gt;visão geral do cluster&lt;/a&gt; explica os papéis, e a página de licença diz que os desenvolvedores podem testá-lo localmente com um Local Dev Cluster antes de comprar; a &lt;a href=&quot;https://nbomber.com/docs/cluster/local-dev-cluster/&quot;&gt;página do Local Dev Cluster&lt;/a&gt; limita o Local Dev Cluster a 1 Coordinator e 2 Agents e para cada execução depois de um minuto (conferido em 21 de outubro de 2026). A integração com Kubernetes do NBomber Studio, também exclusiva do Enterprise, provisiona o NATS e os pods dos Agents para você. Sem o Cluster, um processo do NBomber roda numa só máquina; a &lt;a href=&quot;https://nbomber.com/docs/getting-started/system-requirements/&quot;&gt;página de requisitos de sistema&lt;/a&gt; sugere de 4 a 8 núcleos de CPU para carga alta.&lt;/p&gt;
&lt;p&gt;A LoadFocus, que publica este site, não roda testes do NBomber. Ela &lt;a href=&quot;https://loadfocus.com/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=nbomber-load-testing&quot;&gt;roda planos de teste JMeter e scripts k6&lt;/a&gt; a partir de 25 regiões na nuvem.&lt;/p&gt;
&lt;h2&gt;O que o NBomber faz bem, e onde estão os limites?&lt;/h2&gt;
&lt;p&gt;Ele é forte para times .NET: os testes são código C# ou F#, qualquer cliente .NET vira um teste de carga e os dois modelos de carga já vêm prontos. Os limites são a licença para empresas, um ecossistema de uma linguagem só e execuções distribuídas pagas.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Os testes ficam ao lado do código da aplicação, com a mesma IDE, os mesmos pacotes e as mesmas revisões.&lt;/li&gt;
&lt;li&gt;Os thresholds já vêm embutidos, e os asserts rodam dentro dos testes xUnit ou NUnit que você já tem.&lt;/li&gt;
&lt;li&gt;O uso comercial exige licença, mesmo para um único desenvolvedor.&lt;/li&gt;
&lt;li&gt;Execuções distribuídas exigem o Enterprise e um broker NATS.&lt;/li&gt;
&lt;li&gt;Quem não conhece .NET vai precisar aprender C# ou F# primeiro.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Quando escolher k6, Gatling ou JMeter em vez do NBomber?&lt;/h2&gt;
&lt;p&gt;Escolha outra ferramenta quando o seu time não programa em .NET ou quando o custo da licença não cabe.&lt;/p&gt;
&lt;p&gt;Escolha o &lt;strong&gt;k6&lt;/strong&gt; quando quiser scripts em JavaScript e uma ferramenta open source sem custo de licença para uso na empresa: o &lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;repositório&lt;/a&gt; dele é AGPL-3.0 (conferido em 21 de outubro de 2026). A LoadFocus &lt;a href=&quot;https://loadfocus.com/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=nbomber-load-testing&quot;&gt;roda scripts k6&lt;/a&gt; a partir de 25 regiões na nuvem, embora rode cenários arrival-rate com um número fixo de usuários. Escolha o &lt;strong&gt;Gatling&lt;/strong&gt; para uma ferramenta baseada em código na JVM; nossa &lt;a href=&quot;https://loadtest.app/pt-br/gatling-load-testing/&quot;&gt;análise do Gatling&lt;/a&gt; cobre o tema. Escolha o &lt;strong&gt;JMeter&lt;/strong&gt; quando os testadores preferem uma interface gráfica ou quando você precisa de samplers JDBC, JMS ou LDAP de fábrica. O panorama de &lt;a href=&quot;https://loadtest.app/pt-br/open-source-load-testing-tools/&quot;&gt;ferramentas de teste de carga open source&lt;/a&gt; coloca todas lado a lado.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;O NBomber é gratuito para uso comercial?&lt;/strong&gt;
Não. O NBomber só é gratuito para uso pessoal e acadêmico. Uma empresa precisa de uma licença Business de US$ 1.500 por ano ou de uma licença Enterprise de US$ 2.500 por ano.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quais versões do .NET o NBomber suporta?&lt;/strong&gt;
Ele mira o .NET Standard 2.1, então roda no .NET Core 3.0 e em todas as versões do .NET posteriores. A documentação recomenda o .NET 10.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A LoadFocus consegue rodar testes do NBomber?&lt;/strong&gt;
Não. A LoadFocus roda planos de teste JMeter e scripts k6. Para rodar o NBomber em mais de uma máquina, use o NBomber Cluster, que exige uma licença Enterprise.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-load-testing/&quot;&gt;Teste de carga com Gatling: análise da ferramenta JVM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-source-load-testing-tools/&quot;&gt;Ferramentas de teste de carga open source: seis opções&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;Modelo de carga aberto vs fechado: qual usar e quando&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/load-test-pass-fail-criteria/&quot;&gt;Critérios de aprovação de um teste de carga: como definir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/tsung-load-testing/&quot;&gt;Teste de carga com Tsung: análise da ferramenta Erlang&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Teste de carga com Tsung: análise da ferramenta Erlang</title><link>https://loadtest.app/pt-br/tsung-load-testing/</link><guid isPermaLink="true">https://loadtest.app/pt-br/tsung-load-testing/</guid><description>Teste de carga com Tsung: cenários em XML, fases de chegada, plugins HTTP, XMPP, banco de dados e MQTT, clientes distribuídos, relatórios e versão de 2023.</description><pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, que vende um serviço de teste de carga abordado neste artigo.&lt;/p&gt;&lt;p&gt;O Tsung é uma ferramenta de teste de carga open source escrita em Erlang, que descreve cada teste num arquivo XML e consegue distribuir a carga entre muitas máquinas cliente. O teste de carga com Tsung ainda faz sentido para protocolos que poucas ferramentas cobrem, como XMPP, LDAP ou PostgreSQL no nível do protocolo, e para um número muito grande de usuários em hardware modesto. A última versão saiu em março de 2023, então para testes novos de HTTP ou de API a maioria dos times se sai melhor com k6, Gatling ou JMeter.&lt;/p&gt;
&lt;p&gt;Não rodamos o Tsung para esta análise. Os fatos vêm da documentação e do repositório no GitHub do Tsung, conferidos em 21 de outubro de 2026, e as avaliações são nossas.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tema&lt;/th&gt;
&lt;th&gt;Tsung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licença&lt;/td&gt;
&lt;td&gt;GPL-2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escrito em&lt;/td&gt;
&lt;td&gt;Erlang (exige Erlang/OTP R16B03 ou mais novo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Última versão&lt;/td&gt;
&lt;td&gt;1.8.0 (2 de março de 2023)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testes escritos como&lt;/td&gt;
&lt;td&gt;Arquivos de configuração XML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modelo de carga&lt;/td&gt;
&lt;td&gt;Novos usuários por fase de chegada (aberto)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocolos&lt;/td&gt;
&lt;td&gt;HTTP, WebDAV, XMPP, PostgreSQL, MySQL, LDAP, WebSocket, AMQP, MQTT, TCP/UDP puros (alguns experimentais)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escala&lt;/td&gt;
&lt;td&gt;Máquinas cliente via SSH sem senha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relatórios&lt;/td&gt;
&lt;td&gt;Painel ao vivo na porta 8091, relatório HTML com &lt;code&gt;tsung_stats.pl&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Quem mantém o Tsung, e ele ainda está ativo?&lt;/h2&gt;
&lt;p&gt;A ProcessOne hospeda o projeto no GitHub sob GPL-2.0. Ele é mantido, mas com pouco movimento: a última versão, 1.8.0, é de março de 2023, e desde então chegam só pull requests mescladas de vez em quando.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/processone/tsung&quot;&gt;repositório&lt;/a&gt; mostra o commit mais recente em 2 de março de 2026, uma pull request que troca chamadas obsoletas, e a &lt;a href=&quot;https://github.com/processone/tsung/releases/tag/v1.8.0&quot;&gt;tag v1.8.0&lt;/a&gt; tem data de 2 de março de 2023 (conferido em 21 de outubro de 2026). A &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/&quot;&gt;documentação&lt;/a&gt; ainda traz o título 1.7.0, então confira o repositório quando um detalhe parecer desatualizado. Um projeto calmo também significa menos respostas quando algo dá errado.&lt;/p&gt;
&lt;h2&gt;Como funciona um teste do Tsung?&lt;/h2&gt;
&lt;p&gt;Um teste é um arquivo XML com quatro partes principais: as máquinas cliente, os servidores alvo, as fases de carga e as sessões de usuário. Cada novo usuário escolhe uma sessão pela probabilidade dela e executa as requisições em ordem.&lt;/p&gt;
&lt;p&gt;Este trecho inicia cinco novos usuários por segundo durante dez minutos; cada um carrega uma lista de produtos, faz uma pausa de uns dois segundos e manda uma requisição POST para o carrinho:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;load&amp;gt;
  &amp;lt;arrivalphase phase=&amp;quot;1&amp;quot; duration=&amp;quot;10&amp;quot; unit=&amp;quot;minute&amp;quot;&amp;gt;
    &amp;lt;users arrivalrate=&amp;quot;5&amp;quot; unit=&amp;quot;second&amp;quot;/&amp;gt;
  &amp;lt;/arrivalphase&amp;gt;
&amp;lt;/load&amp;gt;
&amp;lt;sessions&amp;gt;
  &amp;lt;session name=&amp;quot;browse&amp;quot; probability=&amp;quot;100&amp;quot;
           type=&amp;quot;ts_http&amp;quot;&amp;gt;
    &amp;lt;request&amp;gt;&amp;lt;http url=&amp;quot;/products&amp;quot; method=&amp;quot;GET&amp;quot;/&amp;gt;&amp;lt;/request&amp;gt;
    &amp;lt;thinktime value=&amp;quot;2&amp;quot; random=&amp;quot;true&amp;quot;/&amp;gt;
    &amp;lt;request&amp;gt;&amp;lt;http url=&amp;quot;/cart&amp;quot; method=&amp;quot;POST&amp;quot;
                   contents=&amp;quot;sku=A-100&amp;quot;/&amp;gt;&amp;lt;/request&amp;gt;
  &amp;lt;/session&amp;gt;
&amp;lt;/sessions&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/conf-sessions.html&quot;&gt;página de sessões&lt;/a&gt; diz que as probabilidades das sessões precisam somar 100 (desde a 1.5.0 também dá para usar pesos) e que um tempo de pensamento aleatório segue uma distribuição exponencial em torno do valor, a menos que você informe uma faixa com &lt;code&gt;min&lt;/code&gt; e &lt;code&gt;max&lt;/code&gt; (conferido em 21 de outubro de 2026). Para HTTP e PostgreSQL existe um gravador proxy que transforma uma sessão de navegador ou de cliente nesse XML.&lt;/p&gt;
&lt;h2&gt;Que modelo de carga o Tsung usa?&lt;/h2&gt;
&lt;p&gt;Um modelo de carga aberto. Cada fase de chegada inicia novos usuários num intervalo ou numa taxa fixos, não importa o que os usuários já em execução estejam fazendo, e uma fase termina quando o tempo dela acaba, mesmo que as sessões não tenham terminado.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/conf-load.html&quot;&gt;página de carga&lt;/a&gt; lista os controles: &lt;code&gt;interarrival&lt;/code&gt; ou &lt;code&gt;arrivalrate&lt;/code&gt; por fase, &lt;code&gt;maxnumber&lt;/code&gt; para limitar os usuários que uma fase inicia, um &lt;code&gt;duration&lt;/code&gt; na carga inteira para parar o teste num horário fixo, e &lt;code&gt;wait_all_sessions_end&lt;/code&gt; para a fase seguinte esperar os usuários atuais terminarem (conferido em 21 de outubro de 2026). Nossos artigos sobre o &lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;modelo de carga aberto vs fechado&lt;/a&gt; e sobre o &lt;a href=&quot;https://loadtest.app/pt-br/think-time-in-load-testing/&quot;&gt;tempo de pensamento&lt;/a&gt; explicam como essas escolhas mudam o que um teste mede.&lt;/p&gt;
&lt;h2&gt;Quais protocolos o Tsung consegue testar?&lt;/h2&gt;
&lt;p&gt;Mais do que a maioria das ferramentas de teste de carga: HTTP (inclusive SOAP), WebDAV, XMPP, PostgreSQL, MySQL, LDAP, WebSocket, AMQP, MQTT e TCP, UDP ou SSL puros. A documentação marca como experimentais os plugins de MySQL, WebSocket, AMQP e MQTT, com AMQP só na 0.9.1 e MQTT só na 3.1.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/features.html&quot;&gt;página de recursos&lt;/a&gt; descreve cada plugin (conferido em 21 de outubro de 2026). Em XMPP e PostgreSQL o Tsung tem há muito tempo poucos concorrentes: ele fala o protocolo por conta própria, então você testa o servidor, não uma biblioteca cliente. Para apps em tempo real, nosso panorama de &lt;a href=&quot;https://loadtest.app/pt-br/websocket-load-testing-tools/&quot;&gt;ferramentas de teste de carga WebSocket&lt;/a&gt; coloca o Tsung ao lado de opções mais novas.&lt;/p&gt;
&lt;h2&gt;Como distribuir um teste do Tsung entre várias máquinas?&lt;/h2&gt;
&lt;p&gt;Você lista as máquinas cliente no XML, e o controlador inicia a carga nelas via SSH sem senha, ou via rsh. Cada cliente pode receber um peso, um limite de usuários e um número de CPUs.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/conf-client-server.html&quot;&gt;página de clientes e servidor&lt;/a&gt; explica que o Tsung roda uma máquina virtual Erlang por CPU declarada com &lt;code&gt;cpu&lt;/code&gt; em cada cliente (uma por padrão) e sobe uma nova quando uma VM chega a &lt;code&gt;maxusers&lt;/code&gt;. Ele também pode pegar as máquinas cliente de um agendador de lotes como PBS, LSF ou OAR. A &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/installation.html&quot;&gt;página de instalação&lt;/a&gt; pede Erlang/OTP R16B03 ou mais novo e, como opção, Perl 5 e gnuplot, ou Python e matplotlib, para os gráficos (conferido em 21 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;A LoadFocus, que publica este site, não roda arquivos do Tsung. Ela &lt;a href=&quot;https://loadfocus.com/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tsung-load-testing&quot;&gt;roda planos de teste JMeter&lt;/a&gt; e scripts k6 a partir de 25 regiões na nuvem.&lt;/p&gt;
&lt;h2&gt;Como ler os resultados do Tsung?&lt;/h2&gt;
&lt;p&gt;De duas formas: num painel ao vivo que o controlador serve na porta 8091 e num relatório HTML que o script &lt;code&gt;tsung_stats.pl&lt;/code&gt; gera depois da execução.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/reports.html&quot;&gt;página de relatórios&lt;/a&gt; diz que o painel existe desde a 1.6.0, mostra o status atual, monta os gráficos enquanto o teste roda e para quando o teste termina, a menos que você inicie o Tsung com &lt;code&gt;-k&lt;/code&gt; (conferido em 21 de outubro de 2026). O relatório cobre tempos de resposta e de conexão, transações, requisições por segundo e códigos de erro, e pode incluir dados de CPU, memória e rede dos servidores, coletados por agentes Erlang, SNMP ou munin. A documentação não descreve nenhum limite de aprovação, então um pipeline de CI precisa analisar os resultados por conta própria; nosso guia de &lt;a href=&quot;https://loadtest.app/pt-br/load-test-pass-fail-criteria/&quot;&gt;critérios de aprovação de um teste de carga&lt;/a&gt; mostra o que conferir.&lt;/p&gt;
&lt;h2&gt;O que o Tsung faz bem, e onde estão os limites?&lt;/h2&gt;
&lt;p&gt;Ele é forte em variedade de protocolos, fases de chegada abertas e muitos usuários por máquina, que a documentação coloca na casa dos milhares por CPU. Os limites são um histórico de versões com pouco movimento, scripts só em XML e nenhuma checagem de aprovação embutida.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Testes de XMPP, LDAP e banco de dados no nível do protocolo, sem escrever código cliente.&lt;/li&gt;
&lt;li&gt;Distribuição por SSH simples, sem broker nem serviço extra.&lt;/li&gt;
&lt;li&gt;Monitoramento dos servidores no mesmo relatório.&lt;/li&gt;
&lt;li&gt;Qualquer lógica além do XML exige Erlang, que poucos times escrevem.&lt;/li&gt;
&lt;li&gt;O Erlang precisa estar instalado no controlador e em cada cliente.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Quando escolher k6, Gatling ou JMeter em vez do Tsung?&lt;/h2&gt;
&lt;p&gt;Escolha outra ferramenta quando você testa HTTP ou APIs e quer um projeto ativo, com scripts numa linguagem popular.&lt;/p&gt;
&lt;p&gt;Escolha o &lt;strong&gt;k6&lt;/strong&gt; para scripts em JavaScript com &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; dentro do próprio script e um projeto ativo (conferido em 21 de outubro de 2026). Escolha o &lt;strong&gt;Gatling&lt;/strong&gt; para simulações em código na JVM; nossa &lt;a href=&quot;https://loadtest.app/pt-br/gatling-load-testing/&quot;&gt;análise do Gatling&lt;/a&gt; cobre o tema. Escolha o &lt;strong&gt;JMeter&lt;/strong&gt; quando os testadores querem uma interface gráfica ou quando você precisa de samplers JDBC, JMS ou LDAP com um grande ecossistema de plugins. A LoadFocus &lt;a href=&quot;https://loadfocus.com/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tsung-load-testing&quot;&gt;roda JMeter e k6&lt;/a&gt; a partir de 25 regiões na nuvem, e o panorama de &lt;a href=&quot;https://loadtest.app/pt-br/open-source-load-testing-tools/&quot;&gt;ferramentas de teste de carga open source&lt;/a&gt; coloca essas ferramentas lado a lado.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;O Tsung ainda é mantido?&lt;/strong&gt;
Sim, mas com pouco movimento. A última versão, 1.8.0, saiu em 2 de março de 2023, e o repositório ainda recebe de vez em quando mudanças mescladas, a mais recente em março de 2026.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quais protocolos o Tsung suporta?&lt;/strong&gt;
HTTP e SOAP, WebDAV, XMPP, PostgreSQL, LDAP e TCP, UDP ou SSL puros, além de MySQL, WebSocket, AMQP e MQTT, que a documentação marca como experimentais.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A LoadFocus consegue rodar testes do Tsung?&lt;/strong&gt;
Não. A LoadFocus roda planos de teste JMeter e scripts k6. Para distribuir um teste do Tsung entre várias máquinas, liste-as como clientes no arquivo XML.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/websocket-load-testing-tools/&quot;&gt;Ferramentas de teste de carga WebSocket: seis opções&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-source-load-testing-tools/&quot;&gt;Ferramentas de teste de carga open source: seis opções&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;Modelo de carga aberto vs fechado: qual usar e quando&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-load-testing/&quot;&gt;Teste de carga com Gatling: análise da ferramenta JVM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/nbomber-load-testing/&quot;&gt;Teste de carga com NBomber: análise do framework .NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/pgbench/&quot;&gt;pgbench: benchmark e teste de carga do PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/sysbench/&quot;&gt;Como usar o sysbench: benchmarks de CPU, disco e MySQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Pontuação Apdex: o que é e como calcular</title><link>https://loadtest.app/pt-br/apdex-score/</link><guid isPermaLink="true">https://loadtest.app/pt-br/apdex-score/</guid><description>A pontuação Apdex explicada: a fórmula, como escolher o limite T, um exemplo com números e como JMeter, Artillery e LoadFocus a calculam num teste.</description><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;Uma pontuação Apdex é um número entre 0 e 1 que diz qual parte das requisições foi rápida o bastante para quem esperava por elas. Você escolhe um tempo-alvo T: respostas até T contam inteiras, respostas até quatro vezes T contam pela metade e as mais lentas contam zero. Um resultado de 1 significa que todas as requisições atingiram o alvo, e 0 que todas foram lentas demais.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Zona&lt;/th&gt;
&lt;th&gt;Tempo de resposta&lt;/th&gt;
&lt;th&gt;Peso na pontuação&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Satisfeito (satisfied)&lt;/td&gt;
&lt;td&gt;até T&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tolerável (tolerating)&lt;/td&gt;
&lt;td&gt;acima de T, até 4T&lt;/td&gt;
&lt;td&gt;0,5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frustrado (frustrated)&lt;/td&gt;
&lt;td&gt;acima de 4T&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Os fatos abaixo vêm da documentação e do código-fonte das ferramentas, conferidos em 19 de outubro de 2026.&lt;/p&gt;
&lt;h2&gt;Como calcular uma pontuação Apdex?&lt;/h2&gt;
&lt;p&gt;Some as requisições satisfeitas com metade das toleráveis e divida pelo total. O resultado sempre fica entre 0 e 1.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Apdex(T) = (satisfied + tolerating / 2) / total
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A &lt;a href=&quot;https://docs.newrelic.com/docs/apm/new-relic-apm/apdex/apdex-measuring-user-satisfaction/&quot;&gt;documentação de Apdex da New Relic&lt;/a&gt; resolve um exemplo com T em 500 ms: de 200 requisições, 170 terminaram em até 500 ms, 20 levaram entre 500 ms e 2 segundos, e 10 falharam ou demoraram mais. Isso dá (170 + 20 / 2) / 200 = 0,90 (conferido em 19 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;Um segundo exemplo mostra por que a pontuação é útil num teste de carga. Digamos que uma execução envie 10.000 requisições com T em 300 ms: 8.200 terminam em 300 ms, 1.300 entre 300 ms e 1,2 segundo, e 500 demoram mais. O Apdex é (8.200 + 650) / 10.000 = 0,885. A mesma execução pode mostrar sem problema uma média de 280 ms, que parece boa sozinha e esconde as 500 requisições acima de um segundo.&lt;/p&gt;
&lt;h2&gt;De onde vem o Apdex?&lt;/h2&gt;
&lt;p&gt;Apdex, sigla de Application Performance Index, é um padrão aberto de um grupo de empresas chamado Apdex Alliance. Peter Sevcik, da NetForecast, fundou a Alliance em 2004.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://en.wikipedia.org/wiki/Apdex&quot;&gt;artigo da Wikipédia sobre Apdex&lt;/a&gt; cita o artigo de Sevcik de 2005 e traz a regra de 4T. O &lt;a href=&quot;https://www.apdex.org/&quot;&gt;Apdex Users Group&lt;/a&gt; diz hoje que as regras dos limites T e F &amp;quot;se tornaram flexíveis&amp;quot; (conferido em 19 de outubro de 2026), e as ferramentas usam essa liberdade.&lt;/p&gt;
&lt;h2&gt;Como JMeter, Artillery e LoadFocus calculam a pontuação?&lt;/h2&gt;
&lt;p&gt;As três partem de T = 500 ms. Elas diferem em onde termina a zona tolerável e no que fazem com as requisições com falha, então a mesma execução pode dar três valores um pouco diferentes.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ferramenta&lt;/th&gt;
&lt;th&gt;T padrão&lt;/th&gt;
&lt;th&gt;Tolerável até&lt;/th&gt;
&lt;th&gt;Requisições com falha&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Dashboard HTML do JMeter&lt;/td&gt;
&lt;td&gt;500 ms&lt;/td&gt;
&lt;td&gt;1.500 ms&lt;/td&gt;
&lt;td&gt;contam como frustradas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plugin &lt;code&gt;apdex&lt;/code&gt; do Artillery&lt;/td&gt;
&lt;td&gt;500 ms&lt;/td&gt;
&lt;td&gt;4T (2.000 ms)&lt;/td&gt;
&lt;td&gt;só respostas recebem nota&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Página de resultados da LoadFocus&lt;/td&gt;
&lt;td&gt;500 ms, fixo&lt;/td&gt;
&lt;td&gt;4T (2.000 ms)&lt;/td&gt;
&lt;td&gt;classificadas pelo tempo de resposta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New Relic APM&lt;/td&gt;
&lt;td&gt;definido por aplicação&lt;/td&gt;
&lt;td&gt;4T&lt;/td&gt;
&lt;td&gt;erros de servidor são frustrados&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;JMeter.&lt;/strong&gt; O &lt;a href=&quot;https://jmeter.apache.org/usermanual/generating-dashboard.html&quot;&gt;relatório do dashboard&lt;/a&gt; tem uma tabela APDEX por transação. Os padrões são &lt;code&gt;jmeter.reportgenerator.apdex_satisfied_threshold=500&lt;/code&gt; e &lt;code&gt;apdex_tolerated_threshold=1500&lt;/code&gt;, então a zona tolerável termina em 3T a menos que você mude, e &lt;code&gt;apdex_per_transaction&lt;/code&gt; define limites diferentes por sampler. Em &lt;a href=&quot;https://github.com/apache/jmeter/blob/master/src/core/src/main/java/org/apache/jmeter/report/processor/ApdexSummaryConsumer.java&quot;&gt;&lt;code&gt;ApdexSummaryConsumer&lt;/code&gt;&lt;/a&gt;, uma amostra com falha entra no total e nunca nas satisfeitas ou toleráveis, então cada falha derruba a pontuação (conferido em 19 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artillery.&lt;/strong&gt; O &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/apdex&quot;&gt;plugin apdex&lt;/a&gt; só funciona com o motor HTTP e publica os contadores &lt;code&gt;apdex.satisfied&lt;/code&gt;, &lt;code&gt;apdex.tolerated&lt;/code&gt; e &lt;code&gt;apdex.frustrated&lt;/code&gt;. O código em &lt;a href=&quot;https://github.com/artilleryio/artillery/tree/main/packages/artillery-plugin-apdex&quot;&gt;artillery-plugin-apdex 1.24.0&lt;/a&gt; classifica cada resposta pelo tempo total em relação a T e 4T e depois imprime a pontuação com um rótulo: excellent a partir de 0,94, good a partir de 0,85, fair a partir de 0,70, poor a partir de 0,49 e unacceptable abaixo disso. Uma requisição que nunca recebe resposta nunca é classificada (conferido em 19 de outubro de 2026). Nossa &lt;a href=&quot;https://loadtest.app/pt-br/artillery-load-testing/&quot;&gt;análise do Artillery&lt;/a&gt; trata da ferramenta em si.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A LoadFocus&lt;/strong&gt;, que publica este site, mostra a pontuação Apdex na aba Insights do resultado de um teste de carga, ao lado de um &lt;a href=&quot;https://loadfocus.com/docs/guides/load-testing/response-time-distribution?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=apdex-score&quot;&gt;histograma de tempos de resposta&lt;/a&gt;. T é fixo em 500 ms e a zona tolerável termina em 2.000 ms; não dá para mudar T. Cada amostra é classificada pelo tempo de resposta, com as partes satisfeita, tolerável e frustrada ao lado da pontuação.&lt;/p&gt;
&lt;h2&gt;Como escolher o limite T?&lt;/h2&gt;
&lt;p&gt;Escolha T pelo que os usuários daquela página ou daquele endpoint esperam, e defina por transação quando a ferramenta permitir. Um único T para a aplicação inteira mistura um endpoint de busca rápido e uma exportação de relatório lenta num número só.&lt;/p&gt;
&lt;p&gt;Algumas regras práticas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Comece de uma meta real.&lt;/strong&gt; Se você já tem uma meta de latência como &amp;quot;95% das chamadas de checkout abaixo de 400 ms&amp;quot;, T = 400 ms faz o Apdex e a meta contarem a mesma história.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mantenha o mesmo T entre execuções.&lt;/strong&gt; Um Apdex só se compara com outro medido no mesmo T. Escreva Apdex(0.4) ou &amp;quot;Apdex com T = 400 ms&amp;quot; para ninguém comparar limites diferentes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ajuste também a zona tolerável.&lt;/strong&gt; O padrão do JMeter para em 3T e os outros em 4T. Antes de comparar um relatório do JMeter com outra ferramenta, coloque &lt;code&gt;apdex_tolerated_threshold&lt;/code&gt; em quatro vezes T.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Não mexa em T para uma versão passar.&lt;/strong&gt; Mudar T depois de uma execução ruim troca a régua, e a tendência que você acompanhava se perde.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;O que é uma boa pontuação Apdex?&lt;/h2&gt;
&lt;p&gt;O plugin do Artillery chama de &lt;code&gt;excellent&lt;/code&gt; 0,94 ou mais, de &lt;code&gt;good&lt;/code&gt; 0,85 a 0,94 e de &lt;code&gt;poor&lt;/code&gt; ou pior tudo abaixo de 0,70. Esses rótulos só significam algo se T foi escolhido com honestidade.&lt;/p&gt;
&lt;p&gt;Um Apdex de 0,95 com T = 2 segundos pode descrever um serviço mais lento que 0,80 com T = 200 ms. Ao definir um critério para liberar uma versão, escreva o limite e a pontuação juntos (&amp;quot;Apdex(0.5) de pelo menos 0,9&amp;quot;) e confira ao lado de um limite de percentil, porque os dois pegam problemas diferentes.&lt;/p&gt;
&lt;h2&gt;O que o Apdex esconde?&lt;/h2&gt;
&lt;p&gt;Ele espreme toda a distribuição de tempos de resposta em três faixas, então não diz quão lentas foram as requisições frustradas. Uma requisição de 2,1 segundos e outra de 30 segundos baixam a pontuação exatamente o mesmo tanto.&lt;/p&gt;
&lt;p&gt;Por isso ele funciona melhor ao lado de outros números:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Percentis&lt;/strong&gt; mostram quão lentas são as requisições lentas. Nosso guia sobre &lt;a href=&quot;https://loadtest.app/pt-br/tail-latency/&quot;&gt;latência de cauda&lt;/a&gt; explica por que o percentil 99 importa assim que uma página chama vários serviços.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A taxa de erros&lt;/strong&gt; pega falhas que sua ferramenta talvez não pontue. O Artillery nunca pontua requisições sem resposta e a New Relic conta erros de servidor como frustrados, então leia o número de erros à parte.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;O tamanho da amostra&lt;/strong&gt; importa: a New Relic avisa que abaixo de umas 100 requisições por minuto a pontuação fica instável.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;O viés de medição&lt;/strong&gt; também pesa. Um gerador de carga que espera as respostas lentas envia menos requisições nos períodos lentos, e o Apdex parece melhor que a realidade; veja &lt;a href=&quot;https://loadtest.app/pt-br/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Como usar o Apdex num teste de carga?&lt;/h2&gt;
&lt;p&gt;Use como resumo para quem não vai ler um histograma, e deixe a decisão de aprovar ou reprovar com limites explícitos.&lt;/p&gt;
&lt;p&gt;Uma rotina que funciona:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Defina T por transação importante a partir da sua meta de latência.&lt;/li&gt;
&lt;li&gt;Rode o teste e anote o Apdex nesse T, junto com os percentis 95 e 99 e a taxa de erros.&lt;/li&gt;
&lt;li&gt;Compare o Apdex com a execução anterior no mesmo T. Uma queda de 0,93 para 0,86 é um sinal claro até para quem é de fora do time.&lt;/li&gt;
&lt;li&gt;Faça o build falhar por limites de percentil e de erros, como descreve nosso guia de &lt;a href=&quot;https://loadtest.app/pt-br/load-test-pass-fail-criteria/&quot;&gt;critérios de aprovação de um teste de carga&lt;/a&gt;, e reporte o Apdex ao lado.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Uma pontuação Apdex mais alta é melhor?&lt;/strong&gt;
Sim. 1,0 significa que todas as requisições terminaram dentro de T, e 0 que todas passaram do limite tolerável ou contaram como frustradas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qual é o limite Apdex padrão no JMeter?&lt;/strong&gt;
O dashboard HTML usa 500 ms para satisfeito e 1.500 ms para tolerável. Mude com &lt;code&gt;jmeter.reportgenerator.apdex_satisfied_threshold&lt;/code&gt; e &lt;code&gt;apdex_tolerated_threshold&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O Apdex inclui os erros?&lt;/strong&gt;
Depende da ferramenta. O JMeter conta amostras com falha como frustradas e a New Relic faz o mesmo com erros de servidor, enquanto o plugin do Artillery só pontua requisições que receberam resposta.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dá para comparar pontuações Apdex de duas ferramentas?&lt;/strong&gt;
Só quando T, o limite tolerável e o tratamento de erros coincidem. Caso contrário, compare os percentis e as taxas de erros que estão por trás.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/tail-latency/&quot;&gt;Latência de cauda: o que é e como medir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/load-test-pass-fail-criteria/&quot;&gt;Critérios de aprovação de um teste de carga: como definir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/coordinated-omission/&quot;&gt;Coordinated omission: o que é e como evitar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/throughput-vs-latency/&quot;&gt;Vazão vs latência: como se relacionam sob carga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/artillery-load-testing/&quot;&gt;Teste de carga com Artillery: análise da ferramenta Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/slo-vs-sla/&quot;&gt;SLO vs SLA: a diferença, os SLIs e o orçamento de erros&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Teste de carga com Artillery: análise da ferramenta Node.js</title><link>https://loadtest.app/pt-br/artillery-load-testing/</link><guid isPermaLink="true">https://loadtest.app/pt-br/artillery-load-testing/</guid><description>Teste de carga com Artillery: scripts YAML e TypeScript, fases de chegada, Playwright, checagens ensure, execuções na AWS e no Azure e preços.</description><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, que vende um serviço de teste de carga abordado neste artigo.&lt;/p&gt;&lt;p&gt;O Artillery é uma ferramenta de teste de carga open source que roda em Node.js e descreve cada teste num arquivo YAML, TypeScript ou JavaScript. O teste de carga com Artillery combina com times que vivem no ecossistema JavaScript, que querem novos usuários chegando num ritmo definido ou que querem testes de navegador com Playwright na mesma ferramenta. Times que querem um binário único sem runtime ficam mais bem servidos com o k6, e times que precisam de muitos protocolos de fábrica, com o JMeter.&lt;/p&gt;
&lt;p&gt;Não rodamos o Artillery para esta análise. Os fatos vêm da documentação, do repositório, do pacote no npm e da página de preços do Artillery, conferidos em 19 de outubro de 2026, e as avaliações são nossas.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tópico&lt;/th&gt;
&lt;th&gt;Artillery&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licença&lt;/td&gt;
&lt;td&gt;MPL-2.0; alguns módulos do Azure sob BSL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;Node.js, LTS mais recente (o pacote pede 22.18.0 ou mais novo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versão atual&lt;/td&gt;
&lt;td&gt;2.0.34 (14 de agosto de 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testes escritos em&lt;/td&gt;
&lt;td&gt;YAML, TypeScript ou JavaScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modelo de carga&lt;/td&gt;
&lt;td&gt;Novos usuários virtuais por segundo, em fases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Motores embutidos&lt;/td&gt;
&lt;td&gt;HTTP, WebSocket, Socket.IO, Playwright&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checagens de aprovação&lt;/td&gt;
&lt;td&gt;Plugin &lt;code&gt;ensure&lt;/code&gt;, código de saída diferente de zero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escala&lt;/td&gt;
&lt;td&gt;&lt;code&gt;run-lambda&lt;/code&gt;, &lt;code&gt;run-fargate&lt;/code&gt;, &lt;code&gt;run-aci&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relatórios hospedados&lt;/td&gt;
&lt;td&gt;Artillery Cloud, opcional, com plano gratuito&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Quem desenvolve o Artillery, e qual é a licença?&lt;/h2&gt;
&lt;p&gt;A Artillery Software Inc. mantém o projeto no GitHub. A maior parte do código está sob MPL-2.0, que permite uso comercial; alguns módulos específicos do Azure estão sob a Business Source License.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/artilleryio/artillery&quot;&gt;README do repositório&lt;/a&gt; permite usar o Artillery no Azure para avaliação e prova de conceito, e exige licença comercial para uso comercial ou em produção ali. A versão mais recente é a &lt;a href=&quot;https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.34&quot;&gt;2.0.34&lt;/a&gt;, publicada no npm em 14 de agosto de 2026, e os metadados do pacote pedem Node.js 22.18.0 ou mais novo; o &lt;a href=&quot;https://www.artillery.io/docs/get-started/get-artillery&quot;&gt;guia de instalação&lt;/a&gt; recomenda a LTS mais recente (conferido em 19 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Como funciona um script de teste do Artillery?&lt;/h2&gt;
&lt;p&gt;Um script tem duas partes: &lt;code&gt;config&lt;/code&gt;, que define o alvo, as fases de carga e os plugins, e &lt;code&gt;scenarios&lt;/code&gt;, que lista o que cada usuário virtual faz. Você pode escrever em YAML ou exportar &lt;code&gt;config&lt;/code&gt; e &lt;code&gt;scenarios&lt;/code&gt; de um arquivo TypeScript ou JavaScript.&lt;/p&gt;
&lt;p&gt;Este teste sobe de 5 para 50 novos usuários por segundo em dois minutos, mantém 50 por segundo por dez minutos e falha se o percentil 99 do tempo de resposta chegar a 800 ms:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;config:
  target: https://staging.example.com
  phases:
    - duration: 120
      arrivalRate: 5
      rampTo: 50
      name: ramp
    - duration: 600
      arrivalRate: 50
      name: sustain
  plugins:
    ensure:
      thresholds:
        - http.response_time.p99: 800
scenarios:
  - name: browse and add to cart
    flow:
      - get:
          url: /products
      - think: 2
      - post:
          url: /cart
          json:
            sku: A-100
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Segundo a &lt;a href=&quot;https://www.artillery.io/docs/reference/test-script&quot;&gt;referência de scripts de teste&lt;/a&gt;, os quatro tipos de fase são uma taxa de chegada constante, uma rampa linear com &lt;code&gt;rampTo&lt;/code&gt;, um &lt;code&gt;arrivalCount&lt;/code&gt; fixo distribuído num período e uma &lt;code&gt;pause&lt;/code&gt;. O código próprio carregado por &lt;code&gt;config.processor&lt;/code&gt; pode ser um módulo TypeScript localmente e no Fargate, mas não no Lambda (conferido em 19 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Que modelo de carga o Artillery usa?&lt;/h2&gt;
&lt;p&gt;O Artillery inicia novos usuários virtuais no ritmo que você define, tenham os anteriores terminado ou não. É um modelo de carga aberto, que mantém as chegadas mesmo quando o sistema fica lento.&lt;/p&gt;
&lt;p&gt;Cada novo usuário escolhe um cenário, roda e vai embora, então um sistema lento acumula usuários como o tráfego real faria. &lt;code&gt;maxVusers&lt;/code&gt; limita o número de usuários simultâneos numa fase se você precisar proteger o gerador de carga. Nosso artigo sobre o &lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;modelo de carga aberto vs fechado&lt;/a&gt; explica a diferença, e a &lt;a href=&quot;https://loadtest.app/pt-br/littles-law-load-testing/&quot;&gt;lei de Little&lt;/a&gt; mostra como a taxa de chegada e o tempo de resposta definem o número de usuários simultâneos.&lt;/p&gt;
&lt;h2&gt;Quais protocolos e navegadores ele testa?&lt;/h2&gt;
&lt;p&gt;HTTP é o padrão, e WebSocket, Socket.IO e Playwright vêm embutidos. gRPC e AWS Kinesis precisam de motores instalados à parte.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://www.artillery.io/docs/reference/engines&quot;&gt;página de motores&lt;/a&gt; descreve o modelo: cada cenário roda num motor, e você pode escrever o seu. No npm, o &lt;code&gt;artillery-engine-grpc&lt;/code&gt; está na 0.0.9 e o &lt;code&gt;artillery-engine-kinesis&lt;/code&gt; na 1.1.1, ambos sob MPL-2.0. O &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/playwright&quot;&gt;motor Playwright&lt;/a&gt; roda seu código Playwright em navegadores headless reais e publica Web Vitals como TTFB, FCP e LCP por página. A documentação avisa que um navegador separado por usuário, em vez de um contexto de navegador, exige muito mais CPU e memória (conferido em 19 de outubro de 2026). Nosso panorama de &lt;a href=&quot;https://loadtest.app/pt-br/websocket-load-testing-tools/&quot;&gt;ferramentas de teste de carga WebSocket&lt;/a&gt; coloca o Artillery ao lado de outras opções para apps em tempo real.&lt;/p&gt;
&lt;h2&gt;Como ele se encaixa na CI?&lt;/h2&gt;
&lt;p&gt;O plugin &lt;code&gt;ensure&lt;/code&gt; transforma métricas em checagens de aprovação, e uma checagem que falha faz o Artillery sair com código diferente de zero. Isso basta para qualquer sistema de CI reprovar o build.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/ensure&quot;&gt;referência do ensure&lt;/a&gt; oferece dois tipos de checagem: &lt;code&gt;thresholds&lt;/code&gt;, em que uma métrica precisa ficar abaixo de um valor, e &lt;code&gt;conditions&lt;/code&gt;, que combinam métricas numa expressão como &lt;code&gt;http.response_time.p95 &amp;lt; 250 and http.request_rate &amp;gt; 1000&lt;/code&gt;. Uma condição marcada com &lt;code&gt;strict: false&lt;/code&gt; só avisa, sem reprovar. O &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/apdex&quot;&gt;plugin apdex&lt;/a&gt; acrescenta uma pontuação Apdex aos testes HTTP, com limite padrão de 500 ms (conferido em 19 de outubro de 2026); nosso artigo sobre a &lt;a href=&quot;https://loadtest.app/pt-br/apdex-score/&quot;&gt;pontuação Apdex&lt;/a&gt; explica como ler esse número. Para um arquivo de workflow, veja nosso guia de &lt;a href=&quot;https://loadtest.app/pt-br/load-testing-in-github-actions/&quot;&gt;teste de carga no GitHub Actions&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Como escalar um teste do Artillery?&lt;/h2&gt;
&lt;p&gt;Pela linha de comando, na sua própria conta de nuvem: &lt;code&gt;run-lambda&lt;/code&gt; e &lt;code&gt;run-fargate&lt;/code&gt; na AWS, &lt;code&gt;run-aci&lt;/code&gt; no Azure Container Instances. O Artillery cria os recursos de que a execução precisa e remove os temporários depois.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/aws-fargate&quot;&gt;guia do Fargate&lt;/a&gt; lista os recursos e as permissões de IAM envolvidos. O &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/aws-lambda&quot;&gt;guia do Lambda&lt;/a&gt; informa os limites: um teste não pode passar de 15 minutos, um teste em andamento não pode ser parado, e os hooks &lt;code&gt;before&lt;/code&gt; e &lt;code&gt;after&lt;/code&gt; rodam uma vez por worker. O &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/azure-aci&quot;&gt;guia do Azure&lt;/a&gt; exige o Artillery 2.0.19 ou mais novo e, fora de avaliação, uma assinatura (conferido em 19 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;A LoadFocus, que publica este site, não roda scripts do Artillery. Ela &lt;a href=&quot;https://loadfocus.com/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=artillery-load-testing&quot;&gt;roda planos de teste JMeter e scripts k6&lt;/a&gt; a partir de 25 regiões na nuvem, então para o Artillery os comandos acima são o caminho para escalar.&lt;/p&gt;
&lt;h2&gt;Quanto custa o Artillery Cloud?&lt;/h2&gt;
&lt;p&gt;O dashboard é opcional: os resultados só vão para ele quando você roda com &lt;code&gt;--record&lt;/code&gt; e uma chave de API. Os planos vão de um nível gratuito a US$ 499 por mês.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://www.artillery.io/pricing&quot;&gt;página de preços&lt;/a&gt; lista (conferido em 19 de outubro de 2026):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Free:&lt;/strong&gt; 30 relatórios por mês, 1 mês de retenção, 2 membros, testes distribuídos com até 5 workers e 30 minutos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Team, US$ 199 por mês:&lt;/strong&gt; 1.000 relatórios, 6 meses, 8 membros, até 25 workers e 2 horas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Business, US$ 499 por mês:&lt;/strong&gt; 2.500 relatórios, 18 meses, sem limite de membros, workers ou duração.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SSO corporativo, logs de auditoria e SLAs de suporte começam em US$ 1.199 por mês, e o faturamento anual economiza 20%.&lt;/p&gt;
&lt;h2&gt;O que o Artillery faz bem, e onde estão os limites?&lt;/h2&gt;
&lt;p&gt;Ele é forte em carga por taxa de chegada, scripts curtos e legíveis e testes de navegador com Playwright. É mais fraco quando você precisa de um binário único, de muitos protocolos sem complementos ou de usar o Azure sem licença.&lt;/p&gt;
&lt;p&gt;Como ferramenta Node.js, ele pode usar qualquer módulo do npm em funções próprias, ao custo de mais um runtime em cada máquina de teste. Limites que a própria documentação aponta:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Execuções no Lambda param aos 15 minutos e não podem ser canceladas.&lt;/li&gt;
&lt;li&gt;Código próprio em TypeScript (&lt;code&gt;config.processor&lt;/code&gt;) não roda no Lambda.&lt;/li&gt;
&lt;li&gt;gRPC e Kinesis são motores separados.&lt;/li&gt;
&lt;li&gt;Uso em produção no Azure exige licença comercial.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Quando escolher k6, JMeter ou Locust em vez do Artillery?&lt;/h2&gt;
&lt;p&gt;Escolha outra ferramenta quando o runtime, os protocolos ou a linguagem dela combinarem mais com o seu time.&lt;/p&gt;
&lt;p&gt;Escolha o &lt;strong&gt;k6&lt;/strong&gt; quando quiser um binário Go sem Node.js para manter e thresholds no script. Nossa comparação &lt;a href=&quot;https://loadtest.app/pt-br/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt; coloca os dois lado a lado. A LoadFocus &lt;a href=&quot;https://loadfocus.com/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=artillery-load-testing&quot;&gt;roda scripts k6&lt;/a&gt; a partir de 25 regiões na nuvem, mas executa cenários arrival-rate com um número fixo de usuários; para manter uma taxa de chegada, rode-os com o próprio k6.&lt;/p&gt;
&lt;p&gt;Escolha o &lt;strong&gt;JMeter&lt;/strong&gt; quando precisar de JDBC, JMS, LDAP ou FTP de fábrica, ou quando seus testadores montarem testes numa interface gráfica.&lt;/p&gt;
&lt;p&gt;Escolha o &lt;strong&gt;Locust&lt;/strong&gt; quando o seu time escrever Python; nossa &lt;a href=&quot;https://loadtest.app/pt-br/locust-load-testing/&quot;&gt;análise do Locust&lt;/a&gt; trata dele. O panorama de &lt;a href=&quot;https://loadtest.app/pt-br/open-source-load-testing-tools/&quot;&gt;ferramentas de teste de carga open source&lt;/a&gt; coloca todas lado a lado.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;O Artillery é gratuito para uso comercial?&lt;/strong&gt;
A CLI é quase toda MPL-2.0, que permite uso comercial. A exceção é o Azure: uso comercial ou em produção dos módulos do Azure exige licença comercial.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O Artillery roda testes de navegador?&lt;/strong&gt;
Sim. O motor Playwright embutido roda seu código Playwright em navegadores headless e publica Web Vitals de cada página.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A LoadFocus roda scripts do Artillery?&lt;/strong&gt;
Não. A LoadFocus roda planos de teste JMeter e scripts k6. Para escalar um teste do Artillery, use &lt;code&gt;run-lambda&lt;/code&gt;, &lt;code&gt;run-fargate&lt;/code&gt; ou &lt;code&gt;run-aci&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/k6-vs-artillery/&quot;&gt;k6 vs Artillery: qual ferramenta de teste de carga escolher&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-source-load-testing-tools/&quot;&gt;Ferramentas de teste de carga open source: seis opções&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;Modelo de carga aberto vs fechado: qual usar e quando&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/websocket-load-testing-tools/&quot;&gt;Ferramentas de teste de carga WebSocket: seis opções&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/apdex-score/&quot;&gt;Pontuação Apdex: o que é e como calcular&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Azure Load Testing: análise do serviço da Microsoft</title><link>https://loadtest.app/pt-br/azure-load-testing/</link><guid isPermaLink="true">https://loadtest.app/pt-br/azure-load-testing/</guid><description>Análise do Azure Load Testing: testes JMeter e Locust, testes rápidos por URL, engines e limites, regiões, endpoints privados, preço por VUH e CI.</description><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, que vende um serviço de teste de carga abordado neste artigo.&lt;/p&gt;&lt;p&gt;O Azure Load Testing é o serviço gerenciado da Microsoft para rodar testes JMeter e Locust em grande escala a partir do Azure, cobrado por hora de usuário virtual. Ele se encaixa bem quando o sistema testado roda no Azure, porque consegue puxar métricas de servidor do Azure Monitor e alcançar endpoints privados dentro de uma rede virtual. Times que escrevem scripts k6, não têm assinatura do Azure ou testam de fora das regiões do Azure vão achar outros serviços mais simples.&lt;/p&gt;
&lt;p&gt;Não rodamos o Azure Load Testing para esta análise. Os fatos vêm da documentação e da página de preços da Microsoft, conferidas em 19 de outubro de 2026, e as avaliações são nossas.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tópico&lt;/th&gt;
&lt;th&gt;Azure Load Testing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Tipo&lt;/td&gt;
&lt;td&gt;Serviço gerenciado no hub Azure App Testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frameworks de teste&lt;/td&gt;
&lt;td&gt;Só Apache JMeter e Locust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opção sem código&lt;/td&gt;
&lt;td&gt;Teste rápido por URL, até cinco requisições HTTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escala por execução&lt;/td&gt;
&lt;td&gt;Até 400 instâncias de engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Teste mais longo&lt;/td&gt;
&lt;td&gt;24 horas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Origem da carga&lt;/td&gt;
&lt;td&gt;A região do recurso, ou até 5 regiões&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Endpoints privados&lt;/td&gt;
&lt;td&gt;Sim, por injeção em rede virtual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preço&lt;/td&gt;
&lt;td&gt;US$ 0,15 por hora de usuário virtual, US$ 0,06 após 10.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retenção&lt;/td&gt;
&lt;td&gt;6 meses; métricas de cliente 365 dias&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;O que é o Azure Load Testing?&lt;/h2&gt;
&lt;p&gt;É um serviço totalmente gerenciado que roda seu teste de carga nas engines de teste da Microsoft, então você nunca monta nem atualiza geradores de carga. Você cria um recurso de teste de carga numa região do Azure, adiciona testes a ele e dispara execuções pelo portal, pela Azure CLI ou por um pipeline.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/overview-what-is-azure-load-testing&quot;&gt;página de visão geral&lt;/a&gt; diz que a aplicação testada pode estar em qualquer lugar: no Azure, on-premises ou em outra nuvem. A Microsoft agora lista o serviço dentro do hub Azure App Testing, ao lado do Playwright Workspaces; o &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/quickstart-create-run-load-test-with-locust&quot;&gt;início rápido de Locust&lt;/a&gt; cria o recurso a partir desse hub (conferido em 19 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Quais tipos de teste e ferramentas ele aceita?&lt;/h2&gt;
&lt;p&gt;Três caminhos: um teste rápido por URL, um script JMeter enviado ou um script Locust enviado. A documentação diz claramente que nenhum outro framework de teste é suportado.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/quickstart-create-and-run-load-test&quot;&gt;teste rápido&lt;/a&gt; aceita até cinco requisições HTTP e uma meta de usuários virtuais ou de requisições por segundo. Cada engine aguenta até 250 usuários virtuais, então 400 usuários rodam em duas engines com 200 cada.&lt;/p&gt;
&lt;p&gt;Com &lt;strong&gt;JMeter&lt;/strong&gt;, você pode usar plugins do jmeter-plugins.org ou enviar os seus, e a visão geral afirma que funciona qualquer protocolo que o JMeter suporta, como uma conexão com banco de dados ou uma fila de mensagens. Com &lt;strong&gt;Locust&lt;/strong&gt;, você pode adicionar plugins do Locust e outras bibliotecas Python. A própria documentação do Locust aponta o serviço como sua &lt;a href=&quot;https://docs.locust.io/en/stable/hosted-load-testing.html&quot;&gt;opção hospedada&lt;/a&gt;, e nossa &lt;a href=&quot;https://loadtest.app/pt-br/locust-load-testing/&quot;&gt;análise do Locust&lt;/a&gt; trata da ferramenta em si. Scripts k6, Gatling e Artillery não rodam aqui (conferido em 19 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Como funcionam engines, usuários virtuais e limites?&lt;/h2&gt;
&lt;p&gt;Você escala um teste adicionando instâncias de engine. No JMeter, a carga total é o número de usuários do plano de teste multiplicado pelo número de engines; no Locust, você define o total de usuários e escolhe quantas engines os geram.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/concept-load-testing-concepts&quot;&gt;página de conceitos&lt;/a&gt; traz as duas fórmulas, e a &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/resource-limits-quotas-capacity&quot;&gt;página de limites do serviço&lt;/a&gt; define os tetos por região e assinatura (conferido em 19 de outubro de 2026):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Instâncias de engine por execução: de 1 a 400 por padrão conforme a oferta, no máximo 400.&lt;/li&gt;
&lt;li&gt;Instâncias de engine simultâneas: de 5 a 400 por padrão, até 1.000 sob pedido.&lt;/li&gt;
&lt;li&gt;Duração do teste: de 3 a 24 horas por padrão, no máximo 24 horas.&lt;/li&gt;
&lt;li&gt;Critérios de falha: até 50 por teste.&lt;/li&gt;
&lt;li&gt;Retenção: métricas de servidor 90 dias, métricas de cliente 365 dias, resultados e logs 6 meses.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Subir um limite padrão exige um chamado ao suporte; nada passa dos máximos indicados.&lt;/p&gt;
&lt;h2&gt;Ele testa endpoints privados e gera carga de várias regiões?&lt;/h2&gt;
&lt;p&gt;Sim para as duas coisas, com uma ressalva: elas não se combinam. Carga de várias regiões só funciona contra endpoints públicos.&lt;/p&gt;
&lt;p&gt;Por padrão, as engines rodam na região do seu recurso de teste de carga. O &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-generate-load-from-multiple-regions&quot;&gt;guia de várias regiões&lt;/a&gt; deixa escolher até 5 regiões por teste e dividir a carga entre elas, e com isso muda o teste para tráfego público. Para serviços sem endpoint público, a &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-test-private-endpoint&quot;&gt;injeção em rede virtual&lt;/a&gt; coloca as engines dentro da rede onde está a aplicação (conferido em 19 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;O que mostram os resultados e as métricas de servidor?&lt;/h2&gt;
&lt;p&gt;O dashboard mostra ao vivo, durante a execução, as métricas do lado do cliente, como usuários virtuais, tempo de resposta e requisições por segundo. Para apps hospedados no Azure, ele soma métricas do lado do servidor do Azure Monitor, do Application Insights e do Container Insights na mesma linha do tempo.&lt;/p&gt;
&lt;p&gt;Essa combinação é a maior vantagem do serviço: você vê o banco de dados ou o contêiner que satura no momento em que os tempos de resposta sobem, sem montar um dashboard separado. O &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-monitor-server-side-metrics&quot;&gt;guia de métricas de servidor&lt;/a&gt; descreve os passos. Execuções anteriores ficam comparáveis lado a lado, e dá para baixar os resultados para outras ferramentas.&lt;/p&gt;
&lt;h2&gt;Como funcionam os critérios de aprovação e a CI?&lt;/h2&gt;
&lt;p&gt;Você define critérios de falha sobre métricas de cliente ou de servidor, e a execução é marcada como falha assim que algum deles é violado. Pipelines no Azure DevOps, no GitHub Actions ou em qualquer ferramenta de CI que consiga chamar a Azure CLI podem iniciar um teste e decidir com base nesse resultado.&lt;/p&gt;
&lt;p&gt;Segundo o &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-define-test-criteria&quot;&gt;guia de critérios de falha&lt;/a&gt;, um critério é um agregado de uma métrica de cliente, como tempo médio de resposta ou porcentagem de erros, comparado com um limite, seja para o teste inteiro ou para uma requisição nomeada. Métricas de servidor exigem que a identidade gerenciada do recurso possa lê-las. A parada automática encerra uma execução quando a taxa de erros passa de um limite, para que uma URL errada não continue custando. O &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-configure-load-test-cicd&quot;&gt;guia de CI/CD&lt;/a&gt; cobre GitHub Actions e Azure Pipelines (conferido em 19 de outubro de 2026). Nosso guia de &lt;a href=&quot;https://loadtest.app/pt-br/load-test-pass-fail-criteria/&quot;&gt;critérios de aprovação de um teste de carga&lt;/a&gt; explica como escolher os limites.&lt;/p&gt;
&lt;h2&gt;Quanto custa o Azure Load Testing?&lt;/h2&gt;
&lt;p&gt;Você paga por hora de usuário virtual (VUH): US$ 0,15 por VUH nas primeiras 10.000 e US$ 0,06 por VUH depois disso, igual em todas as regiões da página de preços. Desde 1º de março de 2026 há também uma cobrança mínima por execução.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://azure.microsoft.com/en-us/pricing/details/load-testing/&quot;&gt;página de preços&lt;/a&gt; define uma VUH como usuários virtuais vezes minutos, dividido por 60, contado a cada 10 segundos; 1.000 usuários por 30 minutos dão 500 VUH, ou US$ 75 no preço da primeira faixa. O mínimo é de 10 usuários virtuais por engine durante toda a execução, com pelo menos 10 minutos. Uma execução de 3 horas com 5 usuários numa engine é cobrada, portanto, como 30 VUH, e não 15 (conferido em 19 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Quando escolher outra coisa?&lt;/h2&gt;
&lt;p&gt;Escolha outra opção quando seus scripts, sua nuvem ou seu orçamento apontarem para outro lado.&lt;/p&gt;
&lt;p&gt;Nosso panorama de &lt;a href=&quot;https://loadtest.app/pt-br/open-source-load-testing-tools/&quot;&gt;ferramentas de teste de carga open source&lt;/a&gt; cobre as ferramentas que você pode rodar por conta própria.&lt;/p&gt;
&lt;p&gt;Escolha a &lt;strong&gt;LoadFocus&lt;/strong&gt;, que publica este site, quando quiser rodar &lt;a href=&quot;https://loadfocus.com/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=azure-load-testing&quot;&gt;planos de teste JMeter e scripts k6&lt;/a&gt; a partir de 25 regiões na nuvem sem assinatura do Azure. Ela não roda Locust e executa cenários arrival-rate do k6 com um número fixo de usuários.&lt;/p&gt;
&lt;p&gt;Escolha o &lt;strong&gt;Grafana Cloud k6&lt;/strong&gt; ou o &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt; quando seus testes forem escritos para o k6, que o Azure Load Testing não roda (conferido em 19 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;Escolha o &lt;strong&gt;Locust na sua própria infraestrutura&lt;/strong&gt; quando você já tiver Kubernetes ou máquinas livres: o &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;modo distribuído&lt;/a&gt; dele é gratuito, e você paga só o hardware.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;O Azure Load Testing suporta k6?&lt;/strong&gt;
Não. Ele roda testes Apache JMeter e Locust, além de testes rápidos por URL que ele mesmo transforma em script. Scripts k6 precisam de outro serviço ou da sua própria infraestrutura.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Posso usar o Azure Load Testing com uma aplicação que não está no Azure?&lt;/strong&gt;
Sim. As engines de teste podem mirar qualquer endpoint público. Métricas de servidor só são coletadas para recursos do Azure, então em outra hospedagem você lê as métricas de servidor no seu próprio monitoramento.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Existe um plano gratuito?&lt;/strong&gt;
A página de preços mostra só preços por hora para teste de carga, com um mínimo por execução. Contas novas do Azure ganham um crédito de US$ 200 para os primeiros 30 dias, segundo a mesma página.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/locust-load-testing/&quot;&gt;Teste de carga com Locust: análise da ferramenta Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-source-load-testing-tools/&quot;&gt;Ferramentas de teste de carga open source: seis opções&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/load-test-pass-fail-criteria/&quot;&gt;Critérios de aprovação de um teste de carga: como definir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/locust-vs-jmeter/&quot;&gt;Locust vs JMeter: scripts Python ou planos do JMeter?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/load-testing-in-github-actions/&quot;&gt;Teste de carga no GitHub Actions: guia prático&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Latência de cauda: o que é e como medir</title><link>https://loadtest.app/pt-br/tail-latency/</link><guid isPermaLink="true">https://loadtest.app/pt-br/tail-latency/</guid><description>Latência de cauda explicada: por que o 1% mais lento das requisições importa, como o fan-out a agrava, as causas e como medir o p99 num teste de carga.</description><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;Latência de cauda é o tempo de resposta das poucas requisições mais lentas, normalmente informado como percentil 99 ou 99,9. Ela importa porque uma ação do usuário costuma esperar por muitas requisições, então um atraso que atinge 1 requisição em cada 100 pode chegar à maioria dos seus usuários. Um teste de carga que mostra só a média ou a mediana não revela isso.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Chamadas ao backend por página&lt;/th&gt;
&lt;th&gt;Parte das páginas com pelo menos uma chamada lenta (1 em 100)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1,0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;4,9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;9,6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;18,2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;39,5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;63,4%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;A tabela supõe que cada chamada é lenta com 1% de chance, de forma independente das outras: a parte é &lt;code&gt;1 - 0.99^n&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;O que conta como cauda?&lt;/h2&gt;
&lt;p&gt;A cauda é a parte da distribuição de tempos de resposta acima de um percentil alto, quase sempre p99 e p99,9. A mediana descreve uma requisição típica, e a cauda descreve as requisições de que as pessoas reclamam.&lt;/p&gt;
&lt;p&gt;Um percentil é um corte: p99 = 800 ms quer dizer que 99% das requisições levaram 800 ms ou menos e 1% levou mais. Num histograma de tempos de resposta, a cauda fica à direita desse corte, muitas vezes como um trecho longo e fino longe do pico principal. Nosso guia de &lt;a href=&quot;https://loadtest.app/pt-br/throughput-vs-latency/&quot;&gt;vazão vs latência&lt;/a&gt; explica como as ferramentas de teste de carga medem latência e percentis.&lt;/p&gt;
&lt;h2&gt;Por que a latência de cauda importa tanto?&lt;/h2&gt;
&lt;p&gt;Porque as requisições se multiplicam. Uma página ou chamada de API que se espalha por muitos serviços só termina quando o mais lento responde, e assim a cauda de cada serviço vira a experiência típica do todo.&lt;/p&gt;
&lt;p&gt;A referência é &amp;quot;The Tail at Scale&amp;quot;, de Jeffrey Dean e Luiz André Barroso, publicado na Communications of the ACM em 2013 (&lt;a href=&quot;https://www.barroso.org/publications/TheTailAtScale.pdf&quot;&gt;PDF do artigo&lt;/a&gt;, conferido em 19 de outubro de 2026). O exemplo deles: um servidor que costuma responder em 10 ms mas leva um segundo no percentil 99. Se uma requisição toca um servidor desses, 1 em cada 100 requisições de usuário é lenta. Se ela precisa juntar respostas de 100 deles em paralelo, 63% das requisições de usuário levam mais de um segundo. Mesmo com só 1 chamada lenta em 10.000, um serviço com 2.000 servidores vê quase 1 em cada 5 requisições acima de um segundo.&lt;/p&gt;
&lt;p&gt;Eles também relatam medições de um serviço real do Google: o percentil 99 de uma única requisição folha era de 10 ms, mas chegava a 140 ms até todas as requisições folha terminarem, e esperar pelos 5% mais lentos respondia por metade disso.&lt;/p&gt;
&lt;h2&gt;O que causa a latência de cauda?&lt;/h2&gt;
&lt;p&gt;Na maior parte, interferência de outro trabalho na máquina ou na rede. A mesma requisição é rápida quase sempre e lenta quando outra coisa está acontecendo.&lt;/p&gt;
&lt;p&gt;Dean e Barroso listam os suspeitos de sempre:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Recursos compartilhados:&lt;/strong&gt; outro trabalho na mesma máquina disputando núcleos de CPU, caches do processador, banda de memória ou de rede.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Daemons em segundo plano&lt;/strong&gt; que acordam e pegam uma fatia da máquina.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tarefas de manutenção&lt;/strong&gt; como compactação de logs ou coleta de lixo em ambientes gerenciados.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filas&lt;/strong&gt; em servidores e switches de rede, que amplificam todas as outras fontes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Limites de energia e temperatura&lt;/strong&gt; que freiam uma CPU depois de um pico de trabalho.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Em testes de carga, a mesma lista aparece como pausas de GC em serviços JVM ou Node.js, pool de conexões esgotado, uma consulta lenta ao banco que só algumas requisições disparam, caches frios depois de um deploy e novas tentativas após um timeout. Uma cauda que cresce com a carga aponta para filas; uma cauda presente mesmo com pouca carga aponta para algo periódico, como GC ou um job agendado.&lt;/p&gt;
&lt;h2&gt;Como medir a latência de cauda num teste de carga?&lt;/h2&gt;
&lt;p&gt;Colete amostras suficientes, peça à ferramenta os percentis certos e nunca tire média de percentis entre máquinas ou janelas de tempo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Amostras suficientes.&lt;/strong&gt; O p99 é decidido pelo 1% mais lento das requisições, então uma execução com 500 requisições apoia o p99 em 5 delas. Para um p99 estável você precisa de milhares de requisições por transação, e de dezenas de milhares para o p99,9. Testes de fumaça curtos servem para achar erros e pouco para julgar a cauda.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Os percentis certos.&lt;/strong&gt; Os padrões muitas vezes param antes da cauda. No k6, &lt;code&gt;summaryTrendStats&lt;/code&gt; é por padrão &lt;code&gt;avg,min,med,max,p(90),p(95)&lt;/code&gt;, então o p99 só aparece se você incluir (&lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/k6-options/reference/&quot;&gt;referência de opções do k6&lt;/a&gt;, conferida em 19 de outubro de 2026):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;k6 run --summary-trend-stats=&amp;quot;med,p(95),p(99),p(99.9),max&amp;quot; \
  script.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Aggregate_Report&quot;&gt;Aggregate Report&lt;/a&gt; do JMeter mostra as linhas de 90%, 95% e 99%, e as propriedades &lt;code&gt;aggregate_rpt_pct1&lt;/code&gt; a &lt;code&gt;aggregate_rpt_pct3&lt;/code&gt; mudam quais percentis aparecem (conferido em 19 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nada de percentis em média.&lt;/strong&gt; O p99 de uma execução inteira não é a média dos p99 de cada minuto nem a dos p99 de cada gerador de carga. Junte as amostras brutas ou um histograma e calcule o percentil uma vez só. O artigo sobre &lt;a href=&quot;https://loadtest.app/pt-br/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt; trata do HdrHistogram, a ferramenta usual para isso, e de uma segunda armadilha: um gerador de carga que espera as respostas lentas envia menos requisições enquanto o sistema está lento, e esconde justamente a cauda que você procura.&lt;/p&gt;
&lt;p&gt;A LoadFocus, que publica este site, mostra em cada execução os blocos P95 e P99, um &lt;a href=&quot;https://loadfocus.com/docs/guides/load-testing/response-time-distribution?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tail-latency&quot;&gt;histograma de tempos de resposta&lt;/a&gt; montado a partir das amostras individuais e as requisições mais lentas, então uma cauda longa à direita do pico aparece de relance.&lt;/p&gt;
&lt;h2&gt;Como definir um limite de aprovação para a cauda?&lt;/h2&gt;
&lt;p&gt;Coloque um limite no p99 de cada transação importante, ao lado de um limite de p95 e de um limite de taxa de erros. Baseie o limite no que os usuários daquela transação precisam e deixe a execução durar o bastante para o p99 ficar estável.&lt;/p&gt;
&lt;p&gt;Um conjunto sensato para uma API de checkout poderia ser: p95 abaixo de 400 ms, p99 abaixo de 1.200 ms e erros abaixo de 0,5%. No k6, são thresholds em &lt;code&gt;http_req_duration&lt;/code&gt; como &lt;code&gt;p(99)&amp;lt;1200&lt;/code&gt;, e um threshold violado faz o k6 sair com código diferente de zero (&lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds do k6&lt;/a&gt;, conferido em 19 de outubro de 2026). A LoadFocus tem um campo &lt;a href=&quot;https://loadfocus.com/docs/guides/load-testing/pass-fail-thresholds?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tail-latency&quot;&gt;Max P99 response time&lt;/a&gt; ao lado de Max P95 para testes cloud, JMeter e k6, e cada execução recebe então PASS ou FAIL. Nosso guia de &lt;a href=&quot;https://loadtest.app/pt-br/load-test-pass-fail-criteria/&quot;&gt;critérios de aprovação de um teste de carga&lt;/a&gt; cobre o resto do conjunto.&lt;/p&gt;
&lt;p&gt;Se você também reporta uma &lt;a href=&quot;https://loadtest.app/pt-br/apdex-score/&quot;&gt;pontuação Apdex&lt;/a&gt;, lembre que ela joga toda requisição acima de quatro vezes T na mesma faixa, então não distingue uma cauda de 2 segundos de uma de 30. O p99 distingue.&lt;/p&gt;
&lt;h2&gt;Como reduzir a latência de cauda?&lt;/h2&gt;
&lt;p&gt;Elimine as fontes de variação onde der e desenhe os chamadores para que uma chamada lenta não segure a resposta inteira.&lt;/p&gt;
&lt;p&gt;Correções comuns, mais ou menos da mais barata à mais trabalhosa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ajuste o GC e o tamanho dos pools&lt;/strong&gt; para que pausas e a espera por uma conexão livre continuem curtas sob carga.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deixe folga.&lt;/strong&gt; As filas crescem de repente perto da saturação, então capacidade sobrando encurta a cauda; o guia de &lt;a href=&quot;https://loadtest.app/pt-br/throughput-vs-latency/&quot;&gt;vazão vs latência&lt;/a&gt; mostra como achar o joelho.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defina timeouts e limite as novas tentativas&lt;/strong&gt; para que uma chamada travada falhe rápido em vez de acumular tudo atrás dela.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use requisições de cobertura (hedged requests)&lt;/strong&gt; em leituras idempotentes: envie uma segunda cópia para outra réplica se a primeira não responder a tempo. Dean e Barroso descrevem enviar a cópia só depois da latência esperada do percentil 95, o que limita a carga extra a cerca de 5%. Num dos testes deles, uma cópia enviada após 10 ms derrubou o percentil 99,9 de 1.800 ms para 74 ms com apenas 2% a mais de requisições.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reduza o fan-out.&lt;/strong&gt; Menos chamadas ao backend por página significa menos chances de cair na cauda, como mostra a tabela do início.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Depois de cada mudança, rode o mesmo teste com o mesmo perfil de carga e compare p99 e p99,9 entre as execuções.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Latência de cauda é a mesma coisa que p99?&lt;/strong&gt;
O p99 é a forma mais comum de informá-la, e a cauda é toda a ponta lenta da distribuição. Acompanhe também o p99,9 e o máximo quando a execução tiver requisições suficientes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Por que meu p99 é tão maior que a minha média?&lt;/strong&gt;
Porque poucas requisições lentas quase não mexem na média e definem o p99 por inteiro. Uma diferença grande é normal; uma diferença que cresce com a carga costuma indicar filas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quantas requisições preciso para medir o p99?&lt;/strong&gt;
No mínimo alguns milhares por transação, para que o p99 se apoie em dezenas de requisições lentas. Para o p99,9, planeje dezenas de milhares.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/coordinated-omission/&quot;&gt;Coordinated omission: o que é e como evitar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/throughput-vs-latency/&quot;&gt;Vazão vs latência: como se relacionam sob carga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/apdex-score/&quot;&gt;Pontuação Apdex: o que é e como calcular&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/load-test-pass-fail-criteria/&quot;&gt;Critérios de aprovação de um teste de carga: como definir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/littles-law-load-testing/&quot;&gt;Lei de Little em teste de carga: dimensionar e conferir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/ycsb/&quot;&gt;YCSB: cargas de trabalho A-F, execução e limites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/slo-vs-sla/&quot;&gt;SLO vs SLA: a diferença, os SLIs e o orçamento de erros&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Teste de carga gRPC: ferramentas, configuração e métricas</title><link>https://loadtest.app/pt-br/grpc-load-testing/</link><guid isPermaLink="true">https://loadtest.app/pt-br/grpc-load-testing/</guid><description>Teste de carga gRPC: quais ferramentas falam gRPC nativamente, como escrever um teste com k6 ou ghz e por que uma falha ainda volta como HTTP 200.</description><pubDate>Fri, 16 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;Um teste de carga gRPC precisa de uma ferramenta que fale HTTP/2 e Protocol Buffers: k6 e ghz fazem isso de fábrica, o JMeter precisa de um plugin, o suporte a gRPC do Gatling é limitado na edição gratuita e no Locust você mesmo precisa integrar um cliente gRPC. Conte os resultados pelo status gRPC, não pelo status HTTP, porque chamadas com falha continuam chegando como HTTP 200, e confira se a carga chega a todos os backends.&lt;/p&gt;
&lt;p&gt;Nenhum teste gRPC foi executado para este artigo. Os fatos sobre ferramentas vêm da documentação e dos repositórios de cada projeto, conferidos em 16 de outubro de 2026; os fatos sobre a LoadFocus vêm do código dela.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ferramenta&lt;/th&gt;
&lt;th&gt;Suporte a gRPC&lt;/th&gt;
&lt;th&gt;Lê a API de&lt;/th&gt;
&lt;th&gt;Controle da taxa&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;Embutido (&lt;code&gt;k6/net/grpc&lt;/code&gt;), chamadas unárias e streams&lt;/td&gt;
&lt;td&gt;Arquivos &lt;code&gt;.proto&lt;/code&gt; ou reflexão do servidor&lt;/td&gt;
&lt;td&gt;Executores arrival-rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ghz&lt;/td&gt;
&lt;td&gt;Ferramenta de linha de comando dedicada a gRPC&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.proto&lt;/code&gt;, protoset ou reflexão do servidor&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--rps&lt;/code&gt; e agendas de carga&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;Plugin de terceiros (jmeter-grpc-request)&lt;/td&gt;
&lt;td&gt;Uma pasta de arquivos &lt;code&gt;.proto&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Thread Groups e timers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;Componente gRPC separado; edição gratuita limitada a 5 usuários, 5 minutos&lt;/td&gt;
&lt;td&gt;Código gerado a partir dos &lt;code&gt;.proto&lt;/code&gt; com protoc&lt;/td&gt;
&lt;td&gt;Perfis de injeção&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;Sem cliente embutido; envolva um e reporte as chamadas&lt;/td&gt;
&lt;td&gt;Seu cliente gRPC em Python&lt;/td&gt;
&lt;td&gt;Tempos de espera, &lt;code&gt;constant_throughput&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Por que o gRPC precisa de um teste de carga diferente do REST?&lt;/h2&gt;
&lt;p&gt;O gRPC roda sobre HTTP/2, envia Protocol Buffers binários em vez de JSON, coloca o resultado da chamada em um trailer em vez do status HTTP e multiplexa muitas chamadas em uma única conexão. Cada um desses pontos muda como você escreve o teste ou lê os resultados.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://grpc.io/blog/grpc-load-balancing/&quot;&gt;artigo sobre balanceamento de carga no gRPC&lt;/a&gt; lista as características do HTTP/2 que importam aqui: um protocolo binário, muitas requisições multiplexadas em uma conexão e compressão de cabeçalhos, com mensagens Protobuf fortemente tipadas por cima (conferido em 16 de outubro de 2026). Uma ferramenta que só envia JSON sobre HTTP/1.1 não consegue chamar um método gRPC, então confira primeiro o suporte ao protocolo.&lt;/p&gt;
&lt;h2&gt;Qual ferramenta você deve usar?&lt;/h2&gt;
&lt;p&gt;Use o k6 se quiser cenários, checks e thresholds escritos em código; use o ghz para um benchmark rápido de um método pela linha de comando. Recorra ao JMeter, ao Gatling ou ao Locust quando o seu time já faz todo o resto com eles.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;k6.&lt;/strong&gt; O &lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-net-grpc/&quot;&gt;módulo k6/net/grpc&lt;/a&gt; carrega definições Protobuf, conecta, faz chamadas unárias com &lt;code&gt;invoke&lt;/code&gt; e abre streams. Ele reporta &lt;code&gt;grpc_req_duration&lt;/code&gt; e a contagem de mensagens dos streams nas suas &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;métricas&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ghz.&lt;/strong&gt; Uma ferramenta de benchmark de linha de comando só para gRPC. As &lt;a href=&quot;https://ghz.sh/docs/options&quot;&gt;opções&lt;/a&gt; incluem &lt;code&gt;--rps&lt;/code&gt;, &lt;code&gt;--concurrency&lt;/code&gt;, &lt;code&gt;--total&lt;/code&gt; e &lt;code&gt;--duration&lt;/code&gt;, e se você não passar nem &lt;code&gt;--proto&lt;/code&gt; nem &lt;code&gt;--protoset&lt;/code&gt; ele tenta a reflexão do servidor. A &lt;a href=&quot;https://github.com/bojand/ghz/releases&quot;&gt;versão&lt;/a&gt; mais recente é v0.121.0 (conferido em 16 de outubro de 2026).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JMeter.&lt;/strong&gt; O núcleo do JMeter não tem sampler gRPC; o &lt;a href=&quot;https://github.com/zalopay-oss/jmeter-grpc-request&quot;&gt;plugin jmeter-grpc-request&lt;/a&gt; acrescenta um que lê uma pasta de arquivos &lt;code&gt;.proto&lt;/code&gt;, sem geração de código (tag mais recente v1.2.6, conferido em 16 de outubro de 2026).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gatling.&lt;/strong&gt; O &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README do Gatling&lt;/a&gt; coloca gRPC, MQTT e GraphQL sob a Gatling Enterprise Component License, limitados na Community Edition a 5 usuários simultâneos e testes de 5 minutos (conferido em 16 de outubro de 2026). O &lt;a href=&quot;https://docs.gatling.io/reference/script/grpc/setup/&quot;&gt;guia de configuração de gRPC&lt;/a&gt; gera código a partir dos seus arquivos &lt;code&gt;.proto&lt;/code&gt; com protoc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Locust.&lt;/strong&gt; A documentação sobre &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;testar outros sistemas&lt;/a&gt; inclui um exemplo de gRPC: você envolve um cliente gRPC para que cada chamada seja reportada ao Locust, e &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;&lt;code&gt;constant_throughput&lt;/code&gt;&lt;/a&gt; limita uma tarefa a um número máximo de execuções por segundo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Escolha o ghz em vez do k6 quando só precisa saber como um método se comporta a uma taxa dada e não quer escrever script. Escolha o Locust em vez disso quando o seu time escreve em Python e o teste precisa de uma lógica que fica mais fácil lá.&lt;/p&gt;
&lt;h2&gt;Como escrever um teste de carga gRPC no k6?&lt;/h2&gt;
&lt;p&gt;Carregue o arquivo &lt;code&gt;.proto&lt;/code&gt; no código de inicialização e, em cada iteração, conecte, chame o método e confira o status gRPC. A estrutura segue o exemplo da própria documentação do k6.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;import grpc from &amp;#39;k6/net/grpc&amp;#39;;
import { check } from &amp;#39;k6&amp;#39;;

const client = new grpc.Client();
client.load([&amp;#39;protos&amp;#39;], &amp;#39;hello.proto&amp;#39;);

export const options = { vus: 20, duration: &amp;#39;1m&amp;#39; };

export default () =&amp;gt; {
  client.connect(&amp;#39;grpc.example.com:443&amp;#39;);
  const res = client.invoke(&amp;#39;hello.Greeter/SayHello&amp;#39;, {
    name: &amp;#39;load test&amp;#39;,
  });
  check(res, {
    &amp;#39;status is OK&amp;#39;: (r) =&amp;gt; r &amp;amp;&amp;amp; r.status === grpc.StatusOK,
  });
  client.close();
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A &lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-net-grpc/client/client-invoke/&quot;&gt;página do &lt;code&gt;invoke&lt;/code&gt;&lt;/a&gt; usa a mesma sequência de carregar, conectar, chamar, conferir e fechar. O &lt;code&gt;connect&lt;/code&gt; usa TLS a menos que você passe &lt;code&gt;plaintext: true&lt;/code&gt;, e com &lt;code&gt;reflect: true&lt;/code&gt; ele pede a API ao servidor em vez de ler um arquivo &lt;code&gt;.proto&lt;/code&gt; (&lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-net-grpc/client/client-connect/&quot;&gt;parâmetros de conexão&lt;/a&gt;). Para manter uma taxa de requisições em vez de um número de usuários, rode a função em um cenário arrival-rate.&lt;/p&gt;
&lt;h2&gt;Como fazer um benchmark rápido com o ghz?&lt;/h2&gt;
&lt;p&gt;Informe ao ghz o método, um corpo de requisição e uma taxa ou uma concorrência, e ele mostra um histograma de latência, percentis e uma contagem por código de status. Serve para uma primeira olhada em um método.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ghz --insecure --proto ./hello.proto \
  --call hello.Greeter.SayHello \
  -d &amp;#39;{&amp;quot;name&amp;quot;:&amp;quot;load test&amp;quot;}&amp;#39; \
  --rps 200 -c 50 -z 1m \
  localhost:50051
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;--rps&lt;/code&gt; define a taxa alvo, dividida entre os workers, &lt;code&gt;-c&lt;/code&gt; define quantos workers existem e &lt;code&gt;-z&lt;/code&gt; a duração. Tire o &lt;code&gt;--proto&lt;/code&gt; para deixar o ghz usar a reflexão do servidor, se o servidor a tiver ativada. A &lt;a href=&quot;https://ghz.sh/docs/output&quot;&gt;página de saída do ghz&lt;/a&gt; mostra um relatório de exemplo.&lt;/p&gt;
&lt;h2&gt;O que medir em um teste de carga gRPC?&lt;/h2&gt;
&lt;p&gt;Meça os percentis de latência das chamadas, a vazão e a contagem de cada código de status gRPC. Uma taxa de sucesso no nível HTTP pode marcar 100% enquanto chamadas falham, porque o resultado viaja no trailer &lt;code&gt;grpc-status&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://raw.githubusercontent.com/grpc/grpc/master/doc/PROTOCOL-HTTP2.md&quot;&gt;especificação do gRPC sobre HTTP/2&lt;/a&gt; fixa o status HTTP em &lt;code&gt;:status 200&lt;/code&gt; e leva o resultado da chamada em trailers, como &lt;code&gt;grpc-status&lt;/code&gt; e &lt;code&gt;grpc-message&lt;/code&gt;. A &lt;a href=&quot;https://grpc.github.io/grpc/core/md_doc_statuscodes.html&quot;&gt;lista de códigos de status&lt;/a&gt; traz os que mais importam sob carga:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DEADLINE_EXCEEDED&lt;/code&gt; (4): o prazo expirou antes de a chamada terminar.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RESOURCE_EXHAUSTED&lt;/code&gt; (8): uma cota ou um recurso se esgotou.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INTERNAL&lt;/code&gt; (13): um invariante interno foi violado, um código reservado para erros graves.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UNAVAILABLE&lt;/code&gt; (14): costuma ser passageiro; repetir com backoff pode resolver, mas nem sempre é seguro em chamadas não idempotentes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Conte cada um por degrau de carga. Os erros de prazo podem subir enquanto as chamadas bem-sucedidas ainda parecem rápidas, porque as lentas são cortadas no prazo em vez de serem registradas como lentas. Nosso guia de &lt;a href=&quot;https://loadtest.app/pt-br/load-test-pass-fail-criteria/&quot;&gt;critérios de aprovação de um teste de carga&lt;/a&gt; mostra como transformar essas contagens em limites de aprovação.&lt;/p&gt;
&lt;h2&gt;Por que toda a carga cai em um único servidor?&lt;/h2&gt;
&lt;p&gt;Porque o gRPC multiplexa muitas chamadas em uma conexão de longa duração, um balanceador que trabalha por conexão manda todas as chamadas dela para o mesmo backend. Um gerador de carga com poucas conexões pode então saturar um servidor enquanto os outros ficam parados.&lt;/p&gt;
&lt;p&gt;O artigo sobre balanceamento de carga no gRPC explica o mecanismo. Um balanceador no nível de transporte (L3/L4) encerra a conexão TCP e abre outra para um backend escolhido, copiando os frames HTTP/2 e gRPC entre as duas; um balanceador no nível de aplicação (L7) interpreta o HTTP/2 e pode distribuir os streams de uma mesma conexão de cliente entre vários backends. Se os seus clientes de produção passam por um balanceador L7 ou balanceiam do lado do cliente, teste pelo mesmo caminho e acompanhe a CPU e a contagem de requisições de cada backend durante a execução.&lt;/p&gt;
&lt;h2&gt;Dá para rodar testes de carga gRPC na LoadFocus?&lt;/h2&gt;
&lt;p&gt;Não de um jeito que os relatórios dela mostrem. A LoadFocus roda a versão padrão do k6 v0.57.0, que inclui o módulo gRPC, mas o agente k6 dela só envia aos resultados as amostras de requisições HTTP, então chamadas gRPC gerariam carga sem aparecer nos gráficos nem nas contagens de erros.&lt;/p&gt;
&lt;p&gt;Há mais dois limites. O upload de arquivos do k6 aceita arquivos &lt;code&gt;.js&lt;/code&gt;, &lt;code&gt;.ts&lt;/code&gt;, &lt;code&gt;.csv&lt;/code&gt;, &lt;code&gt;.txt&lt;/code&gt;, &lt;code&gt;.json&lt;/code&gt;, &lt;code&gt;.env&lt;/code&gt; e &lt;code&gt;.properties&lt;/code&gt;, não arquivos &lt;code&gt;.proto&lt;/code&gt;, então um script teria de se conectar com &lt;code&gt;reflect: true&lt;/code&gt;. E o caminho pelo JMeter está fechado: os agentes JMeter da LoadFocus trazem o JMeter 5.6.2 com plugins pré-instalados que não incluem um sampler gRPC, e o upload do JMeter não aceita arquivos JAR de plugin. Para gRPC, rode o k6 ou o ghz nas suas próprias máquinas e use os &lt;a href=&quot;https://loadfocus.com/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=grpc-load-testing&quot;&gt;scripts k6&lt;/a&gt; na LoadFocus para a parte HTTP do mesmo sistema, onde ela gera carga a partir de 25 regiões.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Dá para fazer teste de carga de chamadas gRPC em streaming?&lt;/strong&gt;
Sim, com k6 e ghz. O módulo gRPC do k6 tem uma classe &lt;code&gt;Stream&lt;/code&gt; com &lt;code&gt;write&lt;/code&gt;, &lt;code&gt;end&lt;/code&gt; e handlers de eventos, e o ghz tem opções para intervalos e durações de streaming. Meça as mensagens enviadas e recebidas além da latência das chamadas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;É preciso o arquivo .proto para fazer teste de carga de um serviço gRPC?&lt;/strong&gt;
Não se o servidor tiver a reflexão ativada. O k6 pode se conectar com &lt;code&gt;reflect: true&lt;/code&gt;, e o ghz recorre à reflexão quando você não passa nem &lt;code&gt;--proto&lt;/code&gt; nem &lt;code&gt;--protoset&lt;/code&gt;. Sem reflexão, você precisa do arquivo &lt;code&gt;.proto&lt;/code&gt; ou de um protoset compilado.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Por que meus erros gRPC não aparecem como requisições com falha?&lt;/strong&gt;
Porque o status HTTP de uma chamada gRPC é 200 mesmo quando a chamada falha. O resultado fica no trailer &lt;code&gt;grpc-status&lt;/code&gt;, então confira esse valor no seu script e conte cada código separadamente.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/websocket-load-testing-tools/&quot;&gt;Ferramentas de teste de carga WebSocket: seis opções&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/how-to-load-test-a-graphql-api/&quot;&gt;Teste de carga de API GraphQL: guia prático&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-vs-k6/&quot;&gt;Gatling vs k6: simulações na JVM ou um único binário Go?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/http-benchmarking-tools/&quot;&gt;Ferramentas de benchmark HTTP: wrk, hey, oha, ab e mais&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Vazão vs latência: como se relacionam sob carga</title><link>https://loadtest.app/pt-br/throughput-vs-latency/</link><guid isPermaLink="true">https://loadtest.app/pt-br/throughput-vs-latency/</guid><description>Vazão vs latência explicadas: o que cada uma mede, por que a Latency do JMeter não é o tempo de resposta e por que a latência sobe ao chegar no teto.</description><pubDate>Fri, 16 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;A vazão (throughput) é a quantidade de trabalho que um sistema conclui por unidade de tempo, por exemplo requisições por segundo. A latência é o tempo que uma unidade de trabalho leva, por exemplo 120 milissegundos por requisição. Com pouca carga, uma quase não afeta a outra; quando a carga se aproxima da capacidade do sistema, a vazão para de subir e a latência começa a crescer, e encontrar esse ponto é justamente o objetivo de um teste de carga.&lt;/p&gt;
&lt;p&gt;O exemplo abaixo é aritmética, sem nenhum teste por trás. As definições das ferramentas vêm da documentação de cada projeto, conferida em 16 de outubro de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Vazão&lt;/th&gt;
&lt;th&gt;Latência&lt;/th&gt;
&lt;th&gt;Largura de banda&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Pergunta que responde&lt;/td&gt;
&lt;td&gt;Quanto é concluído por segundo?&lt;/td&gt;
&lt;td&gt;Quanto tempo leva uma unidade?&lt;/td&gt;
&lt;td&gt;Quanto o link poderia carregar?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unidade comum&lt;/td&gt;
&lt;td&gt;requisições ou transações por segundo&lt;/td&gt;
&lt;td&gt;milissegundos&lt;/td&gt;
&lt;td&gt;megabits por segundo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http_reqs&lt;/code&gt; (contagem e taxa)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http_req_duration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;não é alvo do teste&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No JMeter&lt;/td&gt;
&lt;td&gt;Throughput&lt;/td&gt;
&lt;td&gt;Elapsed time (e uma &amp;quot;Latency&amp;quot; à parte)&lt;/td&gt;
&lt;td&gt;não é alvo do teste&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qual é a diferença entre vazão e latência?&lt;/h2&gt;
&lt;p&gt;A vazão conta o trabalho concluído ao longo do tempo; a latência mede o tempo que uma unidade de trabalho leva. Um sistema pode ter latência baixa e vazão baixa, ou vazão alta e latência alta, então você precisa dos dois números para descrevê-lo.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://jmeter.apache.org/usermanual/glossary.html&quot;&gt;glossário do JMeter&lt;/a&gt; calcula a vazão como o número de requisições dividido pelo tempo total, do início da primeira amostra ao fim da última, incluindo os intervalos entre amostras, porque ela deve representar a carga sobre o servidor (conferido em 16 de outubro de 2026). Isso faz da vazão uma propriedade da execução inteira, enquanto a latência pertence a cada requisição e é melhor lida como uma distribuição: mediana, p95, p99.&lt;/p&gt;
&lt;h2&gt;Largura de banda é a mesma coisa que vazão?&lt;/h2&gt;
&lt;p&gt;Não. A largura de banda é a quantidade máxima de dados que um link de rede poderia carregar; a vazão é o que de fato passa. Em um teste de carga, vazão costuma significar requisições concluídas, e a largura de banda só importa quando cargas grandes de dados enchem o link antes de a aplicação esgotar a capacidade.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://aws.amazon.com/compare/the-difference-between-throughput-and-latency/&quot;&gt;página de comparação da AWS&lt;/a&gt; resume a visão de rede: latência é o atraso na comunicação de rede, vazão é o volume médio de dados que realmente passa em um período e largura de banda é o máximo teórico (conferido em 16 de outubro de 2026). Boa parte do que se encontra na internet usa esse sentido de rede. Testes de carga usam as mesmas palavras para requisições em vez de pacotes, e por isso vale dizer qual dos dois um relatório quer dizer.&lt;/p&gt;
&lt;h2&gt;O que &amp;quot;latência&amp;quot; significa em uma ferramenta de teste de carga?&lt;/h2&gt;
&lt;p&gt;Depende da ferramenta. No JMeter, Latency é o tempo até a primeira parte da resposta, e o tempo de resposta completo se chama Elapsed time. No k6, &lt;code&gt;http_req_duration&lt;/code&gt; cobre envio, espera e recebimento, e o tempo até o primeiro byte é uma métrica separada.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://jmeter.apache.org/usermanual/glossary.html&quot;&gt;glossário do JMeter&lt;/a&gt; mede o Elapsed time de logo antes de enviar a requisição até logo depois de receber a última resposta, e a Latency até logo depois de receber a primeira. A &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;referência de métricas do k6&lt;/a&gt; define &lt;code&gt;http_req_duration&lt;/code&gt; como &lt;code&gt;http_req_sending + http_req_waiting + http_req_receiving&lt;/code&gt;, sem a resolução de DNS e o estabelecimento da conexão, e chama &lt;code&gt;http_req_waiting&lt;/code&gt; de tempo até o primeiro byte (ambos conferidos em 16 de outubro de 2026). Então a Latency do JMeter equivale ao &lt;code&gt;http_req_waiting&lt;/code&gt; do k6, não ao &lt;code&gt;http_req_duration&lt;/code&gt;. Compare uma &amp;quot;latência&amp;quot; do JMeter com uma &amp;quot;duration&amp;quot; do k6 e o número do JMeter vai parecer melhor sem ser.&lt;/p&gt;
&lt;h2&gt;Como a vazão e a latência mudam quando a carga cresce?&lt;/h2&gt;
&lt;p&gt;No início, mais carga significa mais vazão, e a latência fica mais ou menos estável. Quando o sistema chega à sua capacidade, a vazão para de crescer e cada usuário a mais só acrescenta espera, então a latência sobe junto com a carga.&lt;/p&gt;
&lt;p&gt;Um exemplo, só aritmética. Um serviço atende no máximo 200 requisições por segundo e responde em 0,1 segundo quando não está ocupado. Cada usuário virtual envia uma requisição e depois faz uma pausa de 1 segundo. Com um número fixo de usuários, a forma da lei de Little para o modelo fechado liga as grandezas: usuários = requisições por segundo × (latência + tempo de pensamento), como nosso &lt;a href=&quot;https://loadtest.app/pt-br/littles-law-load-testing/&quot;&gt;artigo sobre a lei de Little&lt;/a&gt; mostra passo a passo.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Usuários virtuais&lt;/th&gt;
&lt;th&gt;Vazão (requisições/s)&lt;/th&gt;
&lt;th&gt;Latência (s)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;0,1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;td&gt;136&lt;/td&gt;
&lt;td&gt;0,1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;220&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;0,1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;0,5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;1,0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;2,0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Até 220 usuários, a vazão cresce no mesmo ritmo que eles. Depois ela fica presa em 200, e a latência precisa absorver o resto: 300 usuários precisam de 300 ÷ 200 = 1,5 segundo por volta, o que deixa 0,5 segundo de latência. Sistemas reais costumam se curvar de forma mais gradual, porque filas começam a se formar antes do teto exato. Com um teste de taxa de chegada o cenário é mais duro: se as requisições chegam a mais de 200 por segundo, o acúmulo cresce enquanto durar o excesso, que é a diferença que o artigo sobre o &lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;modelo de carga aberto vs fechado&lt;/a&gt; explica.&lt;/p&gt;
&lt;h2&gt;Como encontrar o joelho nos seus próprios resultados?&lt;/h2&gt;
&lt;p&gt;Aumente a carga em degraus, mantenha cada degrau o bastante para estabilizar e anote a vazão e um percentil de latência de cada um. O joelho é o primeiro degrau em que a vazão para de acompanhar a carga enquanto a latência começa a crescer.&lt;/p&gt;
&lt;p&gt;Alguns cuidados deixam essa leitura confiável:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mantenha cada degrau por alguns minutos, para medir a vazão em um trecho estável e não em uma rampa.&lt;/li&gt;
&lt;li&gt;Leia um percentil, não só a média; a média pode continuar calma enquanto a pequena porcentagem de requisições mais lentas fica bem mais lenta.&lt;/li&gt;
&lt;li&gt;Confira os erros em cada degrau. Falhas rápidas contam como requisições concluídas com tempos curtos, então um sistema com falhas pode mostrar vazão subindo e latência caindo.&lt;/li&gt;
&lt;li&gt;Observe o gerador de carga. Se a CPU dele estiver saturada, o teto que você encontrou pode ser o dele.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;O &lt;a href=&quot;https://loadfocus.com/docs/guides/load-testing/response-time-vs-virtual-users?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=throughput-vs-latency&quot;&gt;gráfico de tempo de resposta por usuários virtuais&lt;/a&gt; da LoadFocus mostra o tempo de resposta médio e máximo em função dos usuários virtuais ativos, um ponto por nível alcançado, e é ali que o joelho aparece em um teste em degraus.&lt;/p&gt;
&lt;h2&gt;Dá para aumentar a vazão sem aumentar a latência?&lt;/h2&gt;
&lt;p&gt;Às vezes. Acrescentar capacidade move o teto, então a latência fica plana por mais tempo. Agrupar trabalho (batching) costuma fazer a troca contrária: aumenta a vazão fazendo cada requisição esperar.&lt;/p&gt;
&lt;p&gt;O algoritmo de Nagle do TCP é o exemplo clássico dessa troca. A &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc896.html&quot;&gt;RFC 896&lt;/a&gt; segura novos segmentos enquanto houver dados enviados na conexão ainda sem confirmação, de modo que a rede carrega menos pacotes e mais cheios, e cada escrita pequena pode esperar (conferido em 16 de outubro de 2026). Agrupar requisições e usar buffers de escrita funciona do mesmo jeito: mais trabalho por segundo, mais tempo por item. Quando mudar algo assim, repita o teste em degraus e compare as duas curvas, não um número só.&lt;/p&gt;
&lt;h2&gt;Qual das duas entra nos seus critérios de aprovação?&lt;/h2&gt;
&lt;p&gt;As duas, ligadas. Uma meta de latência diz pouco sem a vazão em que foi medida, e uma meta de vazão diz pouco se a latência dobrou para alcançá-la. Escreva as duas como um par, por exemplo p95 abaixo de 300 milissegundos a 200 requisições por segundo com menos de 1% de erros.&lt;/p&gt;
&lt;p&gt;Nosso guia de &lt;a href=&quot;https://loadtest.app/pt-br/load-test-pass-fail-criteria/&quot;&gt;critérios de aprovação de um teste de carga&lt;/a&gt; mostra como escrever e automatizar esse par. Se a sua ferramenta espera as respostas lentas antes de enviar a próxima requisição, os números de latência dela podem subestimar o problema; o artigo sobre &lt;a href=&quot;https://loadtest.app/pt-br/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt; explica como isso acontece e como evitar. O &lt;a href=&quot;https://loadfocus.com/glossary/what-is-latency?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=throughput-vs-latency&quot;&gt;verbete do glossário da LoadFocus sobre latência&lt;/a&gt; explica de onde vem a latência e por que os percentis importam.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Latência baixa significa vazão alta?&lt;/strong&gt;
Não necessariamente. Um sistema pode responder rápido a cada requisição mas atender poucas ao mesmo tempo, ou atender muitas ao mesmo tempo enquanto cada uma espera. Você só sabe as duas coisas depois de medir as duas sob a mesma carga, de preferência em vários níveis de carga.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qual é a diferença entre latência e tempo de resposta?&lt;/strong&gt;
No uso do dia a dia, costumam significar a mesma coisa. No JMeter, Latency é o tempo até a primeira parte da resposta e Elapsed time é o tempo de resposta completo, então confira qual um relatório mostra antes de comparar ferramentas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Por que a vazão para de aumentar em um teste de carga?&lt;/strong&gt;
Algo chegou ao limite: CPU, um banco de dados, um pool de conexões, um limite de requisições (rate limit) ou o próprio gerador de carga. A partir daí, os usuários a mais só entram na fila, o que aparece como latência subindo com a vazão estável.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/littles-law-load-testing/&quot;&gt;Lei de Little em teste de carga: dimensionar e conferir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;Modelo de carga aberto vs fechado: qual usar e quando&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/coordinated-omission/&quot;&gt;Coordinated omission: o que é e como evitar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/load-test-pass-fail-criteria/&quot;&gt;Critérios de aprovação de um teste de carga: como definir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/tail-latency/&quot;&gt;Latência de cauda: o que é e como medir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/apdex-score/&quot;&gt;Pontuação Apdex: o que é e como calcular&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/amdahls-law/&quot;&gt;Lei de Amdahl: fórmula, exemplos e limites&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Gatling vs Locust: simulações na JVM ou locustfiles Python?</title><link>https://loadtest.app/pt-br/gatling-vs-locust/</link><guid isPermaLink="true">https://loadtest.app/pt-br/gatling-vs-locust/</guid><description>Gatling vs Locust comparados: licença, execução, código de teste, modelo de carga, escala, critérios de aprovação e relatórios, com dicas de escolha.</description><pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, que vende um serviço de teste de carga abordado neste artigo.&lt;/p&gt;&lt;p&gt;Gatling e Locust são duas ferramentas open source gratuitas que guardam os testes de carga como código no seu repositório. Escolha o Gatling se o seu time trabalha na JVM ou se quer perfis de injeção abertos e fechados, assertions e um relatório HTML em um só pacote. Escolha o Locust se o seu time escreve Python, gosta de uma interface web para iniciar e acompanhar uma execução e precisa do modo distribuído sem uma edição comercial.&lt;/p&gt;
&lt;p&gt;Os dados desta comparação Gatling vs Locust vêm da documentação e do repositório de cada projeto, conferidos em 13 de outubro de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Gatling&lt;/th&gt;
&lt;th&gt;Locust&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licença&lt;/td&gt;
&lt;td&gt;Apache 2.0; gRPC, MQTT e GraphQL sob uma licença de componente separada (&lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;repositório&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;MIT (&lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;repositório&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ambiente de execução&lt;/td&gt;
&lt;td&gt;JVM, OpenJDK LTS 11 a 25 (versão 3.16.0)&lt;/td&gt;
&lt;td&gt;Python 3.11 ou superior (versão 2.46.7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Código de teste&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript ou TypeScript&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocolos embutidos&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events, JMS&lt;/td&gt;
&lt;td&gt;HTTP e HTTPS; outros por meio de um cliente Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modelo de carga&lt;/td&gt;
&lt;td&gt;Perfis de injeção abertos ou fechados&lt;/td&gt;
&lt;td&gt;Um pool de usuários, ou seja, um modelo fechado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Critérios de aprovação&lt;/td&gt;
&lt;td&gt;Assertions, avaliadas depois da execução&lt;/td&gt;
&lt;td&gt;Código de saída 1 quando requisições falham, ou o seu próprio listener&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relatórios&lt;/td&gt;
&lt;td&gt;Relatório HTML depois de cada execução&lt;/td&gt;
&lt;td&gt;Gráficos ao vivo na interface web, arquivos CSV, relatório HTML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escala&lt;/td&gt;
&lt;td&gt;Gatling Enterprise&lt;/td&gt;
&lt;td&gt;Modo master e workers embutido, operador do Kubernetes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qual é a diferença entre Gatling e Locust?&lt;/h2&gt;
&lt;p&gt;O Gatling executa simulações na JVM e o Locust executa programas Python comuns. O Gatling já traz um modelo de carga e um relatório, e no Locust você escreve a lógica do teste por conta própria.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; do Gatling descreve um motor não bloqueante construído sobre o Netty e um SDK em cinco linguagens: Java, Kotlin e Scala rodam com Maven, Gradle ou sbt, e JavaScript e TypeScript com um SDK separado. Sua &lt;a href=&quot;https://docs.gatling.io/reference/deploy/install-local/&quot;&gt;página de instalação&lt;/a&gt; pede um OpenJDK LTS de 64 bits da versão 11 à 25 e, para o SDK de JavaScript, Node.js 24 ou superior.&lt;/p&gt;
&lt;p&gt;O README do Locust o apresenta como uma forma de escrever testes de carga escaláveis em Python puro, e os &lt;a href=&quot;https://raw.githubusercontent.com/locustio/locust/master/pyproject.toml&quot;&gt;metadados do pacote&lt;/a&gt; exigem Python 3.11 ou superior. A página &lt;a href=&quot;https://docs.locust.io/en/stable/what-is-locust.html&quot;&gt;What is Locust&lt;/a&gt; diz que ele é baseado em eventos com gevent, de modo que um único processo consegue lidar com muitos milhares de usuários simultâneos (conferido em 13 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Como escrever o mesmo teste em cada ferramenta?&lt;/h2&gt;
&lt;p&gt;No Gatling você encadeia requisições em um cenário e dá a ele um perfil de injeção. No Locust você escreve uma classe de usuário com tarefas e um tempo de espera entre elas.&lt;/p&gt;
&lt;p&gt;Cinquenta usuários simultâneos que listam usuários e depois esperam de um a três segundos, por cinco minutos. No SDK Java do Gatling (imports omitidos):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class ApiSimulation extends Simulation {
  HttpProtocolBuilder api =
      http.baseUrl(&amp;quot;https://staging.example.com&amp;quot;);

  ScenarioBuilder users = scenario(&amp;quot;API users&amp;quot;)
      .exec(http(&amp;quot;list users&amp;quot;).get(&amp;quot;/api/users&amp;quot;))
      .pause(1, 3);

  {
    setUp(users.injectClosed(
        constantConcurrentUsers(50).during(300)))
      .protocols(api);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O mesmo teste no Locust:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from locust import HttpUser, task, between


class ApiUser(HttpUser):
    wait_time = between(1, 3)

    @task
    def list_users(self):
        self.client.get(&amp;quot;/api/users&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;referência de injeção&lt;/a&gt; do Gatling lista &lt;code&gt;constantConcurrentUsers&lt;/code&gt; entre os passos do modelo fechado. O Locust recebe o número de usuários e a duração como flags (conferido em 13 de outubro de 2026):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;locust -f locustfile.py --headless -u 50 -r 5 -t 5m \
  --host https://staging.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Como Gatling e Locust modelam a carga?&lt;/h2&gt;
&lt;p&gt;O Gatling oferece modelos abertos e fechados, conforme o método que você chama. O Locust executa um pool de usuários, o que equivale a um modelo fechado.&lt;/p&gt;
&lt;p&gt;A página de &lt;a href=&quot;https://docs.gatling.io/testing-concepts/workload-models/&quot;&gt;modelos de carga&lt;/a&gt; do Gatling define sistemas fechados como aqueles que limitam os usuários simultâneos e sistemas abertos como aqueles em que os usuários continuam chegando mesmo que a aplicação responda devagar. Ela acrescenta que a maioria dos sites é aberta. &lt;code&gt;injectOpen&lt;/code&gt; recebe taxas de chegada e &lt;code&gt;injectClosed&lt;/code&gt; recebe metas de concorrência.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;guia do locustfile&lt;/a&gt; diz que o tempo de espera só pode limitar a vazão e não inicia novos usuários para atingir uma taxa-alvo. Se uma volta demora mais do que a espera permite, a taxa fica abaixo da meta (conferido em 13 de outubro de 2026). Nosso guia sobre o &lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;modelo de carga aberto vs fechado&lt;/a&gt; explica por que isso importa.&lt;/p&gt;
&lt;h2&gt;Como rodar um teste maior do que uma máquina consegue gerar?&lt;/h2&gt;
&lt;p&gt;O Locust traz o modo distribuído embutido. A edição open source do Gatling gera carga a partir de uma única máquina, e execuções distribuídas exigem o Gatling Enterprise.&lt;/p&gt;
&lt;p&gt;O Locust inicia um processo com &lt;code&gt;--master&lt;/code&gt; e quantos processos &lt;code&gt;--worker&lt;/code&gt; você quiser. Segundo a &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;documentação de carga distribuída&lt;/a&gt;, um processo Python não usa mais de um núcleo, então roda-se um worker por núcleo, e &lt;code&gt;--processes&lt;/code&gt; inicia vários em uma máquina. Um &lt;a href=&quot;https://docs.locust.io/en/stable/kubernetes-operator.html&quot;&gt;operador do Kubernetes&lt;/a&gt; gerencia execuções distribuídas dentro de um cluster.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://docs.gatling.io/tutorials/faq/&quot;&gt;FAQ&lt;/a&gt; do Gatling diz que a Community Edition não suporta testes distribuídos, e o README descreve o Enterprise como rodando em geradores de carga gerenciados ou em infraestrutura privada (conferido em 13 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;Há uma saída para os dois casos. A LoadFocus, que publica este site, não roda simulações do Gatling nem testes do Locust. Se você prefere não rodar nenhum dos dois em grande escala, ela executa &lt;a href=&quot;https://loadfocus.com/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-vs-locust&quot;&gt;scripts k6&lt;/a&gt; e &lt;a href=&quot;https://loadfocus.com/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-vs-locust&quot;&gt;planos de teste JMeter&lt;/a&gt; a partir de 25 regiões na nuvem. O validador de k6 dela avisa que cenários de taxa de chegada rodam ali com um número fixo de usuários e, por isso, não mantêm uma taxa de requisições. Migrar de qualquer uma das duas ferramentas significa reescrever o teste.&lt;/p&gt;
&lt;h2&gt;Como decidem se um teste passou, e que relatórios você recebe?&lt;/h2&gt;
&lt;p&gt;O Gatling avalia as assertions depois da execução e escreve um relatório HTML todas as vezes. O Locust termina com o código 1 se alguma requisição falhou, e outras verificações você acrescenta como listener.&lt;/p&gt;
&lt;p&gt;As &lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;assertions&lt;/a&gt; do Gatling são avaliadas depois da simulação, e uma única assertion que falha faz a simulação falhar. O &lt;a href=&quot;https://docs.gatling.io/reference/stats/reports/oss/&quot;&gt;relatório HTML&lt;/a&gt; traz percentis do tempo de resposta, usuários iniciados por segundo, usuários simultâneos e requisições por segundo.&lt;/p&gt;
&lt;p&gt;De acordo com a &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;documentação headless&lt;/a&gt; do Locust, a execução termina com o código 1 se alguma amostra falhou, e um exemplo de listener faz a execução falhar pela taxa de falhas, pelo tempo de resposta médio ou pelo percentil 95. A &lt;a href=&quot;https://docs.locust.io/en/stable/configuration.html&quot;&gt;referência de configuração&lt;/a&gt; cita &lt;code&gt;--csv&lt;/code&gt; para arquivos de estatísticas e &lt;code&gt;--html&lt;/code&gt; para um relatório (conferido em 13 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Quais protocolos cada ferramenta consegue testar?&lt;/h2&gt;
&lt;p&gt;O Gatling traz mais protocolos, com limites nos mais novos. O Locust traz HTTP e HTTPS e espera um cliente Python para o resto.&lt;/p&gt;
&lt;p&gt;O README do Gatling lista HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events e JMS sob Apache 2.0, sem limites. gRPC, MQTT e GraphQL ficam sob a Gatling Enterprise Component License, e testes com eles são limitados a 5 usuários simultâneos e 5 minutos na Community Edition.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;página sobre outros sistemas&lt;/a&gt; do Locust mostra como envolver uma biblioteca de protocolo e reportar cada chamada, com exemplos de gRPC e MQTT. A biblioteca precisa funcionar com o gevent, que não consegue aplicar patch em E/S feita em código C compilado, e o locust-plugins acrescenta usuários para Kafka, Selenium e Playwright (conferido em 13 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Qual você deve escolher?&lt;/h2&gt;
&lt;p&gt;Escolha pela linguagem e pela forma de carregar o sistema. O Gatling combina com times JVM e testes em modelo aberto, e o Locust com times Python e testes com lógica própria.&lt;/p&gt;
&lt;p&gt;Escolha o Gatling em vez do Locust se o seu time vive na JVM e quer testes em Java, Kotlin ou Scala construídos com Maven, Gradle ou sbt, se você precisa de um modelo aberto, como uma taxa de chegada fixa, se precisa de JMS ou Server-Sent Events, ou se quer assertions e um relatório sem código extra.&lt;/p&gt;
&lt;p&gt;Escolha o Locust em vez do Gatling se o seu time escreve Python e quer que os testes reutilizem um cliente Python interno, se quer uma interface web para iniciar uma execução e mudar a carga enquanto ela roda, se precisa do modo distribuído na ferramenta gratuita, ou se o sistema recebe principalmente usuários que esperam e o seu protocolo tem uma biblioteca Python compatível com o gevent.&lt;/p&gt;
&lt;p&gt;Para um construtor de testes com interface gráfica, olhe o JMeter, e para um único binário sem JVM nem Python, olhe o k6.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;O Gatling é mais rápido que o Locust?&lt;/strong&gt;
Não medimos isso por conta própria, então não vamos apontar um vencedor. A comparação justa é rodar o mesmo cenário com as duas ferramentas no seu próprio hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O Locust consegue rodar simulações do Gatling?&lt;/strong&gt;
Não segundo a documentação do Locust, que descreve os testes apenas como código Python. Uma simulação do Gatling precisa ser reescrita como locustfile, e o inverso também vale.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A LoadFocus consegue rodar testes do Gatling ou do Locust?&lt;/strong&gt;
Não. A LoadFocus roda planos de teste JMeter e scripts k6. Para distribuir uma simulação do Gatling entre várias máquinas, use o Gatling Enterprise, e para o Locust use o modo master e workers ou o operador do Kubernetes.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-load-testing/&quot;&gt;Teste de carga com Gatling: análise da ferramenta JVM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/locust-load-testing/&quot;&gt;Teste de carga com Locust: análise da ferramenta Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-vs-k6/&quot;&gt;Gatling vs k6: simulações na JVM ou um único binário Go?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/locust-vs-jmeter/&quot;&gt;Locust vs JMeter: scripts Python ou planos do JMeter?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;Modelo de carga aberto vs fechado: qual usar e quando&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>JMeter vs Postman: qual ferramenta para teste de carga?</title><link>https://loadtest.app/pt-br/jmeter-vs-postman/</link><guid isPermaLink="true">https://loadtest.app/pt-br/jmeter-vs-postman/</guid><description>JMeter vs Postman em teste de carga: usuários virtuais, execuções na nuvem e preços do Postman, seus limites e quando o JMeter é a melhor escolha.</description><pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, que vende um serviço de teste de carga abordado neste artigo.&lt;/p&gt;&lt;p&gt;O Postman é um cliente de API feito para verificações funcionais, coleções e trabalho em equipe, que ganhou depois um modo de teste de desempenho. O Apache JMeter é um gerador de carga desde o início. Use o Postman quando quiser reaproveitar a coleção que você já tem para um teste de carga rápido ou um smoke test na CI. Use o JMeter quando o teste de carga é o trabalho principal: muitos protocolos, grandes números de usuários, relatórios detalhados e geração de carga distribuída.&lt;/p&gt;
&lt;p&gt;Os fatos sobre o Postman vêm da documentação e da página de preços dele, e os do JMeter vêm do site do próprio projeto, todos verificados em 13 de outubro de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Postman&lt;/th&gt;
&lt;th&gt;Apache JMeter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Finalidade principal&lt;/td&gt;
&lt;td&gt;Cliente de API, testes funcionais e de coleções, com modo de desempenho&lt;/td&gt;
&lt;td&gt;Testes de carga e de desempenho&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Definição do teste&lt;/td&gt;
&lt;td&gt;Uma coleção de requisições com scripts e asserções &lt;code&gt;pm.test()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Um plano de teste montado numa GUI e salvo como arquivo &lt;code&gt;.jmx&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usuários virtuais&lt;/td&gt;
&lt;td&gt;Cada um executa a coleção em loop; as execuções locais são limitadas pela sua máquina&lt;/td&gt;
&lt;td&gt;Uma thread Java por usuário num Thread Group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perfis de carga&lt;/td&gt;
&lt;td&gt;Fixed, Ramp up, Spike e Peak&lt;/td&gt;
&lt;td&gt;Thread Groups com período de rampa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;De onde vem a carga&lt;/td&gt;
&lt;td&gt;Sua máquina ou um runner de CI, ou a nuvem do Postman em planos pagos&lt;/td&gt;
&lt;td&gt;Sua máquina, ou servidores JMeter remotos que você mantém&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custo da carga&lt;/td&gt;
&lt;td&gt;Execuções locais em todos os planos; execuções na nuvem a US$ 0,04 por hora de usuário virtual&lt;/td&gt;
&lt;td&gt;Gratuito, licença Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aprovado ou reprovado na CI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;postman performance run&lt;/code&gt; com &lt;code&gt;--pass-if&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modo CLI (&lt;code&gt;jmeter -n&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;O que o teste de desempenho do Postman faz?&lt;/h2&gt;
&lt;p&gt;Ele executa as requisições de uma coleção com vários usuários virtuais em paralelo, por um número definido de minutos. Cada usuário repete as requisições em ordem, e seus scripts e asserções atuais rodam sob carga.&lt;/p&gt;
&lt;p&gt;Segundo a &lt;a href=&quot;https://learning.postman.com/docs/tests-and-scripts/performance-testing/testing-api-performance&quot;&gt;documentação de testes de desempenho&lt;/a&gt;, a coleção dos seus testes funcionais também é o seu teste de carga, sem script nem linguagem separados para manter (verificado em 13 de outubro de 2026). Você escolhe uma duração e um número de usuários virtuais, depois um perfil Fixed, Ramp up, Spike ou Peak, como descreve a &lt;a href=&quot;https://learning.postman.com/docs/tests-and-scripts/performance-testing/performance-test-configuration&quot;&gt;página de configuração&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Quais são os limites do Postman para teste de carga?&lt;/h2&gt;
&lt;p&gt;O principal limite é de onde vem a carga. Uma execução local fica limitada pela máquina que a executa, e o que passar disso exige um plano pago.&lt;/p&gt;
&lt;p&gt;Para execuções locais, a documentação do Postman diz que o número de usuários virtuais depende dos recursos do sistema e da coleção usada, que scripts de pre-request e post-response reduzem quantos usuários dá para simular e que a execução para se a máquina passar do limite de recursos. Ela sugere um primeiro teste com 10 a 20 usuários virtuais (verificado em 13 de outubro de 2026). Acima disso, o próprio gerador de carga pode distorcer suas medidas, e por isso o Postman também mostra os picos de CPU e memória da máquina de teste.&lt;/p&gt;
&lt;p&gt;Os dados são o próximo limite. Segundo a mesma página de configuração, arquivos de dados CSV e JSON funcionam só em execuções locais, enquanto datasets funcionam em execuções locais e na nuvem.&lt;/p&gt;
&lt;h2&gt;Quanto custa fazer teste de carga com o Postman?&lt;/h2&gt;
&lt;p&gt;As execuções de desempenho locais estão incluídas em todos os planos. As execuções na nuvem são para planos pagos e cobradas por uso, em horas de usuário virtual.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://www.postman.com/pricing/&quot;&gt;página de preços&lt;/a&gt; do Postman lista testes de desempenho locais ilimitados e testes de desempenho na nuvem a US$ 0,04 por hora de usuário virtual (verificado em 13 de outubro de 2026). Nessa tarifa listada, 500 usuários virtuais por uma hora são 500 horas de usuário virtual, ou US$ 20, além da mensalidade do plano. Endereços IP estáticos para alcançar alvos atrás de um firewall são um recurso do Enterprise. Não levantamos os preços dos planos em si: veja a página para os valores atuais por usuário.&lt;/p&gt;
&lt;h2&gt;Quais protocolos dá para testar?&lt;/h2&gt;
&lt;p&gt;O JMeter tem uma lista longa e documentada. Para o Postman, não encontramos uma lista de protocolos aceitos nas execuções de desempenho, então não afirmamos nada sobre isso.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://jmeter.apache.org/&quot;&gt;página inicial&lt;/a&gt; do JMeter cita HTTP e HTTPS, SOAP e REST, FTP, bancos de dados via JDBC, LDAP, mensageria JMS, e-mail SMTP, POP3 e IMAP, comandos nativos e scripts de shell, TCP e objetos Java (verificado em 13 de outubro de 2026). O Postman lida no aplicativo com outros tipos de requisição, como GraphQL, gRPC e WebSocket, mas isso não diz quais rodam sob carga. Teste um antes de depender dele.&lt;/p&gt;
&lt;h2&gt;Como escalar além de uma máquina?&lt;/h2&gt;
&lt;p&gt;O Postman escala pela nuvem dele, o JMeter por servidores que você mesmo mantém. O primeiro é mais fácil de começar, o segundo dá controle.&lt;/p&gt;
&lt;p&gt;Num plano pago, as execuções na nuvem do Postman dividem a carga entre workers gerenciados, e uma única máquina deixa de limitar o teste. O &lt;a href=&quot;https://jmeter.apache.org/usermanual/remote-test.html&quot;&gt;modo de teste remoto&lt;/a&gt; do JMeter deixa um cliente controlar muitos servidores JMeter. Cada nó precisa da mesma versão do JMeter, de um keystore para RMI sobre SSL, a menos que você o desative, e de uma cópia própria dos arquivos de dados (verificado em 13 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;Existe um terceiro caminho para planos de teste JMeter. A LoadFocus, que publica este site, &lt;a href=&quot;https://loadfocus.com/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=jmeter-vs-postman&quot;&gt;roda planos de teste JMeter existentes&lt;/a&gt; a partir de 25 regiões na nuvem. Você envia o arquivo &lt;code&gt;.jmx&lt;/code&gt; e define usuários virtuais, duração e rampa, sem servidores remotos para configurar. A LoadFocus roda apenas JMeter e k6, então não roda uma coleção do Postman.&lt;/p&gt;
&lt;h2&gt;Qual ferramenta escolher?&lt;/h2&gt;
&lt;p&gt;Escolha o Postman em vez do JMeter para verificações funcionais e de contrato, para uma equipe que compartilha coleções num workspace e para uma execução rápida de fumaça de uma API que você já testa. Escolha o JMeter quando o teste de carga é o objetivo principal, ou quando você precisa de vários protocolos, muitos usuários ou testes que ficam no seu próprio repositório.&lt;/p&gt;
&lt;p&gt;O Postman serve para uma verificação curta na CI: &lt;code&gt;postman performance run&lt;/code&gt; termina com código de saída diferente de zero quando um limite como o percentil 95 não é atingido, e isso faz o build falhar. O JMeter é melhor para carga em bancos de dados ou mensageria, para testes de longa duração e para o painel HTML com tabelas APDEX e de percentis que &lt;a href=&quot;https://jmeter.apache.org/usermanual/generating-dashboard.html&quot;&gt;a documentação dele&lt;/a&gt; descreve.&lt;/p&gt;
&lt;p&gt;Muitas equipes usam os dois: o Postman para montar e verificar as checagens da API, o JMeter para dar volume real aos fluxos críticos.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;O Postman pode substituir o JMeter em teste de carga?&lt;/strong&gt;
Para verificações pequenas de APIs HTTP, sim, porque a coleção que você já tem é o teste. Com alta concorrência, outros protocolos ou execuções longas, os limites documentados das execuções locais e o preço por uso das execuções na nuvem fazem do JMeter a base mais segura.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O Postman consegue rodar um arquivo .jmx do JMeter?&lt;/strong&gt;
Não encontramos na documentação nada que importe um plano de teste JMeter. Os testes de desempenho do Postman são feitos a partir de coleções, então um arquivo &lt;code&gt;.jmx&lt;/code&gt; teria de ser refeito.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O JMeter é gratuito?&lt;/strong&gt;
Sim. A versão atual na &lt;a href=&quot;https://jmeter.apache.org/download_jmeter.cgi&quot;&gt;página de download&lt;/a&gt; é a 5.6.3, que exige Java 8 ou mais recente (verificado em 13 de outubro de 2026). Você paga pelas máquinas que geram a carga, ou por um serviço na nuvem que rode seus planos.&lt;/p&gt;
&lt;h2&gt;Leia também&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-source-load-testing-tools/&quot;&gt;Ferramentas de teste de carga open source: seis opções&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter: testes como código ou plano na GUI?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/locust-vs-jmeter/&quot;&gt;Locust vs JMeter: scripts Python ou planos do JMeter?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/apdex-score/&quot;&gt;Pontuação Apdex: o que é e como calcular&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>k6 vs Locust: scripts JavaScript ou usuários Python?</title><link>https://loadtest.app/pt-br/k6-vs-locust/</link><guid isPermaLink="true">https://loadtest.app/pt-br/k6-vs-locust/</guid><description>k6 vs Locust comparados em licença, linguagem de script, modelos de carga, critérios de aprovação, protocolos e escala, com dicas para escolher.</description><pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, que vende um serviço de teste de carga abordado neste artigo.&lt;/p&gt;&lt;p&gt;k6 e Locust são duas ferramentas de código aberto que mantêm um teste de carga como código no seu repositório, e qualquer uma delas testa bem uma API HTTP sob carga. Escolha o Locust se sua equipe escreve Python e quer a lógica do teste em Python puro. Escolha o k6 se você escreve JavaScript, quer thresholds de aprovação embutidos ou precisa de um teste que mantenha uma taxa de chegada.&lt;/p&gt;
&lt;p&gt;Os fatos desta comparação entre k6 e Locust vêm da documentação e do repositório de cada projeto, conferidos em 13 de outubro de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;k6&lt;/th&gt;
&lt;th&gt;Locust&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licença&lt;/td&gt;
&lt;td&gt;AGPL-3.0 (&lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;repositório&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;MIT (&lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;repositório&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execução&lt;/td&gt;
&lt;td&gt;Um binário Go com um motor JavaScript embutido (versão v2.3.0)&lt;/td&gt;
&lt;td&gt;Python 3.11 ou mais recente (versão 2.46.7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scripts de teste&lt;/td&gt;
&lt;td&gt;JavaScript, ou TypeScript sem os tipos&lt;/td&gt;
&lt;td&gt;Classes Python em um locustfile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocolos embutidos&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSockets, gRPC&lt;/td&gt;
&lt;td&gt;HTTP e HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modelo de carga&lt;/td&gt;
&lt;td&gt;Seis executors, dois deles arrival-rate (modelo aberto)&lt;/td&gt;
&lt;td&gt;Um grupo de usuários que esperam cada um um tempo (modelo fechado)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aprovação ou falha&lt;/td&gt;
&lt;td&gt;Thresholds, que podem interromper uma execução mais cedo&lt;/td&gt;
&lt;td&gt;Código de saída 1 se requisições falharem; outros limites via listener&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testes de navegador&lt;/td&gt;
&lt;td&gt;Módulo de navegador embutido&lt;/td&gt;
&lt;td&gt;Usuários de navegador pelo projeto separado &lt;a href=&quot;https://github.com/SvenskaSpel/locust-plugins&quot;&gt;locust-plugins&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escala&lt;/td&gt;
&lt;td&gt;k6-operator no Kubernetes, ou Grafana Cloud k6&lt;/td&gt;
&lt;td&gt;Master e workers, um operador Kubernetes ou Azure Load Testing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qual é a diferença entre k6 e Locust?&lt;/h2&gt;
&lt;p&gt;A principal diferença é a linguagem em que você escreve os testes. O k6 executa JavaScript dentro de um programa Go compilado, enquanto o Locust executa seu código Python e usa o gevent para muitos usuários simultâneos.&lt;/p&gt;
&lt;p&gt;O k6 é instalado como &lt;a href=&quot;https://grafana.com/docs/k6/latest/set-up/install-k6/&quot;&gt;pacote ou binário independente&lt;/a&gt;, sem outro ambiente de execução. Ele também executa arquivos &lt;code&gt;.ts&lt;/code&gt;, mas seu &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/javascript-typescript-compatibility-mode/&quot;&gt;suporte a TypeScript&lt;/a&gt; remove os tipos sem verificá-los. O Locust é instalado com &lt;code&gt;pip install locust&lt;/code&gt;, e a página &lt;a href=&quot;https://docs.locust.io/en/stable/what-is-locust.html&quot;&gt;What is Locust&lt;/a&gt; diz que os testes são Python comum, que você mantém em controle de versão como qualquer outro código (conferido em 13 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Como escrever o mesmo teste em cada ferramenta?&lt;/h2&gt;
&lt;p&gt;Ambas expressam o teste como um programa curto. Aqui vai um teste com 50 usuários por cinco minutos, que falha se o percentil 95 passar de 500 ms ou se mais de 1% das requisições falharem.&lt;/p&gt;
&lt;p&gt;No k6 os objetivos fazem parte do script, como &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;
import { sleep } from &amp;quot;k6&amp;quot;;

export const options = {
  vus: 50,
  duration: &amp;quot;5m&amp;quot;,
  thresholds: {
    http_req_duration: [&amp;quot;p(95)&amp;lt;500&amp;quot;],
    http_req_failed: [&amp;quot;rate&amp;lt;0.01&amp;quot;],
  },
};

export default function () {
  http.get(&amp;quot;https://staging.example.com/api/users&amp;quot;);
  sleep(1);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No Locust o usuário é uma classe, e os mesmos objetivos vão em um listener, seguindo o padrão da &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;documentação do modo headless&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import logging
from locust import HttpUser, between, events, task


class ApiUser(HttpUser):
    wait_time = between(1, 2)

    @task
    def list_users(self):
        self.client.get(&amp;quot;/api/users&amp;quot;)


@events.quitting.add_listener
def _(environment, **kw):
    stats = environment.stats.total
    if stats.fail_ratio &amp;gt; 0.01:
        environment.process_exit_code = 1
    elif stats.get_response_time_percentile(0.95) &amp;gt; 500:
        environment.process_exit_code = 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Eles são executados com &lt;code&gt;k6 run script.js&lt;/code&gt; e &lt;code&gt;locust -f locustfile.py --headless -u 50 -r 10 -t 5m --host https://staging.example.com&lt;/code&gt; (conferido em 13 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Como k6 e Locust modelam a carga?&lt;/h2&gt;
&lt;p&gt;O k6 aceita os dois modelos de carga, enquanto o Locust descreve a carga como um número fixo de usuários. No k6 você escolhe o modelo pelo executor, e no Locust pelo número de usuários e pelo tempo de espera.&lt;/p&gt;
&lt;p&gt;O k6 tem &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/&quot;&gt;seis executors&lt;/a&gt;. Quatro são fechados: um usuário virtual só começa a próxima iteração quando a anterior termina. Os dois executors arrival-rate seguem o &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/open-vs-closed/&quot;&gt;modelo aberto&lt;/a&gt;, em que as iterações começam independentemente de quanto as anteriores demoram. O &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;guia do locustfile&lt;/a&gt; diz que o tempo de espera só pode limitar a vazão e não pode iniciar novos usuários para atingir uma taxa-alvo (conferido em 13 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;Se o seu objetivo é &amp;quot;300 requisições chegam a cada segundo, não importa o tempo de resposta&amp;quot;, o k6 consegue expressar isso diretamente. Nosso guia sobre o &lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;modelo de carga aberto e fechado&lt;/a&gt; explica quando cada um se encaixa.&lt;/p&gt;
&lt;h2&gt;Como k6 e Locust decidem se um teste passou?&lt;/h2&gt;
&lt;p&gt;O k6 tem critérios de aprovação como recurso central, e o Locust deixa a maior parte para o seu código. Um threshold do k6 violado encerra a execução com código de saída diferente de zero, e &lt;code&gt;abortOnFail&lt;/code&gt; interrompe o teste no instante em que ele falha.&lt;/p&gt;
&lt;p&gt;O Locust encerra com código 1 se alguma requisição falhou. Para limites sobre a taxa de falhas, a média ou o percentil 95, a documentação mostra um listener como o de cima, que define o código de saída por conta própria (conferido em 13 de outubro de 2026). Nosso guia sobre &lt;a href=&quot;https://loadtest.app/pt-br/load-test-pass-fail-criteria/&quot;&gt;critérios de aprovação em testes de carga&lt;/a&gt; ajuda a escolher os limites.&lt;/p&gt;
&lt;h2&gt;Quais protocolos cada ferramenta cobre?&lt;/h2&gt;
&lt;p&gt;O k6 traz quatro protocolos e um módulo de navegador; o Locust traz HTTP e HTTPS e deixa você envolver qualquer cliente Python para o resto.&lt;/p&gt;
&lt;p&gt;O k6 lista HTTP/1.1, HTTP/2, WebSockets e gRPC como &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/protocols/&quot;&gt;protocolos embutidos&lt;/a&gt;, com outros por extensões xk6, e um &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6-browser/&quot;&gt;módulo de navegador&lt;/a&gt; que controla um navegador baseado em Chromium. A página do Locust sobre &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;outros sistemas&lt;/a&gt; diz que ele só traz suporte embutido a HTTP/HTTPS, mas pode ser estendido para testar quase qualquer sistema, envolvendo uma biblioteca de protocolo e relatando cada chamada como uma requisição. A biblioteca precisa cooperar com o gevent (conferido em 13 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Como rodar um teste maior do que uma máquina consegue gerar?&lt;/h2&gt;
&lt;p&gt;O Locust escala com um master e workers, e o k6 com um operador Kubernetes ou um serviço hospedado. Os dois conseguem dividir um teste entre muitas máquinas.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;documentação do modo distribuído&lt;/a&gt; do Locust diz que um processo faz mais de mil requisições por segundo em um plano de teste simples, então testes maiores usam um worker por núcleo de processador em quantas máquinas forem necessárias. O &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt; divide um teste entre várias instâncias do k6 em um cluster Kubernetes, e o Grafana Cloud k6 é o caminho hospedado (conferido em 13 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;Há um terceiro caminho para scripts k6. A LoadFocus, que publica este site, &lt;a href=&quot;https://loadfocus.com/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=k6-vs-locust&quot;&gt;executa scripts k6&lt;/a&gt; a partir de 25 regiões na nuvem, com usuários e duração vindos das configurações do teste. O validador de scripts avisa que cenários arrival-rate rodam lá com um número fixo de usuários, então um script de modelo aberto não mantém sua taxa de chegada na LoadFocus. A LoadFocus não executa Locust: ela executa apenas scripts k6 e planos de teste JMeter.&lt;/p&gt;
&lt;h2&gt;Que relatórios você recebe?&lt;/h2&gt;
&lt;p&gt;O k6 imprime um resumo ao fim do teste e pode exportar um relatório HTML do seu painel web. O Locust mostra gráficos ao vivo na interface web e grava arquivos sob demanda.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://grafana.com/docs/k6/latest/results-output/end-of-test/&quot;&gt;resumo de fim de teste&lt;/a&gt; do k6 vai para o terminal, e seu &lt;a href=&quot;https://grafana.com/docs/k6/latest/results-output/web-dashboard/&quot;&gt;painel web&lt;/a&gt; exporta um relatório HTML autônomo quando você define &lt;code&gt;K6_WEB_DASHBOARD_EXPORT&lt;/code&gt;. O Locust serve uma interface web na porta 8089 com gráficos ao vivo, e sua &lt;a href=&quot;https://docs.locust.io/en/stable/configuration.html&quot;&gt;referência de configuração&lt;/a&gt; lista as saídas &lt;code&gt;--csv&lt;/code&gt;, &lt;code&gt;--html&lt;/code&gt; e &lt;code&gt;--json&lt;/code&gt; (conferido em 13 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Qual você deve escolher?&lt;/h2&gt;
&lt;p&gt;O Locust combina com equipes Python, e o k6 com equipes que querem thresholds embutidos e um modelo de carga aberto. Protocolos e escala decidem a maioria dos outros casos.&lt;/p&gt;
&lt;p&gt;Escolha o Locust em vez do k6 se sua equipe escreve Python e quer laços, ramificações, dados gerados e seu próprio cliente de API em Python puro, se você quer reaproveitar bibliotecas Python para um protocolo, ou se quer uma interface web com gráficos ao vivo para explorar um sistema. Escolha o k6 em vez do Locust se sua equipe escreve JavaScript ou TypeScript, se thresholds devem reprovar um build de CI e parar cedo uma execução ruim, se você precisa de uma taxa de chegada constante, ou se quer gRPC e testes de navegador na mesma ferramenta.&lt;/p&gt;
&lt;p&gt;Para uma visão mais ampla, veja nossa análise de &lt;a href=&quot;https://loadtest.app/pt-br/locust-load-testing/&quot;&gt;teste de carga com Locust&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;O Locust é mais rápido que o k6?&lt;/strong&gt;
Não medimos isso nós mesmos, então não apontamos um vencedor. O teste justo é o mesmo cenário nas duas ferramentas, no seu próprio hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O Locust consegue executar scripts k6?&lt;/strong&gt;
Não segundo a documentação do Locust, que descreve testes como código Python em um locustfile. Um script k6 é JavaScript, então precisa ser reescrito como uma classe de usuário Python, e os thresholds viram um listener.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A LoadFocus consegue executar testes Locust?&lt;/strong&gt;
Não. A LoadFocus executa scripts k6 e planos de teste JMeter. Para escalar um teste Locust, use o modo master e workers, o operador Kubernetes ou o Azure Load Testing.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/locust-load-testing/&quot;&gt;Teste de carga com Locust: análise da ferramenta Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/locust-vs-jmeter/&quot;&gt;Locust vs JMeter: scripts Python ou planos de teste JMeter?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-vs-k6/&quot;&gt;Gatling vs k6: simulações JVM ou um binário Go?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/k6-vs-artillery/&quot;&gt;k6 vs Artillery: qual ferramenta de teste de carga escolher&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;Modelo de carga aberto vs fechado: qual usar?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/azure-load-testing/&quot;&gt;Azure Load Testing: análise do serviço da Microsoft&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Coordinated omission: o que é e como evitar</title><link>https://loadtest.app/pt-br/coordinated-omission/</link><guid isPermaLink="true">https://loadtest.app/pt-br/coordinated-omission/</guid><description>Coordinated omission explicada: por que um gerador de carga que espera respostas lentas as esconde, como detectar o erro e como wrk2, k6 e JMeter o evitam.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;A coordinated omission é um erro de medição: um gerador de carga espera cada resposta lenta antes de enviar a próxima requisição, então envia menos justamente quando o sistema está lento e registra poucos dos piores momentos. Os percentis que você lê depois parecem melhores do que aquilo que os usuários viveram. Você evita o erro enviando as requisições num cronograma que ignora os tempos de resposta e medindo cada requisição a partir do momento em que ela deveria ter saído.&lt;/p&gt;
&lt;p&gt;Os fatos sobre as ferramentas vêm da documentação ou do repositório de cada projeto, conferidos em 9 de outubro de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ferramenta&lt;/th&gt;
&lt;th&gt;O que oferece&lt;/th&gt;
&lt;th&gt;O que conferir&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;wrk2&lt;/td&gt;
&lt;td&gt;Uma taxa constante (&lt;code&gt;-R&lt;/code&gt;), latência medida desde o envio previsto&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--u_latency&lt;/code&gt; mostra também a visão sem correção&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HdrHistogram&lt;/td&gt;
&lt;td&gt;Dois métodos que preenchem as amostras que faltam&lt;/td&gt;
&lt;td&gt;Aplicar só um deles, nunca os dois&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;Os executors de taxa de chegada&lt;/td&gt;
&lt;td&gt;O contador &lt;code&gt;dropped_iterations&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;Passos de &lt;code&gt;injectOpen&lt;/code&gt; como &lt;code&gt;constantUsersPerSec&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Os passos ficam dentro de &lt;code&gt;injectOpen&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;&lt;code&gt;constant_throughput&lt;/code&gt; dá o ritmo de cada usuário&lt;/td&gt;
&lt;td&gt;A taxa atingida em relação à meta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;Open Model Thread Group (5.5 ou posterior, experimental)&lt;/td&gt;
&lt;td&gt;Um Thread Group comum é um pool fechado&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;O que é coordinated omission?&lt;/h2&gt;
&lt;p&gt;É o erro que aparece quando o lado que mede para de coletar amostras porque o sistema está lento, de modo que as amostras que faltam são justamente as lentas. Perder amostras ao acaso quase não mexe num percentil; perdê-las no compasso de uma lentidão distorce todos eles.&lt;/p&gt;
&lt;p&gt;O nome vem de Gil Tene, cuja &lt;a href=&quot;https://groups.google.com/g/mechanical-sympathy/c/icNZJejUHfE&quot;&gt;mensagem de 2013 numa lista de discussão&lt;/a&gt; traça essa mesma linha. Ele é o autor original do &lt;a href=&quot;https://hdrhistogram.github.io/HdrHistogram/&quot;&gt;HdrHistogram&lt;/a&gt;, o wrk2 está na conta dele no GitHub, e a documentação dos dois projetos explica o efeito (conferido em 9 de outubro de 2026). A documentação do k6 usa o termo para um modelo de carga fechado que freia a própria carga, uma causa frequente. Nosso artigo sobre o &lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;modelo de carga aberto vs fechado&lt;/a&gt; trata dessa escolha; este fica com a medição.&lt;/p&gt;
&lt;h2&gt;Como um teste de carga acaba escondendo as respostas lentas?&lt;/h2&gt;
&lt;p&gt;Um gerador em loop fechado só envia a próxima requisição numa conexão depois que a resposta anterior chega. Se uma resposta leva um segundo, essa conexão não envia nada por um segundo, e as requisições que ela teria enviado nunca recebem um tempo de resposta.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/giltene/wrk2&quot;&gt;README do wrk2&lt;/a&gt; diz isso sobre o modelo do wrk, que mede cada requisição do primeiro byte enviado até a resposta completa: como uma conexão só envia depois de uma resposta, o gerador se coordena com o servidor e deixa de medir nos períodos de alta latência (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/HdrHistogram/HdrHistogram&quot;&gt;README do HdrHistogram&lt;/a&gt; propõe um experimento mental. Um sistema amostrado a cada 10 ms responde em 1 ms por 100 segundos e depois trava por 100 segundos, o que gera uma única amostra de 100 segundos. O histograma bruto põe cerca de 99,99% dos resultados em 1 ms ou menos; corrigido pelas amostras bloqueadas, só cerca da metade fica ali.&lt;/p&gt;
&lt;h2&gt;Como saber se os seus resultados têm coordinated omission?&lt;/h2&gt;
&lt;p&gt;Compare a taxa enviada com a planejada. Se a taxa de requisições caiu enquanto os tempos de resposta subiam, o gerador recuou e o período lento ficou sub-representado.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A carga foi definida em usuários ou conexões, sem taxa.&lt;/strong&gt; Qualquer loop fechado pode causar o erro.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A taxa de requisições cai onde os tempos de resposta sobem.&lt;/strong&gt; Uma queda na taxa durante um pico significa que houve requisições que nunca saíram.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;O máximo é muito maior que o percentil 99.&lt;/strong&gt; Algumas amostras enormes entre milhares de rápidas são o exemplo acima em miniatura. Leia toda a &lt;a href=&quot;https://loadfocus.com/docs/guides/load-testing/response-time-distribution?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=coordinated-omission&quot;&gt;distribuição dos tempos de resposta&lt;/a&gt;, lembrando que ela só conta requisições enviadas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Faltou CPU ao gerador de carga.&lt;/strong&gt; A LoadFocus documenta que um motor perto de 100% de CPU não consegue enviar na taxa configurada, e os resultados mostram um aviso de &lt;a href=&quot;https://loadfocus.com/docs/guides/load-testing/load-generator-saturation?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=coordinated-omission&quot;&gt;saturação do gerador de carga&lt;/a&gt; quando algum motor atingiu ou passou de 80% de CPU no pico.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Como o wrk2 evita a coordinated omission?&lt;/h2&gt;
&lt;p&gt;Ele envia a uma taxa constante e mede cada requisição a partir do momento em que o plano dizia que ela deveria sair. Uma requisição que sai atrasada porque a conexão estava ocupada carrega a espera.&lt;/p&gt;
&lt;p&gt;O wrk2 acrescenta ao wrk um argumento de taxa (&lt;code&gt;-R&lt;/code&gt;, requisições por segundo no total) e registra as latências num HdrHistogram. &lt;code&gt;--u_latency&lt;/code&gt; acrescenta ao relatório o histograma sem correção, marcado como CO, como no exemplo do próprio README:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wrk -t2 -c100 -d30s -R2000 --u_latency http://127.0.0.1:80/index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No segundo exemplo do README, uma pausa de 1,4 segundo no servidor durante um teste de 30 segundos deixou o percentil 99 corrigido 200 vezes maior que o sem correção. O README também chama o projeto de experimental e avisa que testes com menos de 10 a 20 segundos podem não ser úteis (conferido em 9 de outubro de 2026). Nossa &lt;a href=&quot;https://loadtest.app/pt-br/http-benchmarking-tools/&quot;&gt;análise de ferramentas de benchmark HTTP&lt;/a&gt; compara o wrk2 com hey, oha e outras.&lt;/p&gt;
&lt;h2&gt;Como o HdrHistogram corrige as latências registradas?&lt;/h2&gt;
&lt;p&gt;Se você sabe o intervalo em que as requisições deveriam sair, ele acrescenta as amostras que uma resposta longa bloqueou. A correção pode ser feita durante a gravação ou depois, numa cópia.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;recordValueWithExpectedInterval&lt;/code&gt; registra um valor e, quando ele passa do intervalo, acrescenta valores que descem em passos desse intervalo. &lt;code&gt;copyCorrectedForCoordinatedOmission&lt;/code&gt; devolve uma cópia corrigida de um histograma pronto. O &lt;a href=&quot;https://hdrhistogram.github.io/HdrHistogram/JavaDoc/org/HdrHistogram/AbstractHistogram.html&quot;&gt;JavaDoc&lt;/a&gt; descreve os dois métodos como mutuamente exclusivos (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// intervalo planejado: 10 ms, valores em microssegundos
Histogram h = new Histogram(3);
h.recordValueWithExpectedInterval(latencyUs, 10_000);

// ou, depois do teste, num histograma bruto:
Histogram fixed = raw.copyCorrectedForCoordinatedOmission(10_000);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A correção só é tão boa quanto o intervalo que você passa. Ela serve, portanto, para um gerador que deveria enviar num ritmo constante.&lt;/p&gt;
&lt;h2&gt;Como k6, Gatling, Locust e JMeter lidam com isso?&lt;/h2&gt;
&lt;p&gt;k6, Gatling e JMeter podem iniciar trabalho num cronograma que não espera respostas. O Locust dá o ritmo de cada usuário, mas não consegue iniciar usuários extras para manter uma taxa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;k6.&lt;/strong&gt; Nos executors de taxa de chegada, &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/constant-arrival-rate/&quot;&gt;as iterações começam independentemente da resposta do sistema&lt;/a&gt; enquanto houver um usuário virtual livre. Quando não há, o k6 pula a iteração e a conta em &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/dropped-iterations/&quot;&gt;&lt;code&gt;dropped_iterations&lt;/code&gt;&lt;/a&gt;, o que, já perto do fim de um teste, pode indicar que o sistema está se degradando (conferido em 9 de outubro de 2026). Uma iteração descartada não tem tempo de resposta, então leia esse contador ao lado dos percentis. Na LoadFocus, os cenários de taxa de chegada dos &lt;a href=&quot;https://loadfocus.com/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=coordinated-omission&quot;&gt;scripts k6&lt;/a&gt; rodam com um número fixo de usuários, ou seja, como modelo fechado. Rode o k6 por conta própria quando a taxa de chegada for o objetivo do teste.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gatling.&lt;/strong&gt; Passos como &lt;code&gt;constantUsersPerSec&lt;/code&gt; dentro de &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;&lt;code&gt;injectOpen&lt;/code&gt;&lt;/a&gt; iniciam novos usuários virtuais a uma taxa fixa, tenham os anteriores terminado ou não (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Locust.&lt;/strong&gt; &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;&lt;code&gt;constant_throughput&lt;/code&gt;&lt;/a&gt; ajusta a espera de cada usuário para que ele execute uma tarefa no máximo um certo número de vezes por segundo. A documentação diz que o tempo de espera só consegue limitar a taxa e não inicia novos usuários, e a &lt;a href=&quot;https://docs.locust.io/en/stable/api.html&quot;&gt;referência da API&lt;/a&gt; acrescenta que uma tarefa que passa do intervalo não é seguida de espera. Uma resposta lenta atrasa esse usuário mesmo assim (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JMeter.&lt;/strong&gt; Um &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Thread_Group&quot;&gt;Thread Group&lt;/a&gt; é um pool de threads que repetem o plano em loop, ou seja, um loop fechado. O JMeter 5.5 trouxe o &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Open_Model_Thread_Group&quot;&gt;Open Model Thread Group&lt;/a&gt;, experimental, que segue um cronograma como &lt;code&gt;rate(1/sec) random_arrivals(2 min)&lt;/code&gt; e, segundo as &lt;a href=&quot;https://jmeter.apache.org/changes_history.html&quot;&gt;notas de versão&lt;/a&gt;, cria threads conforme a necessidade (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Um modelo de carga aberto elimina a coordinated omission?&lt;/h2&gt;
&lt;p&gt;Ele elimina a causa principal, um gerador que espera antes de enviar. Ficam duas brechas: um gerador sem usuários ou CPU suficientes ainda fica para trás no cronograma, e cada usuário de uma jornada com várias etapas continua esperando as próprias respostas.&lt;/p&gt;
&lt;p&gt;A primeira aparece como iterações descartadas ou como um motor saturado; nos dois casos, repita o teste com mais folga. A segunda vem com a maioria dos testes HTTP: o README do wrk2 observa que enviar sem esperar só funciona com protocolos não bloqueantes ou com uma requisição por conexão, e por isso o wrk2 corrige a medição do tempo.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Quem deu nome à coordinated omission?&lt;/strong&gt;
Gil Tene, o autor original do HdrHistogram, cujo fork wrk2 do wrk foi pensado para evitá-la. A mensagem dele de 2013 na lista de discussão mechanical-sympathy a descreve como um problema que ele chama por esse nome.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coordinated omission é a mesma coisa que um modelo de carga fechado?&lt;/strong&gt;
Os dois estão ligados. Um modelo fechado é uma causa frequente, porque cada usuário virtual espera a resposta antes de enviar de novo, e o README do wrk2 também encontra o efeito em código de monitoramento.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;É preciso corrigir todo histograma de latência?&lt;/strong&gt;
Só quando você conhece o intervalo em que as requisições estavam planejadas, porque o HdrHistogram precisa dele para preencher as amostras que faltam. Aplique a um conjunto de dados um dos dois métodos de correção, nunca os dois.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;Modelo de carga aberto vs fechado: qual usar e quando&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/http-benchmarking-tools/&quot;&gt;Ferramentas de benchmark HTTP: wrk, hey, oha, ab e mais&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/load-test-pass-fail-criteria/&quot;&gt;Critérios de aprovação de um teste de carga: como definir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/throughput-vs-latency/&quot;&gt;Vazão vs latência: como se relacionam sob carga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/tail-latency/&quot;&gt;Latência de cauda: o que é e como medir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/ycsb/&quot;&gt;YCSB: cargas de trabalho A-F, execução e limites&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Teste de carga com Gatling: análise da ferramenta JVM</title><link>https://loadtest.app/pt-br/gatling-load-testing/</link><guid isPermaLink="true">https://loadtest.app/pt-br/gatling-load-testing/</guid><description>Teste de carga com Gatling: simulações, injeção aberta ou fechada, checks, asserções, relatório HTML, plugins de build, CI, limites e quando usar o k6.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, que vende um serviço de teste de carga abordado neste artigo.&lt;/p&gt;&lt;p&gt;O Gatling é uma ferramenta gratuita de teste de carga sob licença Apache 2.0, em que cada teste é uma simulação escrita como código, executada na JVM e seguida de um relatório HTML. O teste de carga com Gatling combina com equipes de desenvolvimento que querem os testes no repositório, modelos de carga abertos ou fechados e asserções que façam o build falhar. Quem quer um editor gráfico de testes ou muitos protocolos fica mais bem servido pelo JMeter, e quem quer um único binário sem JVM, pelo k6.&lt;/p&gt;
&lt;p&gt;Não rodamos o Gatling para esta análise. Os fatos vêm da documentação, do repositório e das páginas de versões do Gatling, conferidos em 9 de outubro de 2026, e as avaliações são nossas.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tema&lt;/th&gt;
&lt;th&gt;Gatling&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licença&lt;/td&gt;
&lt;td&gt;Apache 2.0, exceto os plugins de gRPC, MQTT e GraphQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ambiente&lt;/td&gt;
&lt;td&gt;JVM, OpenJDK LTS de 64 bits do 11 ao 25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versão atual&lt;/td&gt;
&lt;td&gt;3.16.0 (29 de setembro de 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testes escritos em&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript, TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocolos embutidos&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSocket, SSE, JMS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resultados&lt;/td&gt;
&lt;td&gt;Relatório HTML estático por execução&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build e CI&lt;/td&gt;
&lt;td&gt;Plugins para Maven, Gradle, sbt e npm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escala&lt;/td&gt;
&lt;td&gt;Gatling Enterprise (comercial)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Quem desenvolve o Gatling, e ele ainda é mantido?&lt;/h2&gt;
&lt;p&gt;A Gatling Corp, uma empresa francesa, desenvolve o Gatling e detém seus direitos autorais. O projeto é mantido ativamente, com três versões para a JVM até agora em 2026.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://docs.gatling.io/project/licenses/project-licenses/&quot;&gt;página de licenças&lt;/a&gt; atribui os direitos autorais à Gatling Corp. O &lt;a href=&quot;https://repo1.maven.org/maven2/io/gatling/gatling-core/&quot;&gt;Maven Central&lt;/a&gt; lista a 3.15.0 em fevereiro, a 3.15.1 em maio e a 3.16.0 em 29 de setembro de 2026, e o SDK de JavaScript chegou à &lt;a href=&quot;https://github.com/gatling/gatling-js/releases/tag/v3.16.1&quot;&gt;3.16.1&lt;/a&gt; em 6 de outubro. As &lt;a href=&quot;https://docs.gatling.io/release-notes/gatling/whats-new/3.16/&quot;&gt;notas da versão 3.16&lt;/a&gt; trazem GraphQL e filas compartilhadas entre usuários virtuais. O &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; apresenta o repositório como a Community Edition, de uso livre inclusive comercial (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Do que você precisa para rodar o Gatling?&lt;/h2&gt;
&lt;p&gt;De uma JVM de 64 bits para Java, Kotlin ou Scala, ou de Node.js para JavaScript e TypeScript. Nos dois casos, a simulação em si roda numa JVM.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://docs.gatling.io/reference/deploy/install-local/&quot;&gt;página de instalação&lt;/a&gt; suporta as versões LTS do OpenJDK do 11 ao 25 e exclui JVMs de 32 bits e o OpenJ9. A &lt;a href=&quot;https://docs.gatling.io/integrations/build-tools/js-cli/&quot;&gt;CLI de JavaScript&lt;/a&gt; exige Node.js 24 ou mais recente e baixa um pacote de execução do Gatling e, segundo o &lt;a href=&quot;https://github.com/gatling/gatling-js&quot;&gt;README do gatling-js&lt;/a&gt;, o GraalVM (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Como uma simulação do Gatling é estruturada?&lt;/h2&gt;
&lt;p&gt;Uma simulação define cenários, dá a cada um um perfil de injeção e anexa uma configuração de protocolo, tudo registrado numa única chamada a &lt;code&gt;setUp&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Na &lt;a href=&quot;https://docs.gatling.io/concepts/simulation/&quot;&gt;referência de simulações&lt;/a&gt;, um cenário encadeia requisições com pausas, laços e condições. Esta simulação em Java guarda o id de um produto vindo de uma busca, pausa de um a três segundos e abre o produto, enquanto as chegadas sobem para 20 usuários por segundo e se mantêm por dez minutos:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class ShopSimulation extends Simulation {

  HttpProtocolBuilder api =
      http.baseUrl(&amp;quot;https://staging.example.com&amp;quot;);

  ScenarioBuilder shoppers = scenario(&amp;quot;Shoppers&amp;quot;)
      .exec(http(&amp;quot;search&amp;quot;).get(&amp;quot;/api/products?q=lamp&amp;quot;)
          .check(jsonPath(&amp;quot;$[0].id&amp;quot;).saveAs(&amp;quot;id&amp;quot;)))
      .pause(1, 3)
      .exec(http(&amp;quot;product&amp;quot;).get(&amp;quot;/api/products/#{id}&amp;quot;));

  {
    setUp(shoppers.injectOpen(
        rampUsersPerSec(1).to(20).during(120),
        constantUsersPerSec(20).during(600)))
      .protocols(api)
      .assertions(
          global().responseTime().percentile(95.0).lt(800));
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Os imports foram omitidos, e &lt;code&gt;#{id}&lt;/code&gt; lê o valor guardado pela &lt;a href=&quot;https://docs.gatling.io/concepts/session/el/&quot;&gt;Expression Language&lt;/a&gt; do Gatling. &lt;a href=&quot;https://loadtest.app/pt-br/gatling-vs-k6/&quot;&gt;Gatling vs k6&lt;/a&gt; mostra uma simulação em JavaScript.&lt;/p&gt;
&lt;h2&gt;Você deve injetar usuários no modelo aberto ou fechado?&lt;/h2&gt;
&lt;p&gt;Aberto, para a maioria dos sites e APIs, onde novos usuários continuam chegando por mais lento que o sistema fique. O fechado serve para sistemas que limitam a concorrência, como uma fila de venda de ingressos.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;referência de injeção&lt;/a&gt; divide a API: &lt;code&gt;injectOpen&lt;/code&gt; recebe taxas de chegada como &lt;code&gt;rampUsersPerSec&lt;/code&gt;, e &lt;code&gt;injectClosed&lt;/code&gt;, metas de concorrência como &lt;code&gt;constantConcurrentUsers&lt;/code&gt;. A &lt;a href=&quot;https://docs.gatling.io/testing-concepts/workload-models/&quot;&gt;página sobre modelos de carga&lt;/a&gt; diz que a maioria dos sites se comporta como sistema aberto e que um perfil não pode misturar os dois (conferido em 9 de outubro de 2026). Nosso guia sobre o &lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;modelo de carga aberto vs fechado&lt;/a&gt; explica como escolher.&lt;/p&gt;
&lt;h2&gt;Como funcionam os checks, as asserções e o relatório?&lt;/h2&gt;
&lt;p&gt;Os checks verificam cada resposta e podem guardar valores dela, enquanto as asserções julgam a execução inteira quando ela termina. Depois, cada execução gera um relatório HTML.&lt;/p&gt;
&lt;p&gt;Sem um check de status explícito, o Gatling &lt;a href=&quot;https://docs.gatling.io/reference/script/http/checks/&quot;&gt;verifica&lt;/a&gt; se cada resposta HTTP é 2XX ou 304. As &lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;asserções&lt;/a&gt; avaliam tempos de resposta, número de requisições ou requisições por segundo, no total ou por requisição, e uma única asserção com falha faz a simulação falhar. O &lt;a href=&quot;https://docs.gatling.io/reference/stats/reports/oss/&quot;&gt;relatório HTML&lt;/a&gt; mostra faixas de tempo de resposta e percentis, usuários iniciados por segundo, usuários simultâneos e requisições por segundo; seus percentis ao longo do tempo contam só as requisições bem-sucedidas (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Como o Gatling se encaixa no build e na CI?&lt;/h2&gt;
&lt;p&gt;Pelo plugin para Maven, Gradle, sbt ou npm, que roda em qualquer sistema de CI. Uma asserção com falha faz o build falhar.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://docs.gatling.io/integrations/build-tools/maven-plugin/&quot;&gt;plugin do Maven&lt;/a&gt; liga &lt;code&gt;gatling:test&lt;/code&gt; à fase &lt;code&gt;integration-test&lt;/code&gt;, então &lt;code&gt;mvn verify&lt;/code&gt; o executa, e com &lt;code&gt;CI=true&lt;/code&gt; ele deixa de perguntar qual simulação rodar (a execução então falha se o projeto tiver mais de uma simulação e nenhuma for indicada). O &lt;a href=&quot;https://docs.gatling.io/integrations/build-tools/gradle-plugin/&quot;&gt;plugin do Gradle&lt;/a&gt; usa &lt;code&gt;gatlingRun&lt;/code&gt;, e o &lt;a href=&quot;https://docs.gatling.io/integrations/build-tools/sbt-plugin/&quot;&gt;plugin do sbt&lt;/a&gt; aceita só simulações em Scala. As &lt;a href=&quot;https://docs.gatling.io/integrations/ci-cd/&quot;&gt;integrações de CI&lt;/a&gt; prontas do Gatling, como a sua GitHub Action, disparam execuções no Gatling Enterprise (conferido em 9 de outubro de 2026). Nosso &lt;a href=&quot;https://loadtest.app/pt-br/load-testing-in-github-actions/&quot;&gt;guia de GitHub Actions&lt;/a&gt; cobre o lado do workflow.&lt;/p&gt;
&lt;h2&gt;Quais protocolos o Gatling suporta?&lt;/h2&gt;
&lt;p&gt;HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events e JMS vêm sem limites. gRPC, MQTT e GraphQL são plugins à parte, limitados a 5 usuários e 5 minutos fora do Gatling Enterprise.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; coloca os cinco primeiros sob Apache 2.0. As páginas de configuração de &lt;a href=&quot;https://docs.gatling.io/reference/script/grpc/setup/&quot;&gt;gRPC&lt;/a&gt;, &lt;a href=&quot;https://docs.gatling.io/reference/script/mqtt/setup/&quot;&gt;MQTT&lt;/a&gt; e &lt;a href=&quot;https://docs.gatling.io/reference/script/graphql/setup/&quot;&gt;GraphQL&lt;/a&gt; põem cada plugin sob a Gatling Enterprise Component License: sem limites no Gatling Enterprise, enquanto um teste com a Community Edition para em 5 usuários ou 5 minutos. Essa &lt;a href=&quot;https://docs.gatling.io/project/licenses/enterprise-component/&quot;&gt;licença&lt;/a&gt; concede uso gratuito por até um ano, apenas para testar internamente as suas próprias aplicações web; ela termina assim que um limite é atingido, e a Gatling Corp pode mudar esses limites. O GraphQL exige a 3.16.0 ou mais recente. As notas da versão e o README dizem que o SDK de JavaScript ainda não tem suporte a ele, embora a página de configuração já mostre um pacote npm, então confira antes de planejar um teste de GraphQL em JavaScript (conferido em 9 de outubro de 2026). Nosso guia sobre &lt;a href=&quot;https://loadtest.app/pt-br/how-to-load-test-a-graphql-api/&quot;&gt;teste de carga em uma API GraphQL&lt;/a&gt; contorna o limite com requisições HTTP comuns.&lt;/p&gt;
&lt;h2&gt;O que o Gatling Enterprise acrescenta?&lt;/h2&gt;
&lt;p&gt;O Gatling Enterprise é a edição comercial sobre o mesmo motor. Ele gera carga a partir de infraestrutura gerenciada ou privada, coisa que a edição gratuita não faz.&lt;/p&gt;
&lt;p&gt;Segundo o README, o Enterprise roda os testes em geradores de carga gerenciados ou nas suas próprias contas de AWS, Azure, GCP ou Kubernetes, e acrescenta painéis ao vivo, tendências, equipes com SSO e integrações de CI/CD. O &lt;a href=&quot;https://docs.gatling.io/tutorials/faq/&quot;&gt;FAQ&lt;/a&gt; diz que a Community Edition não suporta testes distribuídos e que as simulações passam para o Enterprise sem alterações (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;A LoadFocus, que publica este site, não roda simulações do Gatling. Ela &lt;a href=&quot;https://loadfocus.com/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-load-testing&quot;&gt;roda planos de teste JMeter e scripts k6&lt;/a&gt; a partir de 25 regiões de nuvem, então para o Gatling o caminho para mais máquinas é o Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;O que o Gatling faz bem, e onde estão seus limites?&lt;/h2&gt;
&lt;p&gt;Ele se destaca em testes como código revisável, em modelos de carga e em relatórios sem configuração. É mais fraco em protocolos além da web e de mensageria, e em escalar de graça além de uma máquina.&lt;/p&gt;
&lt;p&gt;O README destaca o motor: não bloqueante, construído sobre o Netty, com cada usuário virtual sendo uma mensagem leve. Limites que a própria documentação aponta (conferido em 9 de outubro de 2026):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;O Gatling não é um navegador: segundo a &lt;a href=&quot;https://docs.gatling.io/reference/script/http/protocol/&quot;&gt;página do protocolo HTTP&lt;/a&gt;, ele não executa JavaScript.&lt;/li&gt;
&lt;li&gt;O SDK de JavaScript não tem &lt;a href=&quot;https://docs.gatling.io/reference/script/jms/&quot;&gt;JMS&lt;/a&gt; e não pode usar bibliotecas npm que precisem de binários nativos ou de APIs próprias do Node.js.&lt;/li&gt;
&lt;li&gt;O cache HTTP vem ligado por padrão, o que pode reduzir a contagem de requisições.&lt;/li&gt;
&lt;li&gt;O formato do &lt;code&gt;simulation.log&lt;/code&gt; não é documentado e pode mudar a qualquer momento.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Quando escolher k6, JMeter ou Locust em vez do Gatling?&lt;/h2&gt;
&lt;p&gt;Escolha outra ferramenta quando a linguagem, os protocolos ou o caminho gratuito para escalar dela combinarem melhor com a sua equipe.&lt;/p&gt;
&lt;p&gt;Nossa visão geral de &lt;a href=&quot;https://loadtest.app/pt-br/open-source-load-testing-tools/&quot;&gt;ferramentas de teste de carga open source&lt;/a&gt; coloca o Gatling ao lado de outras cinco.&lt;/p&gt;
&lt;p&gt;Escolha o &lt;strong&gt;k6&lt;/strong&gt; se você quer na CI &lt;a href=&quot;https://grafana.com/docs/k6/latest/set-up/install-k6/&quot;&gt;um único binário&lt;/a&gt; sem JVM, &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; capazes de parar cedo uma execução com falha ou gRPC entre os seus &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/protocols/&quot;&gt;protocolos embutidos&lt;/a&gt; (conferido em 9 de outubro de 2026). &lt;a href=&quot;https://loadtest.app/pt-br/gatling-vs-k6/&quot;&gt;Gatling vs k6&lt;/a&gt; compara os dois.&lt;/p&gt;
&lt;p&gt;Escolha o &lt;strong&gt;JMeter&lt;/strong&gt; se os seus testadores montam testes numa interface gráfica, ou se você precisa de JDBC, LDAP ou FTP no &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;núcleo&lt;/a&gt; (conferido em 9 de outubro de 2026). A LoadFocus &lt;a href=&quot;https://loadfocus.com/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-load-testing&quot;&gt;roda planos de teste JMeter existentes&lt;/a&gt; a partir de 25 regiões de nuvem, e &lt;a href=&quot;https://loadtest.app/pt-br/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter&lt;/a&gt; se aprofunda.&lt;/p&gt;
&lt;p&gt;Escolha o &lt;strong&gt;Locust&lt;/strong&gt; se a sua equipe escreve Python e quer um &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;modo distribuído&lt;/a&gt; na ferramenta gratuita (conferido em 9 de outubro de 2026). Nossa &lt;a href=&quot;https://loadtest.app/pt-br/locust-load-testing/&quot;&gt;análise do Locust&lt;/a&gt; trata dele.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;O Gatling é gratuito para uso comercial?&lt;/strong&gt;
Sim. A Community Edition está sob Apache 2.0. Os plugins de gRPC, MQTT e GraphQL têm licença própria e param em 5 usuários e 5 minutos fora do Gatling Enterprise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;É preciso ter Java para usar o Gatling?&lt;/strong&gt;
Para Java, Kotlin ou Scala, sim: um OpenJDK LTS de 64 bits do 11 ao 25. O SDK de JavaScript precisa do Node.js 24 ou mais recente, e a CLI dele baixa sozinha o ambiente JVM.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A LoadFocus consegue rodar testes do Gatling?&lt;/strong&gt;
Não. A LoadFocus roda planos de teste JMeter e scripts k6. Para distribuir uma simulação do Gatling por várias máquinas, use o Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter: testes como código ou plano na GUI?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-vs-k6/&quot;&gt;Gatling vs k6: simulações na JVM ou um único binário Go?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-source-load-testing-tools/&quot;&gt;Ferramentas de teste de carga open source: seis opções&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-vs-locust/&quot;&gt;Gatling vs Locust: simulações na JVM ou locustfiles Python?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/nbomber-load-testing/&quot;&gt;Teste de carga com NBomber: análise do framework .NET&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Gatling vs JMeter: testes como código ou plano na GUI?</title><link>https://loadtest.app/pt-br/gatling-vs-jmeter/</link><guid isPermaLink="true">https://loadtest.app/pt-br/gatling-vs-jmeter/</guid><description>Gatling e JMeter comparados em licença, scripts, protocolos, gravadores, modelos de carga, escala, CI e relatórios, com dicas claras para escolher.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, que vende um serviço de teste de carga abordado neste artigo.&lt;/p&gt;&lt;p&gt;Gatling e Apache JMeter são ferramentas de teste de carga gratuitas e open source que rodam na JVM, e a escolha depende principalmente de como o seu time quer construir os testes. Escolha o Gatling se você quer testes como código em Java, Kotlin, Scala, JavaScript ou TypeScript, perfis de injeção abertos e um relatório HTML depois de cada execução. Escolha o JMeter se você precisa de protocolos como JDBC, LDAP, FTP ou e-mail sem instalar nada a mais, prefere montar os testes em uma interface gráfica ou já tem planos de teste &lt;code&gt;.jmx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Os dados desta comparação Gatling vs JMeter vêm da documentação e do repositório de cada projeto, conferidos em 9 de outubro de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Gatling&lt;/th&gt;
&lt;th&gt;Apache JMeter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licença&lt;/td&gt;
&lt;td&gt;Apache 2.0; gRPC, MQTT e GraphQL sob uma licença de componentes separada (&lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;repositório&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;Apache 2.0 (&lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;repositório&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ambiente de execução&lt;/td&gt;
&lt;td&gt;JVM, OpenJDK LTS 11 a 25 (versão 3.16.0)&lt;/td&gt;
&lt;td&gt;JVM, Java 8 ou mais recente (versão 5.6.3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testes escritos como&lt;/td&gt;
&lt;td&gt;Código em Java, Kotlin, Scala, JavaScript ou TypeScript&lt;/td&gt;
&lt;td&gt;Planos de teste montados em uma interface gráfica e salvos em XML (&lt;code&gt;.jmx&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocolos nativos&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events, JMS&lt;/td&gt;
&lt;td&gt;HTTP(S), SOAP/REST, FTP, JDBC, LDAP, JMS, e-mail, TCP, comandos de shell, objetos Java&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gravador&lt;/td&gt;
&lt;td&gt;Proxy HTTP ou conversor de arquivos HAR&lt;/td&gt;
&lt;td&gt;HTTP(S) Test Script Recorder (proxy)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modelo de carga&lt;/td&gt;
&lt;td&gt;Perfis de injeção abertos ou fechados&lt;/td&gt;
&lt;td&gt;Thread Groups; um Open Model Thread Group experimental&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escala&lt;/td&gt;
&lt;td&gt;Uma máquina; execuções distribuídas exigem o Gatling Enterprise&lt;/td&gt;
&lt;td&gt;Modo remoto nativo, um cliente controlando vários servidores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI e execução sem interface&lt;/td&gt;
&lt;td&gt;Plugins para Maven, Gradle, sbt e npm; uma assertion com falha derruba a execução&lt;/td&gt;
&lt;td&gt;Modo CLI (&lt;code&gt;jmeter -n&lt;/code&gt;); plugins de terceiros para Maven, Gradle e Jenkins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relatórios&lt;/td&gt;
&lt;td&gt;Relatório HTML depois de cada execução&lt;/td&gt;
&lt;td&gt;Dashboard HTML; resultados ao vivo por um Backend Listener&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qual é a diferença entre Gatling e JMeter?&lt;/h2&gt;
&lt;p&gt;No Gatling, um teste é um programa dentro de um projeto de build. No JMeter, um teste é uma árvore de elementos que você monta em uma interface gráfica de desktop e salva como arquivo XML, e daí vem a maior parte das outras diferenças.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; do Gatling chama os testes de simulações e os guarda no seu repositório como código da aplicação, executados por um plugin de Maven, Gradle, sbt ou npm. O &lt;a href=&quot;https://github.com/gatling/gatling-js&quot;&gt;SDK de JavaScript e TypeScript&lt;/a&gt; é instalado pelo npm e baixa o próprio ambiente GraalVM.&lt;/p&gt;
&lt;p&gt;Um plano do JMeter tem um Thread Group para os usuários, samplers para as requisições e assertions e listeners para os resultados. O JMeter 5.6.3, versão atual na &lt;a href=&quot;https://jmeter.apache.org/download_jmeter.cgi&quot;&gt;página de download&lt;/a&gt;, exige Java 8 ou mais recente. O README do &lt;a href=&quot;https://github.com/apache/jmeter/blob/master/README.md&quot;&gt;branch de desenvolvimento&lt;/a&gt; do JMeter já exige Java 17 (conferido em 10 de outubro de 2026). Por baixo, o JMeter roda cada usuário virtual como uma thread Java, enquanto o README do Gatling descreve os usuários virtuais como mensagens leves em um motor não bloqueante construído sobre o Netty.&lt;/p&gt;
&lt;h2&gt;Como escrever um teste em cada ferramenta?&lt;/h2&gt;
&lt;p&gt;No Gatling, você escreve uma classe de simulação que define um cenário, um perfil de injeção e assertions. No JMeter, você adiciona um Thread Group e samplers na interface gráfica, salva o plano e depois roda esse arquivo pela linha de comando.&lt;/p&gt;
&lt;p&gt;Uma simulação em Java baseada no &lt;a href=&quot;https://docs.gatling.io/tutorials/test-as-code/java-jvm/running-your-first-simulation/&quot;&gt;tutorial da primeira simulação&lt;/a&gt; do Gatling: novos usuários chegam primeiro a um por segundo, sobem para dez por segundo em um minuto e ficam nesse ritmo por cinco minutos. A execução falha se o percentil 95 passar de 500 ms ou se mais de 1% das requisições falharem:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import static io.gatling.javaapi.core.CoreDsl.*;
import static io.gatling.javaapi.http.HttpDsl.*;

import io.gatling.javaapi.core.*;
import io.gatling.javaapi.http.*;

public class ApiSimulation extends Simulation {

  HttpProtocolBuilder httpProtocol =
      http.baseUrl(&amp;quot;https://staging.example.com&amp;quot;);

  ScenarioBuilder users = scenario(&amp;quot;API users&amp;quot;)
      .exec(http(&amp;quot;list users&amp;quot;).get(&amp;quot;/api/users&amp;quot;))
      .pause(1);

  {
    setUp(users.injectOpen(
            rampUsersPerSec(1).to(10).during(60),
            constantUsersPerSec(10).during(300)))
        .protocols(httpProtocol)
        .assertions(
            global().responseTime().percentile(95.0).lt(500),
            global().failedRequests().percent().lt(1.0));
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rode com &lt;code&gt;./mvnw gatling:test&lt;/code&gt;; uma simulação em JavaScript ou TypeScript roda com &lt;code&gt;npx gatling run&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;No JMeter, o mesmo teste é um Thread Group com um sampler HTTP Request, e uma Duration Assertion pode marcar como falha cada resposta lenta. O &lt;a href=&quot;https://jmeter.apache.org/usermanual/get-started.html&quot;&gt;guia de primeiros passos&lt;/a&gt; monta o plano no modo GUI e roda no modo CLI, e &lt;code&gt;-e -o&lt;/code&gt; acrescenta o relatório HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;jmeter -n -t api-users.jmx -l results.jtl -e -o report/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As duas ferramentas conseguem gravar um primeiro rascunho a partir do navegador. O &lt;a href=&quot;https://docs.gatling.io/reference/script/http/recorder/&quot;&gt;Recorder&lt;/a&gt; do Gatling funciona como proxy HTTP ou converte um arquivo HAR em simulação, e o &lt;a href=&quot;https://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.html&quot;&gt;HTTP(S) Test Script Recorder&lt;/a&gt; do JMeter captura o tráfego do navegador em um plano (conferido em 9 de outubro de 2026). A documentação do Gatling já trata esse Recorder como legado, e o mais novo &lt;a href=&quot;https://docs.gatling.io/tutorials/low-code/browser/studio/&quot;&gt;Gatling Studio&lt;/a&gt; exige uma conta do Enterprise para fazer login (conferido em 10 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Quais protocolos cada ferramenta consegue testar?&lt;/h2&gt;
&lt;p&gt;O JMeter cobre mais protocolos de fábrica. O Gatling traz os principais protocolos web mais JMS e deixa quase todo o resto para componentes separados ou plugins da comunidade.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;README&lt;/a&gt; do JMeter lista todos os protocolos da tabela acima, e-mail incluído. JDBC e JMS precisam dos JARs de driver do seu banco de dados ou do seu provedor JMS, e o &lt;a href=&quot;https://jmeter-plugins.org/install/Install/&quot;&gt;Plugins Manager&lt;/a&gt; instala plugins da comunidade pela própria interface gráfica.&lt;/p&gt;
&lt;p&gt;Segundo o README do Gatling, gRPC, MQTT e GraphQL são componentes separados sob a Gatling Enterprise Component License e, sem o Enterprise, ficam limitados a cinco usuários simultâneos e a testes de cinco minutos. Kafka, AMQP, SFTP, FTP e JDBC vêm de &lt;a href=&quot;https://docs.gatling.io/reference/script/third-parties/&quot;&gt;plugins de terceiros&lt;/a&gt; para o Gatling 3.13 que o Gatling não mantém (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Como o Gatling e o JMeter modelam a carga?&lt;/h2&gt;
&lt;p&gt;O Gatling faz você escolher entre um modelo aberto e um fechado no próprio script. O Thread Group clássico do JMeter é um grupo fechado de usuários, e carga baseada em chegadas exige o Open Model Thread Group, mais recente.&lt;/p&gt;
&lt;p&gt;No Gatling, &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;&lt;code&gt;injectOpen&lt;/code&gt;&lt;/a&gt; recebe taxas de chegada como &lt;code&gt;constantUsersPerSec&lt;/code&gt; e &lt;code&gt;rampUsersPerSec&lt;/code&gt;, e &lt;code&gt;injectClosed&lt;/code&gt; recebe metas de concorrência como &lt;code&gt;constantConcurrentUsers&lt;/code&gt;. O JMeter 5.5 trouxe o &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Open_Model_Thread_Group&quot;&gt;Open Model Thread Group&lt;/a&gt;, que a referência ainda marca como experimental (conferido em 9 de outubro de 2026). Nosso guia sobre o &lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;modelo de carga aberto vs fechado&lt;/a&gt; explica por que essa escolha importa.&lt;/p&gt;
&lt;h2&gt;Como distribuir um teste entre várias máquinas?&lt;/h2&gt;
&lt;p&gt;O JMeter tem um modo distribuído nativo. A edição open source do Gatling gera carga a partir de uma máquina, e a documentação exige uma conta do Gatling Enterprise para execuções distribuídas.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://jmeter.apache.org/usermanual/remote-test.html&quot;&gt;modo de teste remoto&lt;/a&gt; do JMeter deixa um cliente controlar qualquer número de servidores. Cada servidor roda o plano inteiro, então 1.000 threads em seis servidores viram 6.000 threads. Todos os nós devem rodar a mesma versão do JMeter e do Java, o RMI precisa de um keystore a menos que o SSL esteja desativado, e os arquivos de dados precisam ser copiados para cada servidor.&lt;/p&gt;
&lt;p&gt;Existe um terceiro caminho para planos de teste do JMeter. A LoadFocus, que publica este site, &lt;a href=&quot;https://loadfocus.com/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-vs-jmeter&quot;&gt;roda planos de teste JMeter existentes&lt;/a&gt; sem alterações a partir de 25 regiões de nuvem, sem servidores remotos para configurar. A LoadFocus não roda simulações do Gatling.&lt;/p&gt;
&lt;h2&gt;Como eles se encaixam na CI, e quais relatórios você recebe?&lt;/h2&gt;
&lt;p&gt;Os dois rodam sem interface. As assertions do Gatling podem derrubar o build diretamente, enquanto as do JMeter marcam amostras individuais e a integração com CI vem de bibliotecas de terceiros.&lt;/p&gt;
&lt;p&gt;As &lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;assertions&lt;/a&gt; do Gatling são verificadas depois da execução, e uma única assertion com falha derruba a simulação e a tarefa de build. O &lt;a href=&quot;https://docs.gatling.io/reference/stats/reports/oss/&quot;&gt;relatório HTML&lt;/a&gt; mostra percentis do tempo de resposta, usuários iniciados por segundo, usuários simultâneos e requisições por segundo ao longo do tempo.&lt;/p&gt;
&lt;p&gt;O modo CLI do JMeter não tem critérios de aprovação, então uma meta não atingida só derruba o build pelas bibliotecas para Maven, Gradle e Jenkins que o README dele lista, ou por uma checagem própria. O &lt;a href=&quot;https://jmeter.apache.org/usermanual/generating-dashboard.html&quot;&gt;dashboard&lt;/a&gt; do JMeter traz uma tabela APDEX, uma tabela de estatísticas com três percentis configuráveis e resumos de erros, e um Backend Listener envia resultados ao vivo para InfluxDB ou Graphite.&lt;/p&gt;
&lt;h2&gt;Qual escolher?&lt;/h2&gt;
&lt;p&gt;Escolha o Gatling quando o seu time escreve Java, Kotlin, Scala ou TypeScript e quer revisar os testes de carga como o resto do código. Escolha o JMeter em vez do Gatling quando você precisa de protocolos além da web, quando seus testers preferem uma interface gráfica ou quando você já tem planos &lt;code&gt;.jmx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;O Gatling combina com times que descrevem o tráfego como taxas de chegada e querem regras de aprovação ou falha ao lado do cenário, com um relatório legível sem configuração extra.&lt;/p&gt;
&lt;p&gt;O JMeter é a melhor escolha para testar JDBC, LDAP, FTP ou e-mail, para testers que refinam visualmente um fluxo gravado e para execuções distribuídas nos seus próprios servidores sem licença comercial. Uma empresa que já usa o JMeter também mantém seus planos, plugins e conhecimento.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;O Gatling é mais rápido que o JMeter?&lt;/strong&gt;
Não medimos isso nós mesmos, então não vamos apontar um vencedor. O teste justo é o mesmo cenário nas duas ferramentas, no seu próprio hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O Gatling consegue rodar arquivos .jmx do JMeter?&lt;/strong&gt;
Não diretamente. O Gatling roda simulações escritas com os SDKs dele, então um plano do JMeter precisa ser reescrito. O README do Gatling cita extensões de IA que convertem planos de teste do JMeter, e elas exigem um token de API do Gatling Enterprise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A LoadFocus consegue rodar testes do Gatling?&lt;/strong&gt;
Não. A LoadFocus roda planos de teste JMeter e scripts k6. Para distribuir uma simulação do Gatling entre várias máquinas, use o Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-load-testing/&quot;&gt;Teste de carga com Gatling: análise da ferramenta JVM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-vs-k6/&quot;&gt;Gatling vs k6: simulações na JVM ou um único binário Go?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/locust-vs-jmeter/&quot;&gt;Locust vs JMeter: scripts Python ou planos do JMeter?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;Modelo de carga aberto vs fechado: qual usar e quando&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/k6-vs-artillery/&quot;&gt;k6 vs Artillery: qual ferramenta de teste de carga escolher&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-vs-locust/&quot;&gt;Gatling vs Locust: simulações na JVM ou locustfiles Python?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/jmeter-vs-postman/&quot;&gt;JMeter vs Postman: qual ferramenta para teste de carga?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Gatling vs k6: simulações na JVM ou um único binário Go?</title><link>https://loadtest.app/pt-br/gatling-vs-k6/</link><guid isPermaLink="true">https://loadtest.app/pt-br/gatling-vs-k6/</guid><description>Gatling vs k6 comparados em licença, execução, linguagens, protocolos, modelos de carga, critérios de aprovação e escala, com dicas para escolher.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, que vende um serviço de teste de carga abordado neste artigo.&lt;/p&gt;&lt;p&gt;Gatling e k6 são ferramentas open source que guardam os testes de carga como código no seu repositório, e qualquer uma das duas testa bem uma API HTTP sob carga. Escolha o Gatling se o seu time trabalha em Java, Kotlin ou Scala, ou quer um relatório HTML depois de cada execução sem configurar nada. Escolha o k6 se você quer um único binário Go sem JVM, gRPC e testes de navegador prontos para uso, e thresholds capazes de parar cedo uma execução que está falhando.&lt;/p&gt;
&lt;p&gt;Os dados desta comparação Gatling vs k6 vêm da documentação e do repositório de cada projeto, conferidos em 9 de outubro de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Gatling&lt;/th&gt;
&lt;th&gt;k6&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licença&lt;/td&gt;
&lt;td&gt;Apache 2.0; gRPC, MQTT e GraphQL sob uma licença de componentes separada (&lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;repositório&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;AGPL-3.0 (&lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;repositório&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ambiente de execução&lt;/td&gt;
&lt;td&gt;JVM; o SDK Java exige OpenJDK LTS 11 a 25 (versão 3.16.0)&lt;/td&gt;
&lt;td&gt;Um binário Go com um motor JavaScript embutido (versão v2.3.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scripts de teste&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript ou TypeScript&lt;/td&gt;
&lt;td&gt;JavaScript, ou TypeScript sem checagem de tipos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocolos principais&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events, JMS&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSockets, gRPC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modelo de carga&lt;/td&gt;
&lt;td&gt;Perfis de injeção abertos ou fechados&lt;/td&gt;
&lt;td&gt;Seis executors, dois deles por taxa de chegada (modelo aberto)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Critérios de aprovação&lt;/td&gt;
&lt;td&gt;Assertions, verificadas depois da execução&lt;/td&gt;
&lt;td&gt;Thresholds, que também podem interromper uma execução&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relatórios&lt;/td&gt;
&lt;td&gt;Relatório HTML depois de cada execução&lt;/td&gt;
&lt;td&gt;Resumo no fim do teste; dashboard web com exportação HTML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testes de navegador&lt;/td&gt;
&lt;td&gt;Nada embutido; o Recorder transforma o tráfego do navegador em código&lt;/td&gt;
&lt;td&gt;Módulo de navegador embutido (controla um navegador baseado em Chromium)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escala&lt;/td&gt;
&lt;td&gt;Gatling Enterprise&lt;/td&gt;
&lt;td&gt;k6-operator no Kubernetes, ou Grafana Cloud k6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qual é a diferença entre Gatling e k6?&lt;/h2&gt;
&lt;p&gt;A maior diferença é o ambiente de execução. O Gatling roda na JVM e você escreve os testes com um dos SDKs dele, enquanto o k6 é um único programa compilado em Go que executa JavaScript.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; do Gatling cita um SDK Java para Java, Kotlin e Scala, executado por um plugin de Maven, Gradle ou sbt. O &lt;a href=&quot;https://github.com/gatling/gatling-js&quot;&gt;SDK de JavaScript e TypeScript&lt;/a&gt; é instalado pelo npm, e a ferramenta de linha de comando dele baixa o GraalVM, então até uma simulação em JavaScript roda em uma JVM.&lt;/p&gt;
&lt;p&gt;O k6 é instalado como &lt;a href=&quot;https://grafana.com/docs/k6/latest/set-up/install-k6/&quot;&gt;pacote ou binário independente&lt;/a&gt;, sem nenhum outro ambiente de execução. Ele também roda arquivos &lt;code&gt;.ts&lt;/code&gt; diretamente, e o &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/javascript-typescript-compatibility-mode/&quot;&gt;suporte a TypeScript&lt;/a&gt; remove os tipos sem checá-los (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Como escrever o mesmo teste em cada ferramenta?&lt;/h2&gt;
&lt;p&gt;As duas ferramentas conseguem expressar o mesmo teste em JavaScript. O Gatling chama o teste de simulação e descreve a carga com um perfil de injeção, e o k6 chama de script e descreve a carga com um cenário e o executor dele.&lt;/p&gt;
&lt;p&gt;Este é um teste em que dez novos usuários chegam a cada segundo durante cinco minutos, e a execução falha se o percentil 95 passar de 500 ms ou se mais de 1% das requisições falharem. No SDK de JavaScript do Gatling, baseado no &lt;a href=&quot;https://docs.gatling.io/tutorials/test-as-code/javascript/running-your-first-simulation/&quot;&gt;tutorial da primeira simulação&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import {
  constantUsersPerSec, global, scenario, simulation,
} from &amp;quot;@gatling.io/core&amp;quot;;
import { http } from &amp;quot;@gatling.io/http&amp;quot;;

export default simulation((setUp) =&amp;gt; {
  const api = http.baseUrl(&amp;quot;https://staging.example.com&amp;quot;);

  const users = scenario(&amp;quot;API users&amp;quot;)
    .exec(http(&amp;quot;list users&amp;quot;).get(&amp;quot;/api/users&amp;quot;));

  setUp(users.injectOpen(constantUsersPerSec(10).during(300)))
    .protocols(api)
    .assertions(
      global().responseTime().percentile(95).lt(500),
      global().failedRequests().percent().lt(1),
    );
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O mesmo teste no k6, com o &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/constant-arrival-rate/&quot;&gt;executor constant-arrival-rate&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;

export const options = {
  scenarios: {
    api_users: {
      executor: &amp;quot;constant-arrival-rate&amp;quot;,
      rate: 10,
      timeUnit: &amp;quot;1s&amp;quot;,
      duration: &amp;quot;5m&amp;quot;,
      preAllocatedVUs: 50,
    },
  },
  thresholds: {
    http_req_duration: [&amp;quot;p(95)&amp;lt;500&amp;quot;],
    http_req_failed: [&amp;quot;rate&amp;lt;0.01&amp;quot;],
  },
};

export default function () {
  http.get(&amp;quot;https://staging.example.com/api/users&amp;quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rode os dois com &lt;code&gt;npx gatling run&lt;/code&gt; e &lt;code&gt;k6 run script.js&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Como o Gatling e o k6 modelam a carga?&lt;/h2&gt;
&lt;p&gt;Os dois suportam modelos de carga abertos e fechados. No Gatling, a escolha vem do método de injeção que você chama, e no k6 vem do executor que você configura.&lt;/p&gt;
&lt;p&gt;No Gatling, &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;&lt;code&gt;injectOpen&lt;/code&gt;&lt;/a&gt; recebe taxas de chegada como &lt;code&gt;constantUsersPerSec&lt;/code&gt;, e &lt;code&gt;injectClosed&lt;/code&gt; recebe metas de concorrência como &lt;code&gt;constantConcurrentUsers&lt;/code&gt;. O k6 tem &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/&quot;&gt;seis executors&lt;/a&gt;: os dois por taxa de chegada seguem o modelo aberto, e os outros quatro seguem o fechado, em que um usuário virtual só começa a próxima iteração quando a anterior termina.&lt;/p&gt;
&lt;p&gt;Um cenário do k6 por taxa de chegada inicia as iterações a partir de um pool de usuários virtuais pré-alocados, e quando esse pool se esgota, o k6 pula iterações e as conta como &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/dropped-iterations/&quot;&gt;iterações descartadas&lt;/a&gt; (conferido em 9 de outubro de 2026). Nosso guia sobre o &lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;modelo de carga aberto vs fechado&lt;/a&gt; explica quando usar cada um.&lt;/p&gt;
&lt;h2&gt;Como o Gatling e o k6 decidem se um teste passou?&lt;/h2&gt;
&lt;p&gt;Os dois transformam metas de desempenho em um resultado de aprovação ou reprovação que um pipeline de CI consegue usar. O Gatling verifica as metas quando a execução termina, e o k6 também consegue parar uma execução assim que uma meta é descumprida.&lt;/p&gt;
&lt;p&gt;As &lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;assertions&lt;/a&gt; do Gatling são avaliadas depois da simulação, e uma única assertion com falha derruba a simulação e o build. Os &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; do k6 encerram uma execução com falha com um código de saída diferente de zero, e um threshold com &lt;code&gt;abortOnFail&lt;/code&gt; para o teste no momento em que falha (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Quais protocolos e testes de navegador cada ferramenta cobre?&lt;/h2&gt;
&lt;p&gt;As duas cobrem HTTP e WebSockets sem instalar nada a mais. O Gatling acrescenta Server-Sent Events e JMS, e o k6 acrescenta gRPC e sessões reais de navegador.&lt;/p&gt;
&lt;p&gt;Segundo o README do Gatling, gRPC, MQTT e GraphQL são componentes separados sob a Gatling Enterprise Component License, limitados sem o Enterprise a cinco usuários simultâneos e a testes de cinco minutos. O k6 lista HTTP/1.1, HTTP/2, WebSockets e gRPC como &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/protocols/&quot;&gt;protocolos nativos&lt;/a&gt;, e soma outros com extensões xk6 como Kafka e Redis.&lt;/p&gt;
&lt;p&gt;Para testes de navegador, o k6 tem um &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6-browser/&quot;&gt;módulo de navegador&lt;/a&gt; que controla um navegador baseado em Chromium e coleta métricas de frontend. A documentação do Gatling não descreve nenhum motor de navegador: o &lt;a href=&quot;https://docs.gatling.io/reference/script/http/recorder/&quot;&gt;Recorder&lt;/a&gt; do Gatling transforma uma sessão de navegador ou um arquivo HAR em uma simulação no nível HTTP (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Como rodar um teste maior do que uma máquina consegue gerar?&lt;/h2&gt;
&lt;p&gt;A edição open source do Gatling gera carga a partir de uma única máquina, e execuções distribuídas exigem o Gatling Enterprise. O k6 consegue espalhar um teste por um cluster Kubernetes com o k6-operator, que é open source, ou rodá-lo no Grafana Cloud k6.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://docs.gatling.io/tutorials/test-as-code/java-jvm/installation-guide/&quot;&gt;guia de instalação&lt;/a&gt; do Gatling pede uma conta Enterprise para execuções distribuídas, que usam geradores de carga gerenciados ou locais privados na sua própria conta AWS, Azure, GCP ou Kubernetes. O &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt; divide um teste entre várias instâncias do k6 em um cluster (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;Existe um terceiro caminho para scripts k6. A LoadFocus, que publica este site, &lt;a href=&quot;https://loadfocus.com/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-vs-k6&quot;&gt;roda scripts k6&lt;/a&gt; na própria infraestrutura de nuvem a partir de 25 regiões, com os usuários e a duração definidos nas configurações do teste. O validador de scripts da plataforma avisa que cenários por taxa de chegada rodam lá com um número fixo de usuários, então um script de modelo aberto como o de cima não mantém a taxa de chegada na LoadFocus. A LoadFocus não roda simulações do Gatling, então para o Gatling o caminho para mais máquinas é o Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;Que relatórios você recebe?&lt;/h2&gt;
&lt;p&gt;O Gatling gera um relatório HTML depois de cada execução sem configurar nada. O k6 mostra um resumo no terminal e consegue produzir um relatório HTML a partir do dashboard web embutido.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://docs.gatling.io/reference/stats/reports/oss/&quot;&gt;relatório HTML&lt;/a&gt; do Gatling traz gráficos dos percentis do tempo de resposta, dos usuários iniciados por segundo e das requisições por segundo ao longo do teste. O k6 mostra um &lt;a href=&quot;https://grafana.com/docs/k6/latest/results-output/end-of-test/&quot;&gt;resumo no fim do teste&lt;/a&gt;, e o &lt;a href=&quot;https://grafana.com/docs/k6/latest/results-output/web-dashboard/&quot;&gt;dashboard web&lt;/a&gt; dele exibe gráficos ao vivo e exporta um relatório HTML autocontido quando você define &lt;code&gt;K6_WEB_DASHBOARD_EXPORT&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Qual escolher?&lt;/h2&gt;
&lt;p&gt;O Gatling combina com times que trabalham na JVM, e o k6 com times que querem um único binário e JavaScript. Protocolos, testes de navegador e escala decidem a maior parte dos outros casos.&lt;/p&gt;
&lt;p&gt;Escolha o Gatling em vez do k6 quando o seu time trabalha na JVM e quer testes em Java, Kotlin ou Scala montados com Maven, Gradle ou sbt junto do código da aplicação, quando você precisa de JMS ou Server-Sent Events, ou quando quer um relatório HTML depois de cada execução sem configurar nada.&lt;/p&gt;
&lt;p&gt;Escolha o k6 em vez do Gatling quando você quer um único binário na CI sem JVM para instalar, quando os seus testes precisam de gRPC ou de sessões reais de navegador, quando os thresholds devem parar cedo uma execução que está falhando, ou quando você pretende escalar no Kubernetes com um operator open source.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;O Gatling é mais rápido que o k6?&lt;/strong&gt;
Não medimos isso por conta própria, então não vamos apontar um vencedor. A comparação justa é rodar o mesmo cenário com as duas ferramentas no seu próprio hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O Gatling consegue rodar scripts do k6?&lt;/strong&gt;
Não segundo a documentação do Gatling, que não descreve nenhuma forma de rodar scripts do k6. Os dois SDKs usam APIs diferentes e os &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;conversores&lt;/a&gt; do Gatling cobrem JMeter e LoadRunner, então um script do k6 precisa ser reescrito como simulação do Gatling, mesmo com o SDK de JavaScript.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A LoadFocus consegue rodar testes do Gatling?&lt;/strong&gt;
Não. A LoadFocus roda scripts k6 e planos de teste JMeter. Para distribuir uma simulação do Gatling entre várias máquinas, use o Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-load-testing/&quot;&gt;Teste de carga com Gatling: análise da ferramenta JVM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/k6-vs-artillery/&quot;&gt;k6 vs Artillery: qual ferramenta de teste de carga escolher&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter: testes como código ou plano na GUI?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-vs-locust/&quot;&gt;Gatling vs Locust: simulações na JVM ou locustfiles Python?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/grpc-load-testing/&quot;&gt;Teste de carga gRPC: ferramentas, configuração e métricas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Teste de carga de API GraphQL: guia prático</title><link>https://loadtest.app/pt-br/how-to-load-test-a-graphql-api/</link><guid isPermaLink="true">https://loadtest.app/pt-br/how-to-load-test-a-graphql-api/</guid><description>Teste de carga de API GraphQL: dê nome a cada operação, misture consultas e mutações, pegue os erros escondidos atrás do HTTP 200 e observe cache e N+1.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;Para fazer um teste de carga de API GraphQL, escreva um script com as operações que seus clientes realmente enviam, dê a cada uma um nome próprio na ferramenta de teste e misture-as nas proporções que você vê em produção, com variáveis variadas. Verifique em cada corpo de resposta se existe um array &lt;code&gt;errors&lt;/code&gt;, porque um servidor GraphQL costuma responder HTTP 200 mesmo quando parte da operação falhou. Depois aumente a carga e avalie cada operação pelos próprios percentis.&lt;/p&gt;
&lt;p&gt;Fontes: graphql.org, o rascunho da especificação GraphQL over HTTP e a documentação de cada ferramenta, tudo conferido em 9 de outubro de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ferramenta&lt;/th&gt;
&lt;th&gt;Nomear cada operação com&lt;/th&gt;
&lt;th&gt;Reprovar uma resposta com &lt;code&gt;errors&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Alimentar variáveis a partir de&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tags: { name: &amp;quot;...&amp;quot; }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Um &lt;code&gt;check()&lt;/code&gt; no corpo já parseado&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SharedArray&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;O nome do sampler&lt;/td&gt;
&lt;td&gt;JSON Assertion em &lt;code&gt;$.errors&lt;/code&gt;, invertida&lt;/td&gt;
&lt;td&gt;CSV Data Set Config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http(&amp;quot;...&amp;quot;)&lt;/code&gt; ou o plugin de GraphQL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jsonPath(&amp;quot;$.errors&amp;quot;).notExists()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Feeders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery&lt;/td&gt;
&lt;td&gt;Um &lt;code&gt;name&lt;/code&gt; na requisição&lt;/td&gt;
&lt;td&gt;&lt;code&gt;notHasProperty: &amp;quot;errors&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;config.payload&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Por que uma API GraphQL precisa de um teste de carga diferente?&lt;/h2&gt;
&lt;p&gt;Porque todas as operações vão para uma única URL, e o trabalho por trás depende da consulta e das variáveis. Um relatório agrupado por URL coloca uma leitura barata e uma busca cara no mesmo balaio.&lt;/p&gt;
&lt;p&gt;O guia &lt;a href=&quot;https://graphql.org/learn/serving-over-http/&quot;&gt;Serving over HTTP&lt;/a&gt; do graphql.org diz que um servidor GraphQL opera em um único endpoint, normalmente &lt;code&gt;/graphql&lt;/code&gt;. As operações chegam ali por POST, com um corpo JSON que traz &lt;code&gt;query&lt;/code&gt;, um &lt;code&gt;operationName&lt;/code&gt; opcional e &lt;code&gt;variables&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Como obter resultados por operação?&lt;/h2&gt;
&lt;p&gt;Dê a cada requisição o nome da sua operação GraphQL e faça a ferramenta agrupar as estatísticas por esse nome. Cada ferramenta tem a própria configuração para isso (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;k6&lt;/strong&gt;: o &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/tags-and-groups/&quot;&gt;guia de tags e grupos&lt;/a&gt; orienta a definir &lt;code&gt;tags.name&lt;/code&gt; para dar um nome significativo à requisição, e os &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; podem mirar uma única tag, como &lt;code&gt;http_req_duration{name:GetProduct}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JMeter&lt;/strong&gt;: o &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Aggregate_Report&quot;&gt;Aggregate Report&lt;/a&gt; cria uma linha para cada requisição com nome diferente. Desde o JMeter 5.4, o sampler &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#HTTP_Request&quot;&gt;GraphQL HTTP Request&lt;/a&gt; tem campos para Query, Variables e Operation Name.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gatling&lt;/strong&gt;: o &lt;a href=&quot;https://docs.gatling.io/reference/script/http/request/&quot;&gt;nome da requisição&lt;/a&gt; é a chave das estatísticas, e o &lt;a href=&quot;https://docs.gatling.io/reference/script/graphql/requests/&quot;&gt;plugin de GraphQL&lt;/a&gt; nomeia as requisições pela operação, por exemplo &lt;code&gt;query GetUser&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Artillery&lt;/strong&gt;: o &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/metrics-by-endpoint&quot;&gt;plugin metrics-by-endpoint&lt;/a&gt; reporta por URL e acrescenta à entrada o &lt;code&gt;name&lt;/code&gt; da requisição, de modo que operações nomeadas aparecem separadas; &lt;code&gt;useOnlyRequestNames: true&lt;/code&gt; remove a URL e mantém só o nome.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Quais operações o teste deve enviar?&lt;/h2&gt;
&lt;p&gt;As que a produção recebe, nas mesmas proporções. Tire a contagem de cada operação dos logs do servidor ou do seu monitoramento de GraphQL e transforme-a em uma mistura ponderada de leituras e mutações.&lt;/p&gt;
&lt;p&gt;Use os documentos que seus clientes enviam, com a profundidade real, e não uma consulta simplificada. Alimente as variáveis a partir de um arquivo de dados, para que o servidor busque muitos registros diferentes em vez de devolver um único resultado do cache. Mantenha realista também o número de operações distintas: a &lt;a href=&quot;https://www.apollographql.com/docs/technotes/TN0035-load-testing-graphql&quot;&gt;nota técnica da Apollo sobre teste de carga de GraphQL&lt;/a&gt;, um documento do próprio fornecedor, explica que cada operação nova é analisada e validada antes de rodar, e desaconselha gerar muito mais operações únicas do que os clientes reais enviam.&lt;/p&gt;
&lt;p&gt;Mutações alteram dados, então rode-as onde os dados possam ser restaurados. O &lt;a href=&quot;https://loadtest.app/pt-br/how-to-run-a-load-test/&quot;&gt;guia passo a passo de teste de carga&lt;/a&gt; cobre metas e rampa de subida.&lt;/p&gt;
&lt;h2&gt;Por que uma resposta HTTP 200 ainda pode ser uma falha?&lt;/h2&gt;
&lt;p&gt;Porque o GraphQL reporta erros dentro do corpo da resposta. Uma requisição pode voltar com status 200, um array &lt;code&gt;errors&lt;/code&gt; e dados parciais, e uma verificação de status deixa passar.&lt;/p&gt;
&lt;p&gt;A página &lt;a href=&quot;https://graphql.org/learn/response/&quot;&gt;Response&lt;/a&gt; do graphql.org explica que, quando um resolver falha, a execução continua e a resposta traz &lt;code&gt;data&lt;/code&gt; junto com &lt;code&gt;errors&lt;/code&gt;. O guia de HTTP acrescenta que essa resposta deve receber mesmo assim um status 2xx, já que o HTTP não tem código para sucesso parcial, e que alguns servidores antigos respondem 2xx até para erros de validação. O &lt;a href=&quot;https://graphql.github.io/graphql-over-http/draft/&quot;&gt;rascunho GraphQL over HTTP&lt;/a&gt; propõe um status próprio, o 294, para sucesso parcial com o tipo de mídia mais novo &lt;code&gt;application/graphql-response+json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Em um teste de carga isso atrapalha duas vezes. Os erros não entram na conta, e requisições que falham rápido, como operações recusadas por um limite de profundidade, puxam os tempos de resposta para baixo.&lt;/p&gt;
&lt;h2&gt;Como verificar o array errors em cada ferramenta?&lt;/h2&gt;
&lt;p&gt;Faça o parse do corpo JSON e reprove a requisição quando houver &lt;code&gt;errors&lt;/code&gt;. Cada ferramenta tem um jeito embutido de fazer isso.&lt;/p&gt;
&lt;p&gt;No k6, um check no corpo parseado resolve, e um threshold na métrica &lt;code&gt;checks&lt;/code&gt; faz a execução falhar, porque &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;checks sozinhos não mudam o código de saída do k6&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;
import { check, sleep } from &amp;quot;k6&amp;quot;;
import { SharedArray } from &amp;quot;k6/data&amp;quot;;

const URL = &amp;quot;https://staging.example.com/graphql&amp;quot;;
const ids = new SharedArray(&amp;quot;ids&amp;quot;, () =&amp;gt;
  JSON.parse(open(&amp;quot;./product-ids.json&amp;quot;)));
const QUERY = `query GetProduct($id: ID!) {
  product(id: $id) { id name price }
}`;

export const options = {
  vus: 20,
  duration: &amp;quot;5m&amp;quot;,
  thresholds: {
    checks: [&amp;quot;rate&amp;gt;0.99&amp;quot;],
    &amp;quot;http_req_duration{name:GetProduct}&amp;quot;: [&amp;quot;p(95)&amp;lt;400&amp;quot;],
  },
};

function parse(res) {
  try { return res.json(); } catch (e) { return null; }
}

export default function () {
  const id = ids[Math.floor(Math.random() * ids.length)];
  const payload = JSON.stringify({
    query: QUERY,
    operationName: &amp;quot;GetProduct&amp;quot;,
    variables: { id: id },
  });
  const res = http.post(URL, payload, {
    headers: { &amp;quot;Content-Type&amp;quot;: &amp;quot;application/json&amp;quot; },
    tags: { name: &amp;quot;GetProduct&amp;quot; },
  });
  const body = parse(res);
  check(res, {
    &amp;quot;status is 2xx&amp;quot;: (r) =&amp;gt; r.status &amp;gt;= 200 &amp;amp;&amp;amp; r.status &amp;lt; 300,
    &amp;quot;no GraphQL errors&amp;quot;: () =&amp;gt; body !== null &amp;amp;&amp;amp; !body.errors,
  });
  sleep(1);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O &lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-data/sharedarray/&quot;&gt;&lt;code&gt;SharedArray&lt;/code&gt;&lt;/a&gt; carrega os IDs uma única vez para todos os usuários virtuais. O &lt;code&gt;try&lt;/code&gt; impede que um corpo que não seja JSON, como a página de erro de um proxy, interrompa a iteração.&lt;/p&gt;
&lt;p&gt;No &lt;strong&gt;JMeter&lt;/strong&gt;, adicione uma &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#JSON_Assertion&quot;&gt;JSON Assertion&lt;/a&gt; com o caminho &lt;code&gt;$.errors&lt;/code&gt; e marque &amp;quot;Invert assertion&amp;quot;, para que a amostra falhe quando o caminho existir. Um &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#JSON_Extractor&quot;&gt;JSON Extractor&lt;/a&gt; copia IDs para variáveis usadas na próxima operação.&lt;/p&gt;
&lt;p&gt;No &lt;strong&gt;Gatling&lt;/strong&gt;, acrescente &lt;code&gt;.check(jsonPath(&amp;quot;$.errors&amp;quot;).notExists())&lt;/code&gt;, os dois da &lt;a href=&quot;https://docs.gatling.io/concepts/checks/&quot;&gt;referência de checks&lt;/a&gt;. O plugin de GraphQL verifica o status e os erros por padrão, mas a &lt;a href=&quot;https://docs.gatling.io/reference/script/graphql/setup/&quot;&gt;página de configuração&lt;/a&gt; dele limita as execuções na Community Edition a 5 usuários e 5 minutos (conferido em 9 de outubro de 2026). Para testes maiores sem o Gatling Enterprise, use requisições HTTP comuns com esse check.&lt;/p&gt;
&lt;p&gt;No &lt;strong&gt;Artillery&lt;/strong&gt;, o &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/expect&quot;&gt;plugin expect&lt;/a&gt; oferece &lt;code&gt;notHasProperty: &amp;quot;errors&amp;quot;&lt;/code&gt;, e &lt;code&gt;reportFailuresAsErrors: true&lt;/code&gt; leva as expectativas que falharam para o relatório. Um &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/http&quot;&gt;&lt;code&gt;capture&lt;/code&gt;&lt;/a&gt; com um caminho &lt;code&gt;json&lt;/code&gt; passa um valor para a próxima requisição.&lt;/p&gt;
&lt;h2&gt;O que observar além dos tempos de resposta?&lt;/h2&gt;
&lt;p&gt;Cache, consultas persistidas e carga do banco de dados por requisição. Qualquer um deles pode deixar um teste mais rápido ou mais lento que a produção por motivos que nada têm a ver com capacidade.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://graphql.org/learn/performance/&quot;&gt;guia de desempenho&lt;/a&gt; do graphql.org observa que consultas enviadas por GET podem usar cache HTTP e CDN, e que consultas persistidas permitem ao cliente enviar um hash em vez do documento completo. Se seus clientes fazem isso, o teste deve fazer também. Se não fazem, um teste que repete uma consulta com as mesmas variáveis mede um cache que o tráfego real não acerta. A nota técnica da Apollo acrescenta que o Apollo Server, o Gateway e o GraphOS Router ativam por padrão as consultas persistidas automáticas.&lt;/p&gt;
&lt;p&gt;O mesmo guia descreve o problema N+1: uma lista cujo resolver carrega cada item separadamente transforma uma requisição em muitas consultas ao banco, algo que costuma ser resolvido agrupando-as com uma ferramenta como o DataLoader. Acompanhe as consultas ao banco por segundo ao lado das requisições por segundo; se elas sobem muito mais rápido conforme a carga cresce, desconfie de um resolver. Limites de profundidade, de complexidade e de taxa também podem disparar durante um teste.&lt;/p&gt;
&lt;h2&gt;De onde deve vir a carga?&lt;/h2&gt;
&lt;p&gt;De uma única máquina enquanto você monta o script e faz um smoke test, e depois da nuvem, quando precisar de mais carga ou de tráfego vindo de várias regiões.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://loadfocus.com/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=how-to-load-test-a-graphql-api&quot;&gt;LoadFocus roda scripts k6&lt;/a&gt; a partir de 25 regiões de nuvem. Lá, o número de usuários e a duração vêm das configurações do teste, e não das &lt;code&gt;options&lt;/code&gt; do script, e cenários com taxa de chegada rodam com um número fixo de usuários em vez de uma taxa fixa de requisições, a diferença explicada no artigo sobre &lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;modelo de carga aberto e fechado&lt;/a&gt;. A LoadFocus também publica um &lt;a href=&quot;https://loadfocus.com/templates/load-testing-for-graphql-endpoints-with-complex-queries?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=how-to-load-test-a-graphql-api&quot;&gt;modelo para endpoints GraphQL com consultas complexas&lt;/a&gt; (em inglês).&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Um teste de carga de GraphQL deve enviar consultas por GET ou por POST?&lt;/strong&gt;
Do jeito que seus clientes enviam. O graphql.org só permite GET para operações do tipo query, e mutações precisam usar POST. Se a produção envia consultas persistidas por GET através de uma CDN, teste esse caminho também.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O mesmo script serve para testar a carga de subscriptions GraphQL?&lt;/strong&gt;
Normalmente não. O graphql.org explica que subscriptions são de longa duração e costumam usar WebSockets ou server-sent events, então precisam de um cenário próprio em uma ferramenta que suporte esse transporte.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Uma resposta parcial deve contar como requisição com falha?&lt;/strong&gt;
Na maioria dos testes, sim, porque o cliente recebeu um erro em parte do que pediu. Se alguns erros são esperados, como resultados não encontrados para registros apagados, verifique esses códigos de erro específicos e reprove o resto.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/how-to-run-a-load-test/&quot;&gt;Como fazer um teste de carga: guia passo a passo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/load-testing-in-github-actions/&quot;&gt;Teste de carga no GitHub Actions: guia prático&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/websocket-load-testing-tools/&quot;&gt;Ferramentas de teste de carga WebSocket: seis opções&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/grpc-load-testing/&quot;&gt;Teste de carga gRPC: ferramentas, configuração e métricas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Ferramentas de benchmark HTTP: wrk, hey, oha, ab e mais</title><link>https://loadtest.app/pt-br/http-benchmarking-tools/</link><guid isPermaLink="true">https://loadtest.app/pt-br/http-benchmarking-tools/</guid><description>wrk, wrk2, hey, oha, ab, bombardier, autocannon e h2load comparadas: controle de taxa, HTTP/2, saída de latência, licença e versões recentes.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, que vende um serviço de teste de carga abordado neste artigo.&lt;/p&gt;&lt;p&gt;As ferramentas de benchmark HTTP de linha de comando que a maioria dos times usa são wrk, wrk2, hey, oha, ab (Apache Bench), bombardier, autocannon e h2load. Use wrk2 quando precisar de uma taxa de requisições constante e de latências de cauda confiáveis, hey ou oha para uma checagem rápida que também fale HTTP/2, h2load quando o próprio HTTP/2 ou HTTP/3 estiver em teste, e autocannon se o seu time trabalha com Node.js.&lt;/p&gt;
&lt;p&gt;Não colocamos essas ferramentas umas contra as outras, então aqui não há números de velocidade nem veredito sobre a mais &amp;quot;rápida&amp;quot;. Os dados vêm do repositório, do manual ou da página de versões de cada projeto (conferidos em 9 de outubro de 2026); as dicas de quando escolher cada uma são a nossa avaliação.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ferramenta&lt;/th&gt;
&lt;th&gt;Escrita em&lt;/th&gt;
&lt;th&gt;Licença&lt;/th&gt;
&lt;th&gt;Controle de taxa&lt;/th&gt;
&lt;th&gt;HTTP/2&lt;/th&gt;
&lt;th&gt;Última versão&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;wrk&lt;/td&gt;
&lt;td&gt;C, scripts LuaJIT&lt;/td&gt;
&lt;td&gt;Modified Apache 2.0&lt;/td&gt;
&lt;td&gt;Nenhum&lt;/td&gt;
&lt;td&gt;Não documentado&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/wg/wrk/tags&quot;&gt;Tag 4.2.0, fev. 2021&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wrk2&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Taxa fixa (&lt;code&gt;-R&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Não documentado&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/giltene/wrk2/commits/master&quot;&gt;Nenhuma, último commit set. 2019&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hey&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Limite por worker (&lt;code&gt;-q&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rakyll/hey/releases&quot;&gt;v0.1.5, jan. 2026&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;oha&lt;/td&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Limite global (&lt;code&gt;-q&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Sim, e HTTP/3&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/hatoo/oha/releases&quot;&gt;v1.16.0, ago. 2026&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ab&lt;/td&gt;
&lt;td&gt;C (Apache httpd)&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Nenhum&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://httpd.apache.org/download.cgi&quot;&gt;httpd 2.4.69, out. 2026&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bombardier&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Limite (&lt;code&gt;-r&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/codesenberg/bombardier/releases&quot;&gt;v2.0.2, mar. 2025&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;autocannon&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Limite (&lt;code&gt;-R&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/mcollina/autocannon/releases&quot;&gt;v8.0.0, out. 2024&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;h2load&lt;/td&gt;
&lt;td&gt;C++ (nghttp2)&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Por cliente (&lt;code&gt;--rps&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Sim, e HTTP/3&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/nghttp2/nghttp2/releases&quot;&gt;nghttp2 v1.70.0, jul. 2026&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vegeta&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Taxa fixa (&lt;code&gt;-rate&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/tsenart/vegeta/releases&quot;&gt;v12.13.0, out. 2025&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Por que importa se a ferramenta fixa a taxa?&lt;/h2&gt;
&lt;p&gt;Uma ferramenta que mantém um número fixo de conexões envia menos assim que o servidor fica lento, e os números de latência dela deixam de fora o tempo que as requisições passaram esperando. Uma ferramenta de taxa fixa continua enviando no ritmo planejado, e a lentidão aparece nos percentis.&lt;/p&gt;
&lt;p&gt;A maioria das ferramentas desta lista roda um número definido de conexões ou workers (&lt;code&gt;-c&lt;/code&gt;), e cada um espera uma resposta antes de enviar mais. O &lt;a href=&quot;https://github.com/giltene/wrk2&quot;&gt;README do wrk2&lt;/a&gt; chama esse ponto cego de Coordinated Omission e cronometra cada requisição a partir do momento em que ela deveria ter sido enviada. O &lt;a href=&quot;https://github.com/tsenart/vegeta&quot;&gt;Vegeta&lt;/a&gt; também mantém uma taxa constante; veja o nosso panorama de &lt;a href=&quot;https://loadtest.app/pt-br/open-source-load-testing-tools/&quot;&gt;ferramentas de teste de carga open source&lt;/a&gt;. oha e autocannon conseguem corrigir a latência desse mesmo efeito quando você define uma taxa, enquanto hey e bombardier documentam suas opções de taxa apenas como limites.&lt;/p&gt;
&lt;h2&gt;O wrk ainda vale a pena?&lt;/h2&gt;
&lt;p&gt;Sim, para ver rapidamente quanta carga uma única máquina consegue mandar para um endpoint, lendo os números com a ressalva acima. A tag mais recente é de fevereiro de 2021.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/wg/wrk&quot;&gt;wrk&lt;/a&gt; é escrito em C e mantém um número fixo de conexões abertas distribuídas em várias threads. Scripts LuaJIT opcionais podem montar requisições, processar respostas e gerar relatórios próprios, e o &lt;code&gt;make&lt;/code&gt; compila a ferramenta junto com o LuaJIT e o OpenSSL que vêm no pacote. Ele mostra a latência média, o desvio padrão e o máximo; &lt;code&gt;--latency&lt;/code&gt; acrescenta os percentis 50, 75, 90 e 99.&lt;/p&gt;
&lt;p&gt;Escolha o wrk2 no lugar dele quando precisar de uma taxa de requisições fixa ou de latências de cauda confiáveis durante uma lentidão.&lt;/p&gt;
&lt;h2&gt;Quando você precisa do wrk2 em vez do wrk?&lt;/h2&gt;
&lt;p&gt;Quando a pergunta é como a latência se comporta a uma determinada taxa de requisições. O wrk2 mantém essa taxa constante e registra cada latência em um HdrHistogram.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/giltene/wrk2&quot;&gt;wrk2&lt;/a&gt; acrescenta ao wrk um argumento de vazão (&lt;code&gt;-R&lt;/code&gt;, em requisições por segundo). &lt;code&gt;--latency&lt;/code&gt; mostra o espectro completo de percentis e &lt;code&gt;--u_latency&lt;/code&gt; acrescenta os números sem correção para comparar. O README avisa que execuções com menos de 10 a 20 segundos podem não trazer informação útil por causa de um período de calibração de 10 segundos, e descreve o projeto como experimental. Não há versões publicadas, e o Makefile gera um binário que também se chama &lt;code&gt;wrk&lt;/code&gt;, então mantenha os dois separados.&lt;/p&gt;
&lt;p&gt;Escolha oha ou autocannon no lugar dele quando quiser um ajuste de taxa com correção de latência em um projeto que ainda é mantido.&lt;/p&gt;
&lt;h2&gt;hey e oha são intercambiáveis?&lt;/h2&gt;
&lt;p&gt;Para checagens rápidas, em boa parte: os dois rodam um grupo de workers por um número de requisições ou por um tempo, e os dois falam HTTP/2. A diferença está em como limitam a taxa e no que você vê durante a execução.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/rakyll/hey&quot;&gt;hey&lt;/a&gt; é um pequeno programa em Go com binários prontos para Linux, macOS e Windows e uma fórmula do Homebrew. &lt;code&gt;-q&lt;/code&gt; limita as requisições por segundo de cada worker, &lt;code&gt;-h2&lt;/code&gt; ativa o HTTP/2, e o resumo traz um histograma de tempo de resposta e uma distribuição de latência, ou CSV com &lt;code&gt;-o csv&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/hatoo/oha&quot;&gt;oha&lt;/a&gt; é escrito em Rust, foi inspirado no hey e mostra uma interface ao vivo no terminal. O &lt;code&gt;-q&lt;/code&gt; dele define uma taxa global, &lt;code&gt;--latency-correction&lt;/code&gt; corrige a Coordinated Omission e &lt;code&gt;--http-version&lt;/code&gt; aceita 1.1, 2 e, em uma compilação experimental, 3. Ele é instalado com cargo, Homebrew, winget ou pacman e pode gravar JSON ou CSV.&lt;/p&gt;
&lt;p&gt;Escolha o hey no lugar dele quando um limite por worker combinar com o seu jeito de pensar a carga; escolha o oha para HTTP/3, JSON ou correção de latência.&lt;/p&gt;
&lt;h2&gt;Ainda vale usar o ab?&lt;/h2&gt;
&lt;p&gt;Para uma checagem rápida em uma máquina onde ele já está instalado, sim. O ab vem com o Apache HTTP Server, e o próprio manual lista limitações conhecidas.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://httpd.apache.org/docs/2.4/programs/ab.html&quot;&gt;ab&lt;/a&gt; recebe um número de requisições (&lt;code&gt;-n&lt;/code&gt;) e um nível de concorrência (&lt;code&gt;-c&lt;/code&gt;), não tem opção de taxa nem de HTTP/2 e só usa KeepAlive com &lt;code&gt;-k&lt;/code&gt;. A saída termina com a porcentagem de requisições atendidas dentro de um tempo, e ele pode gravar essas porcentagens em CSV (&lt;code&gt;-e&lt;/code&gt;) ou cada medição em um arquivo para o gnuplot (&lt;code&gt;-g&lt;/code&gt;). A seção de bugs do manual diz que o ab não implementa o HTTP/1.x por completo e avisa que o parsing pesado de strings pode fazer você medir o desempenho do próprio ab.&lt;/p&gt;
&lt;p&gt;Escolha hey ou oha no lugar dele quando precisar de HTTP/2, de um limite de taxa ou de keep-alive por padrão.&lt;/p&gt;
&lt;h2&gt;Para que servem o bombardier e o autocannon?&lt;/h2&gt;
&lt;p&gt;O bombardier é uma ferramenta em Go com HTTP/2 opcional e limite de taxa. O autocannon combina com times de Node.js, porque também roda como biblioteca dentro de um script Node.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/codesenberg/bombardier&quot;&gt;bombardier&lt;/a&gt; usa por padrão o cliente fasthttp e passa para o cliente net/http do Go com &lt;code&gt;--http1&lt;/code&gt; ou &lt;code&gt;--http2&lt;/code&gt;. &lt;code&gt;-r&lt;/code&gt; define um limite de taxa, &lt;code&gt;-l&lt;/code&gt; mostra os percentis 50, 75, 90 e 99, e &lt;code&gt;-o json&lt;/code&gt; deixa o resultado pronto para ser lido por outras ferramentas.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/mcollina/autocannon&quot;&gt;autocannon&lt;/a&gt; se descreve como uma ferramenta HTTP/1.1 com pipelining e HTTPS e é instalado com &lt;code&gt;npm i autocannon -g&lt;/code&gt;. &lt;code&gt;-R&lt;/code&gt; limita a taxa global e &lt;code&gt;-r&lt;/code&gt; a de cada conexão, e quando qualquer um dos dois está definido a latência é corrigida da Coordinated Omission. A tabela dele mostra os percentis 2,5, 50, 97,5 e 99, &lt;code&gt;-l&lt;/code&gt; mostra todos e &lt;code&gt;-j&lt;/code&gt; grava JSON.&lt;/p&gt;
&lt;p&gt;Escolha o autocannon em vez do bombardier quando seus benchmarks morarem em uma suíte de testes Node.js, e o bombardier quando precisar de HTTP/2.&lt;/p&gt;
&lt;h2&gt;Qual ferramenta foi feita para HTTP/2 e HTTP/3?&lt;/h2&gt;
&lt;p&gt;O h2load. Ele vem do projeto nghttp2, prefere HTTP/2 e consegue forçar HTTP/1.1 ou, quando compilado com suporte, HTTP/3.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://nghttp2.org/documentation/h2load-howto.html&quot;&gt;h2load&lt;/a&gt; é compilado junto com o nghttp2 passando &lt;code&gt;--enable-app&lt;/code&gt; para o &lt;code&gt;./configure&lt;/code&gt;. Além do número de clientes (&lt;code&gt;-c&lt;/code&gt;), ele define os streams simultâneos por cliente (&lt;code&gt;-m&lt;/code&gt;) para colocar a multiplexação sob carga, e &lt;code&gt;--rps&lt;/code&gt; define as requisições por segundo de cada cliente. O &lt;a href=&quot;https://nghttp2.org/documentation/h2load.1.html&quot;&gt;manual&lt;/a&gt; traz mínimo, máximo, média, mediana, p95 e p99 para o tempo de requisição, o tempo de conexão e o tempo até o primeiro byte. O suporte a HTTP/3 aparece como experimental.&lt;/p&gt;
&lt;p&gt;Escolha o oha no lugar dele quando quiser HTTP/2 com menos opções e uma visão ao vivo.&lt;/p&gt;
&lt;h2&gt;Quando passar de um benchmark para um teste de carga de verdade?&lt;/h2&gt;
&lt;p&gt;Quando a pergunta envolve jornadas de usuário, mais carga do que uma máquina consegue gerar ou tráfego vindo de onde os seus usuários estão.&lt;/p&gt;
&lt;p&gt;Todas essas ferramentas disparam requisições simples a partir de uma única máquina, e o guia do h2load lembra que o próprio cliente pode virar o gargalo. Passe para uma ferramenta de teste de carga quando precisar de login, jornadas com várias etapas ou tempo de pensamento, quando o tráfego tiver de vir de várias regiões ou quando um teste precisar passar ou falhar na CI. O nosso guia &lt;a href=&quot;https://loadtest.app/pt-br/how-to-run-a-load-test/&quot;&gt;Como fazer um teste de carga&lt;/a&gt; mostra isso passo a passo, e &lt;a href=&quot;https://loadtest.app/pt-br/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt; compara duas ferramentas baseadas em scripts.&lt;/p&gt;
&lt;p&gt;A LoadFocus, que publica este site, &lt;a href=&quot;https://loadfocus.com/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=http-benchmarking-tools&quot;&gt;roda testes de carga&lt;/a&gt; para sites e APIs a partir de 25 regiões na nuvem, com JMeter, k6 ou testes sem código. Se o seu benchmark é uma requisição que você já manda com curl, o &lt;a href=&quot;https://loadfocus.com/curl-to-k6?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=http-benchmarking-tools&quot;&gt;conversor de cURL para k6&lt;/a&gt; gratuito dela transforma esse comando em um script k6 no próprio navegador.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Qual é a diferença entre wrk e wrk2?&lt;/strong&gt;
O wrk2 é um fork do wrk que envia requisições a uma taxa constante definida com &lt;code&gt;-R&lt;/code&gt; e cronometra cada requisição a partir do momento em que ela deveria ter sido enviada. O wrk mantém ocupado um número fixo de conexões e não tem ajuste de taxa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quais ferramentas de benchmark HTTP suportam HTTP/2?&lt;/strong&gt;
Segundo a documentação delas, hey, oha, bombardier, h2load e Vegeta. wrk e wrk2 não documentam o suporte, o autocannon se descreve como ferramenta HTTP/1.1 e o ab não tem opção de HTTP/2.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-source-load-testing-tools/&quot;&gt;Ferramentas de teste de carga open source: seis opções&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/coordinated-omission/&quot;&gt;Coordinated omission: o que é e como evitar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/websocket-load-testing-tools/&quot;&gt;Ferramentas de teste de carga WebSocket: seis opções&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/tail-latency/&quot;&gt;Latência de cauda: o que é e como medir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/redis-benchmark/&quot;&gt;redis-benchmark: como usar e ler os resultados&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Lei de Little em teste de carga: dimensionar e conferir</title><link>https://loadtest.app/pt-br/littles-law-load-testing/</link><guid isPermaLink="true">https://loadtest.app/pt-br/littles-law-load-testing/</guid><description>A lei de Little em teste de carga explicada: como usuários, requisições por segundo e tempo de resposta se relacionam e como dimensionar um teste fechado.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;A lei de Little em teste de carga diz que o número médio de usuários ou requisições dentro de um sistema é igual ao ritmo com que eles passam por ele multiplicado pelo tempo médio que cada um fica lá: L = λW. Com um número fixo de usuários virtuais, isso vira usuários = voltas por segundo × (tempo de resposta + tempo de pensamento), o que mostra antes de uma execução se o plano consegue atingir a taxa alvo e, depois, se os resultados fecham. Ela trabalha com médias sobre um trecho estável do teste, então não diz nada sobre percentis.&lt;/p&gt;
&lt;p&gt;Os exemplos abaixo são aritmética, sem nenhum teste por trás. Os fatos sobre ferramentas vêm da documentação de cada projeto, conferida em 9 de outubro de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Termo&lt;/th&gt;
&lt;th&gt;Definição de Little&lt;/th&gt;
&lt;th&gt;Usuários virtuais fixos (modelo fechado)&lt;/th&gt;
&lt;th&gt;Taxa de chegada (modelo aberto)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;Número médio de itens no sistema&lt;/td&gt;
&lt;td&gt;Usuários virtuais, esperando ou em pausa&lt;/td&gt;
&lt;td&gt;Iterações em andamento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;λ&lt;/td&gt;
&lt;td&gt;Taxa média de chegada&lt;/td&gt;
&lt;td&gt;Voltas concluídas por segundo&lt;/td&gt;
&lt;td&gt;A taxa que você define&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;W&lt;/td&gt;
&lt;td&gt;Tempo médio dentro do sistema&lt;/td&gt;
&lt;td&gt;Tempo de resposta + tempo de pensamento por volta&lt;/td&gt;
&lt;td&gt;Duração de uma iteração&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;O que diz a lei de Little?&lt;/h2&gt;
&lt;p&gt;No longo prazo, o número médio de itens em um sistema de filas é igual à sua taxa média de chegada multiplicada pelo tempo médio que cada um passa nele. Conhecendo duas das três grandezas, você calcula a terceira.&lt;/p&gt;
&lt;p&gt;John D. C. Little publicou a prova em 1961 na Operations Research com o título &lt;a href=&quot;https://doi.org/10.1287/opre.9.3.383&quot;&gt;A Proof for the Queuing Formula: L = λW&lt;/a&gt;. Na &lt;a href=&quot;https://doi.org/10.1287/opre.1110.0940&quot;&gt;revisão que publicou pelos 50 anos da lei&lt;/a&gt;, de 2011, ele escreve que ela vale sob condições notavelmente gerais: para uma única fila ou uma rede inteira, para uma subclasse de itens ou para todos, e qualquer que seja a ordem de atendimento. O mesmo artigo leva os termos para um servidor: requisições em processamento, requisições por segundo e tempo de resposta médio.&lt;/p&gt;
&lt;h2&gt;O que significam L, λ e W em um teste de carga?&lt;/h2&gt;
&lt;p&gt;Depende de onde você traça a fronteira do sistema. Ao redor do servidor, L são as requisições em andamento e W é o tempo de resposta; ao redor da volta completa de um usuário virtual, L são todos os usuários virtuais e W é o tempo de resposta mais o tempo de pensamento.&lt;/p&gt;
&lt;p&gt;Em um teste com modelo fechado, cada usuário está sempre em algum ponto da sua volta: esperando uma resposta ou fazendo uma pausa entre dois passos. Com a fronteira ao redor da volta, todos contam como &amp;quot;dentro&amp;quot;, λ é o ritmo com que as voltas terminam e W é a duração média de uma volta, incluindo o &lt;a href=&quot;https://loadtest.app/pt-br/think-time-in-load-testing/&quot;&gt;tempo de pensamento&lt;/a&gt; que o script adiciona:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;usuários = voltas por segundo × (resposta + pensamento)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ao redor do servidor, a mesma lei dá as requisições em andamento: requisições por segundo × tempo de resposta médio, o número que seus pools de conexão e threads de trabalho precisam comportar. Mantenha os três valores na mesma fronteira e no mesmo trecho de tempo; misturá-los dá resultados plausíveis e errados.&lt;/p&gt;
&lt;h2&gt;Como dimensionar um teste com modelo fechado usando a lei de Little?&lt;/h2&gt;
&lt;p&gt;Converta a taxa de requisições alvo em voltas por segundo e multiplique pela duração esperada de uma volta: o resultado é o número de usuários virtuais de que o plano precisa. Use o tempo de resposta que você espera com a carga alvo, que costuma ser maior do que o visto com poucos usuários.&lt;/p&gt;
&lt;p&gt;Um exemplo, só aritmética. A meta é 100 requisições por segundo, cada volta envia 4 requisições que devem levar 0,5 segundo cada, e o script faz 3 pausas de 2 segundos em média:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;voltas por segundo  = 100 requisições/s ÷ 4 requisições = 25
duração por volta   = 4 × 0,5 s + 3 × 2 s               = 8 s
usuários virtuais   = 25 voltas/s × 8 s                 = 200
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Trate 200 como o mínimo. Se as respostas levarem 1 segundo com essa carga, uma volta dura 10 segundos e a mesma meta precisa de 250 usuários.&lt;/p&gt;
&lt;h2&gt;Por que os mesmos usuários enviam menos requisições quando o sistema fica lento?&lt;/h2&gt;
&lt;p&gt;O número de usuários é fixo, então quando uma volta fica mais longa, as voltas por segundo precisam cair. A carga cai justamente quando o sistema começa a sofrer.&lt;/p&gt;
&lt;p&gt;Mantenha os 200 usuários e faça cada requisição levar 2 segundos. Uma volta passa a durar 4 × 2 + 6 = 14 segundos, e 200 ÷ 14 dá cerca de 14,3 voltas, ou cerca de 57 requisições por segundo. O teste continua mostrando 200 usuários enquanto roda a pouco mais da metade da taxa planejada. O artigo sobre o &lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;modelo de carga aberto vs fechado&lt;/a&gt; explica por que isso esconde a saturação; a lei de Little prevê o tamanho da queda.&lt;/p&gt;
&lt;p&gt;Ela também mostra como é um limite de capacidade. Quando a taxa de requisições não consegue mais subir, cada usuário extra só acrescenta espera: com um teto de 25 voltas por segundo, 300 usuários significam 12 segundos por volta e 400 usuários, 16. O gráfico de &lt;a href=&quot;https://loadfocus.com/docs/guides/load-testing/response-time-vs-virtual-users?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=littles-law-load-testing&quot;&gt;tempo de resposta vs usuários virtuais&lt;/a&gt; da LoadFocus mostra o tempo de resposta médio e máximo em função do número de usuários virtuais ativos, um ponto por nível alcançado, e é ali que essa subida constante aparece.&lt;/p&gt;
&lt;h2&gt;Como conferir um teste terminado com a lei de Little?&lt;/h2&gt;
&lt;p&gt;Pegue a taxa de requisições e o tempo de resposta médios de um trecho em que o número de usuários ficou estável, reconstrua a partir deles o número de usuários e compare com o que você configurou. Uma diferença grande significa que parte do tempo está escapando dos seus números.&lt;/p&gt;
&lt;p&gt;Outro exemplo aritmético. Uma execução mantém 200 usuários e registra 80 requisições por segundo com média de 0,6 segundo, com as mesmas 4 requisições e 6 segundos de pausas por volta. São 20 voltas por segundo de 4 × 0,6 + 6 = 8,4 segundos cada, o suficiente para 168 usuários. Os outros 32 significam que cada volta durou na verdade 10 segundos, então cerca de 1,6 segundo por volta fica sem explicação. Onde procurar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;O estabelecimento de conexões. No k6, &lt;code&gt;http_req_duration&lt;/code&gt; deixa de fora a resolução DNS e a conexão (&lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;referência de métricas&lt;/a&gt;, conferida em 9 de outubro de 2026).&lt;/li&gt;
&lt;li&gt;O gerador de carga. Um gerador sobrecarregado atrasa o script entre requisições.&lt;/li&gt;
&lt;li&gt;O tempo de pensamento. Pausas aleatórias podem durar em média mais do que o plano prevê.&lt;/li&gt;
&lt;li&gt;A janela. Se ela pega parte de uma rampa, havia em média menos usuários ativos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;O k6 também mede a volta diretamente: &lt;code&gt;vus&lt;/code&gt; conta os usuários virtuais ativos e &lt;code&gt;iteration_duration&lt;/code&gt; a duração de uma iteração completa, então os usuários ativos devem ficar perto de iterações por segundo × duração média de uma iteração.&lt;/p&gt;
&lt;h2&gt;E os testes por taxa de chegada?&lt;/h2&gt;
&lt;p&gt;A lei vale com a fronteira ao redor de cada iteração: as iterações em andamento são iguais à taxa de chegada vezes a duração de uma iteração. Esse é o número de usuários virtuais que a ferramenta precisa manter prontos.&lt;/p&gt;
&lt;p&gt;O guia do k6 sobre &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/arrival-rate-vu-allocation/&quot;&gt;alocação de VUs para executores arrival-rate&lt;/a&gt; estima esse número como a duração mediana de uma iteração × a taxa, mais uma constante para a variação (conferido em 9 de outubro de 2026). É a lei de Little com a mediana no lugar da média; algumas iterações lentas puxam a média para cima da mediana, por isso a margem importa.&lt;/p&gt;
&lt;p&gt;A LoadFocus roda &lt;a href=&quot;https://loadfocus.com/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=littles-law-load-testing&quot;&gt;scripts k6&lt;/a&gt; na própria nuvem, e lá os cenários de taxa de chegada rodam com um número fixo de usuários; o validador de scripts avisa isso quando você adiciona um script assim. Dimensione esses testes com a conta do modelo fechado acima e espere que a taxa caia se as respostas ficarem mais lentas.&lt;/p&gt;
&lt;h2&gt;Onde a lei de Little deixa de funcionar?&lt;/h2&gt;
&lt;p&gt;Ela liga médias sobre um trecho em que o sistema está em equilíbrio. Percentis, janelas curtas e rampas ficam de fora.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Só médias. Um teste pode cumprir a lei enquanto uma em cada vinte requisições espera dez vezes a média; julgue os resultados também pelos percentis.&lt;/li&gt;
&lt;li&gt;Um trecho estável. A prova de 1961 supõe um processo estacionário, e a revisão de 2011 mostra que a fórmula também é exata em uma janela finita que começa e termina vazia. Um platô de teste não é nenhuma das duas coisas, então escolha um longo, em que tantos usuários terminem voltas quantos as comecem.&lt;/li&gt;
&lt;li&gt;Rampas. Enquanto usuários estão sendo adicionados, o pico configurado não é L: use a média de usuários no tempo da janela ou deixe a rampa de fora.&lt;/li&gt;
&lt;li&gt;Erros. Falhas rápidas contam como requisições concluídas com tempos curtos, então um sistema falhando ainda pode fechar a equação. Confira primeiro a taxa de erros.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;A lei de Little exige chegadas de Poisson ou um tipo de fila específico?&lt;/strong&gt;
Não. As provas da revisão de Little não supõem nada sobre o padrão de chegadas nem sobre os tempos de atendimento, e o resultado vale qualquer que seja a ordem de atendimento. Basta que as médias existam no período que você mede.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A lei de Little consegue prever o tempo de resposta p95?&lt;/strong&gt;
Não. Ela liga três médias, então pode conferir um tempo de resposta médio, mas não diz nada sobre a forma da distribuição nem sobre os poucos por cento mais lentos.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;Modelo de carga aberto vs fechado: qual usar e quando&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/think-time-in-load-testing/&quot;&gt;Tempo de pensamento em teste de carga: como definir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/how-to-run-a-load-test/&quot;&gt;Como fazer um teste de carga: guia passo a passo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/throughput-vs-latency/&quot;&gt;Vazão vs latência: como se relacionam sob carga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/redis-benchmark/&quot;&gt;redis-benchmark: como usar e ler os resultados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/amdahls-law/&quot;&gt;Lei de Amdahl: fórmula, exemplos e limites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/queueing-theory/&quot;&gt;Teoria das filas: o que é e por que a latência dispara&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Critérios de aprovação de um teste de carga: como definir</title><link>https://loadtest.app/pt-br/load-test-pass-fail-criteria/</link><guid isPermaLink="true">https://loadtest.app/pt-br/load-test-pass-fail-criteria/</guid><description>Como definir os critérios de aprovação de um teste de carga: partir de um SLO, escolher limites de latência, erros e taxa e separar falhas de avisos.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;Os critérios de aprovação de um teste de carga são os poucos limites que uma execução precisa cumprir para ser aprovada: um percentil de latência para as requisições que os usuários esperam, uma taxa de erros e uma taxa mínima de requisições, tudo sob uma carga definida. Tire os limites de um objetivo de nível de serviço (SLO), coloque dentro deles limites de regressão vindos de execuções anteriores e deixe o código de saída da ferramenta reprovar a execução só por esses limites rígidos. Todo o resto é um aviso que uma pessoa lê.&lt;/p&gt;
&lt;p&gt;Os fatos sobre as ferramentas foram conferidos em 9 de outubro de 2026 na documentação de cada projeto, e todo limite mostrado é um exemplo.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Critério&lt;/th&gt;
&lt;th&gt;Limite de exemplo&lt;/th&gt;
&lt;th&gt;De onde vem o número&lt;/th&gt;
&lt;th&gt;Se não for cumprido&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;p95 de latência, checkout&lt;/td&gt;
&lt;td&gt;Abaixo de 400 ms&lt;/td&gt;
&lt;td&gt;SLO de latência menos uma margem&lt;/td&gt;
&lt;td&gt;Reprovação&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;p99 de latência, checkout&lt;/td&gt;
&lt;td&gt;Abaixo de 1.200 ms&lt;/td&gt;
&lt;td&gt;Execuções anteriores deste teste&lt;/td&gt;
&lt;td&gt;Aviso&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Taxa de erros&lt;/td&gt;
&lt;td&gt;Abaixo de 0,5%&lt;/td&gt;
&lt;td&gt;SLO de disponibilidade&lt;/td&gt;
&lt;td&gt;Reprovação&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requisições por segundo&lt;/td&gt;
&lt;td&gt;Pelo menos 95% do plano&lt;/td&gt;
&lt;td&gt;A carga planejada&lt;/td&gt;
&lt;td&gt;Reprovação&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU do gerador de carga&lt;/td&gt;
&lt;td&gt;Abaixo de 80%&lt;/td&gt;
&lt;td&gt;Ferramenta ou plataforma&lt;/td&gt;
&lt;td&gt;Execução inválida&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;O que faz um teste de carga passar ou falhar?&lt;/h2&gt;
&lt;p&gt;Uma execução passa quando todos os limites rígidos se mantêm sob a carga planejada e falha assim que um deles é violado. Ela é inválida quando o próprio teste não cumpriu seu papel, sejam quais forem os números.&lt;/p&gt;
&lt;p&gt;Um gerador de carga saturado, uma carga que nunca chegou à meta ou um script com erros produzem números sobre a montagem do teste. A LoadFocus, por exemplo, mostra um aviso de &lt;a href=&quot;https://loadfocus.com/docs/guides/load-testing/load-generator-saturation?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=load-test-pass-fail-criteria&quot;&gt;saturação do gerador de carga&lt;/a&gt; quando algum motor chegou a 80% de CPU ou mais no pico. Os &lt;a href=&quot;https://github.com/grafana/k6/blob/master/errext/exitcodes/codes.go&quot;&gt;códigos de saída do k6&lt;/a&gt; separam os casos para a CI: 99 indica thresholds violados e 107 uma exceção no script (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Como transformar um SLO em critérios de teste de carga?&lt;/h2&gt;
&lt;p&gt;Reescreva cada SLO que a carga pode quebrar, em geral latência e disponibilidade, como um limite sobre o que o teste mede, e deixe esse limite mais rígido que o SLO para que a aprovação tenha folga.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://sre.google/sre-book/service-level-objectives/&quot;&gt;livro de SRE do Google&lt;/a&gt; define um SLO como um valor-alvo ou uma faixa de valores para um nível de serviço medido por um indicador (SLI), com exemplos como: 99% das chamadas &lt;code&gt;Get&lt;/code&gt; terminam em menos de 100 ms. Ele pede que um SLO diga como é medido e em que condições vale, e recomenda uma margem de segurança: uma meta interna mais rígida que a prometida aos usuários.&lt;/p&gt;
&lt;p&gt;Num teste de carga, essas condições são a carga e o mix de requisições. &amp;quot;95% das chamadas de checkout abaixo de 500 ms&amp;quot; poderia virar, como exemplo, &amp;quot;p95 do checkout abaixo de 400 ms com 300 requisições por segundo durante 15 minutos&amp;quot;. Se ainda não houver SLO, combine um provisório com quem responde pelo produto.&lt;/p&gt;
&lt;h2&gt;Quais métricas os critérios devem cobrir?&lt;/h2&gt;
&lt;p&gt;A latência das requisições que os usuários esperam, uma taxa de erros, a taxa de requisições alcançada e, principalmente como avisos, os recursos dos servidores.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Latência por tipo de requisição.&lt;/strong&gt; Um percentil global mistura um health check rápido com uma busca lenta. No k6, &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;requisições com tag criam submétricas&lt;/a&gt; com limites próprios; no Gatling, &lt;code&gt;details()&lt;/code&gt; mira uma requisição ou um grupo. Um teste que freou a própria carga mostra percentis bonitos demais (&lt;a href=&quot;https://loadtest.app/pt-br/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Erros, no sentido amplo.&lt;/strong&gt; Um 200 rápido com uma página de erro continua sendo uma falha, então verifique o conteúdo. Uma &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Response_Assertion&quot;&gt;Response Assertion&lt;/a&gt; do JMeter que falha marca sua amostra como malsucedida; os checks do k6 só afetam o código de saída por meio de um threshold.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Um piso para a taxa de requisições.&lt;/strong&gt; Num modelo de carga fechado, um sistema lento recebe menos requisições, então uma execução pode cumprir os limites de latência com uma fração da carga planejada (&lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;modelo de carga aberto vs fechado&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recursos dos servidores.&lt;/strong&gt; CPU, memória e uso de pools vêm do seu monitoramento. Trate-os como avisos, a menos que um plano de capacidade defina um teto rígido.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Como escolher os números?&lt;/h2&gt;
&lt;p&gt;O teto vem do SLO e o limite de regressão vem de execuções anteriores do mesmo teste. O SLO diz o que os usuários toleram; as execuções anteriores dizem o que este build costuma fazer.&lt;/p&gt;
&lt;p&gt;O livro de SRE desaconselha definir um SLO a partir do desempenho atual. Um limite de regressão existe para notar mudanças, então o desempenho atual é justamente a sua matéria-prima. Rode o build sem alterações várias vezes, com o mesmo ambiente e a mesma carga, anote quanto cada métrica varia e coloque o limite acima da pior execução com alguma folga, sempre abaixo do teto derivado do SLO quando houver um.&lt;/p&gt;
&lt;p&gt;Se as execuções de um mesmo build variam mais do que a regressão que você quer detectar, o teste está ruidoso demais para bloquear builds: primeiro alongue a fase estável ou isole o ambiente. Registre novas execuções de referência depois de qualquer mudança intencional.&lt;/p&gt;
&lt;h2&gt;Quais critérios devem reprovar o build e quais devem só avisar?&lt;/h2&gt;
&lt;p&gt;Reprove o build nos limites que vêm de um SLO ou que verificam se as respostas estão corretas. Avise sobre percentis de cauda, uso de recursos e desvios lentos, que pedem avaliação; uma barreira que falha por ruído logo acaba desligada.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/ensure&quot;&gt;plugin &lt;code&gt;ensure&lt;/code&gt;&lt;/a&gt; do Artillery tem um nível de aviso: uma condição com &lt;code&gt;strict: false&lt;/code&gt; é opcional, então descumpri-la não muda o código de saída (conferido em 9 de outubro de 2026). No k6, um check sem threshold nunca reprova a execução. Nas outras ferramentas, deixe os avisos fora das assertions.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;config:
  plugins:
    ensure:
      thresholds:
        - &amp;quot;http.response_time.p95&amp;quot;: 400
      conditions:
        - expression: &amp;quot;http.response_time.p99 &amp;lt; 1200&amp;quot;
          strict: false
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Quando um teste de carga deve parar antes da hora?&lt;/h2&gt;
&lt;p&gt;Quando continuar só pode causar dano ou já não prova nada: erros muito acima do limite, um sistema já fora do ar ou um gerador que não dá conta. Dê à regra um período de carência para que o ruído do início não a dispare.&lt;/p&gt;
&lt;p&gt;Deixe as regras de parada mais frouxas que os limites de aprovação: elas protegem um ambiente compartilhado. No k6, &lt;code&gt;abortOnFail&lt;/code&gt; interrompe o teste assim que um threshold falha, depois de um &lt;code&gt;delayAbortEval&lt;/code&gt; opcional. A &lt;a href=&quot;https://docs.locust.io/en/stable/extending-locust.html&quot;&gt;documentação do Locust sobre extensões&lt;/a&gt; mostra um greenlet em segundo plano que encerra a execução quando a proporção de falhas passa de um limite. No Gatling, &lt;a href=&quot;https://docs.gatling.io/concepts/scenario/&quot;&gt;&lt;code&gt;crashLoadGeneratorIf&lt;/code&gt;&lt;/a&gt; para o gerador com um código de falha quando uma condição é verdadeira na sessão de um usuário virtual. Um &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Thread_Group&quot;&gt;Thread Group&lt;/a&gt; do JMeter pode parar o teste diante de um erro de sampler, o que serve para uma verificação de correção (tudo conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Como cada ferramenta codifica os critérios?&lt;/h2&gt;
&lt;p&gt;k6 e Artillery transformam um limite rígido violado em um código de saída diferente de zero, o Locust faz isso para qualquer requisição com falha ou para limites que você mesmo programa, e as assertions do Gatling reprovam o build. O JMeter deixa o veredito para uma etapa depois da execução.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;k6&lt;/strong&gt;: os &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; ficam nas opções do script. Este exemplo reprova pelo p95 das requisições com a tag &lt;code&gt;name: checkout&lt;/code&gt; ou por 0,5% de erros, e interrompe o teste após um minuto se os erros passarem de 5%:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;export const options = {
  thresholds: {
    &amp;quot;http_req_duration{name:checkout}&amp;quot;: [&amp;quot;p(95)&amp;lt;400&amp;quot;],
    http_req_failed: [
      &amp;quot;rate&amp;lt;0.005&amp;quot;,
      { threshold: &amp;quot;rate&amp;lt;0.05&amp;quot;, abortOnFail: true,
        delayAbortEval: &amp;quot;1m&amp;quot; },
    ],
  },
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Gatling&lt;/strong&gt;: as &lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;assertions&lt;/a&gt; combinam um escopo (&lt;code&gt;global&lt;/code&gt;, &lt;code&gt;forAll&lt;/code&gt;, &lt;code&gt;details&lt;/code&gt;), uma estatística como um percentil ou &lt;code&gt;requestsPerSec&lt;/code&gt;, e uma condição. Elas são avaliadas ao fim da execução, e uma única assertion com falha reprova a simulação.&lt;/p&gt;
&lt;p&gt;O &lt;strong&gt;Locust&lt;/strong&gt; &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;sai com código 1 quando alguma requisição falhou&lt;/a&gt;, e &lt;code&gt;--exit-code-on-error&lt;/code&gt; muda esse código. Para uma proporção ou um percentil, defina &lt;code&gt;environment.process_exit_code&lt;/code&gt; num listener de &lt;code&gt;quitting&lt;/code&gt;; o &lt;a href=&quot;https://github.com/locustio/locust/blob/master/locust/main.py&quot;&gt;código-fonte do Locust&lt;/a&gt; dá prioridade a esse valor.&lt;/p&gt;
&lt;p&gt;O &lt;strong&gt;JMeter&lt;/strong&gt; julga cada amostra com suas assertions, e as suas &lt;a href=&quot;https://jmeter.apache.org/usermanual/get-started.html&quot;&gt;opções de linha de comando&lt;/a&gt; não trazem nenhum limite para a execução inteira. Quem decide é a CI: um script curto sobre o arquivo de resultados, como no nosso &lt;a href=&quot;https://loadtest.app/pt-br/load-testing-in-github-actions/&quot;&gt;guia de GitHub Actions&lt;/a&gt;, ou o &lt;a href=&quot;https://github.com/jmeter-maven-plugin/jmeter-maven-plugin/wiki/Test-Results-File-Format&quot;&gt;jmeter-maven-plugin&lt;/a&gt;, um plugin de terceiros cujo goal &lt;code&gt;results&lt;/code&gt; reprova o build se uma única amostra falhar, a menos que &lt;code&gt;errorRateThresholdInPercent&lt;/code&gt; defina uma taxa (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;LoadFocus&lt;/strong&gt; avalia as execuções com &lt;a href=&quot;https://loadfocus.com/docs/guides/load-testing/pass-fail-thresholds?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=load-test-pass-fail-criteria&quot;&gt;thresholds de aprovação ou reprovação&lt;/a&gt; salvos no teste: tempos de resposta p95 e p99 máximos, taxa de erros máxima e taxa mínima de requisições, cada um opcional. Cada execução recebe um selo PASS ou FAIL com os valores medidos e as metas, e uma API entrega o veredito a um pipeline. A LoadFocus roda cenários do k6 com taxa de chegada usando um número fixo de usuários, então ali um piso de taxa verifica o que esses usuários alcançaram.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;O tempo de resposta médio deve ser um critério de aprovação?&lt;/strong&gt;
Raramente. O livro de SRE prefere percentis: uma média esconde a cauda longa e pode ficar estável enquanto as requisições mais lentas ficam muito mais lentas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quantos critérios de aprovação um teste de carga deve ter?&lt;/strong&gt;
Um punhado de limites rígidos, mais avisos. O livro de SRE recomenda ter o menor número possível de SLOs e diz que, se citar um deles nunca ajuda a vencer uma discussão sobre prioridades, provavelmente não vale a pena mantê-lo. Aplique a mesma regra a cada limite de um teste de carga.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Um teste de carga pode passar com algumas requisições com falha?&lt;/strong&gt;
Sim, se a taxa de erros ficar abaixo do limite. Verifique o comportamento padrão da sua ferramenta: o Locust reprova a execução com uma única requisição com falha.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/load-testing-in-github-actions/&quot;&gt;Teste de carga no GitHub Actions: guia prático&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/coordinated-omission/&quot;&gt;Coordinated omission: o que é e como evitar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/how-to-run-a-load-test/&quot;&gt;Como fazer um teste de carga: guia passo a passo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/apdex-score/&quot;&gt;Pontuação Apdex: o que é e como calcular&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/slo-vs-sla/&quot;&gt;SLO vs SLA: a diferença, os SLIs e o orçamento de erros&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Teste de carga no GitHub Actions: guia prático</title><link>https://loadtest.app/pt-br/load-testing-in-github-actions/</link><guid isPermaLink="true">https://loadtest.app/pt-br/load-testing-in-github-actions/</guid><description>Como montar teste de carga no GitHub Actions com k6, Artillery, Locust ou JMeter: thresholds que reprovam o job, artefatos e o que um runner aguenta.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;Para fazer teste de carga no GitHub Actions basta um arquivo de workflow: instalar a ferramenta, rodar um teste curto contra uma URL de staging e deixar o código de saída da ferramenta reprovar o job quando um threshold não for atingido. Envie os resultados como artefato para que cada execução deixe registro. Mantenha o teste pequeno, porque um runner padrão hospedado pelo GitHub é uma única máquina virtual com poucos núcleos de CPU.&lt;/p&gt;
&lt;p&gt;Os dados sobre as ferramentas e sobre o GitHub vêm da documentação de cada fornecedor, conferidos em 9 de outubro de 2026, e os workflows seguem esse uso documentado.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ferramenta&lt;/th&gt;
&lt;th&gt;Instalada por&lt;/th&gt;
&lt;th&gt;O que reprova o job&lt;/th&gt;
&lt;th&gt;Resultados para guardar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;setup-k6-action&lt;/code&gt; da Grafana&lt;/td&gt;
&lt;td&gt;Um threshold não atingido&lt;/td&gt;
&lt;td&gt;Saída em JSON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery&lt;/td&gt;
&lt;td&gt;&lt;code&gt;artilleryio/action-cli&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Uma verificação &lt;code&gt;ensure&lt;/code&gt; que falhou&lt;/td&gt;
&lt;td&gt;&lt;code&gt;report.json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pip install locust&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Qualquer requisição com falha, ou uma regra sua&lt;/td&gt;
&lt;td&gt;Arquivos CSV e HTML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;O arquivo da versão&lt;/td&gt;
&lt;td&gt;Nada embutido: adicione um passo de verificação&lt;/td&gt;
&lt;td&gt;Arquivo &lt;code&gt;.jtl&lt;/code&gt; e relatório HTML&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Do que um workflow de teste de carga precisa?&lt;/h2&gt;
&lt;p&gt;De um gatilho, um runner, um passo que instala a ferramenta, um passo que roda o teste com thresholds e um passo que envia os resultados. O resto é opcional.&lt;/p&gt;
&lt;p&gt;Guarde o script de teste no repositório, por exemplo em &lt;code&gt;tests/load/&lt;/code&gt;. Leia a URL de staging de uma variável do repositório pelo &lt;a href=&quot;https://docs.github.com/en/actions/reference/workflows-and-actions/contexts&quot;&gt;contexto &lt;code&gt;vars&lt;/code&gt;&lt;/a&gt; e defina &lt;code&gt;timeout-minutes&lt;/code&gt; no job: &lt;a href=&quot;https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax&quot;&gt;o padrão é de 360 minutos&lt;/a&gt; (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Quais eventos devem disparar um teste de carga?&lt;/h2&gt;
&lt;p&gt;Rode um teste curto nos pull requests e um mais longo por agendamento ou manualmente.&lt;/p&gt;
&lt;p&gt;Use &lt;code&gt;pull_request&lt;/code&gt; para pegar uma regressão antes do merge, &lt;code&gt;workflow_dispatch&lt;/code&gt; para execuções manuais e &lt;code&gt;schedule&lt;/code&gt; para execuções cron (em UTC, a menos que você defina um fuso horário). A &lt;a href=&quot;https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows&quot;&gt;referência de eventos&lt;/a&gt; do GitHub traz alguns limites (conferido em 9 de outubro de 2026): agendamentos rodam só na branch padrão, no máximo a cada cinco minutos, e podem atrasar no começo de cada hora. Pull requests vindos de forks não recebem segredos além do &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Como rodar o k6 no GitHub Actions?&lt;/h2&gt;
&lt;p&gt;Use as duas actions oficiais da Grafana, uma para instalar o k6 e outra para rodar o script. O passo falha sempre que o k6 termina com código de saída diferente de zero, que é o que um threshold não atingido provoca.&lt;/p&gt;
&lt;p&gt;Tanto a &lt;a href=&quot;https://github.com/grafana/setup-k6-action&quot;&gt;setup-k6-action&lt;/a&gt; quanto a &lt;a href=&quot;https://github.com/grafana/run-k6-action&quot;&gt;run-k6-action&lt;/a&gt; estão na &lt;code&gt;v1&lt;/code&gt; (conferido em 9 de outubro de 2026):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;name: load-test
on:
  pull_request:
  workflow_dispatch:

jobs:
  k6:
    runs-on: ubuntu-latest
    timeout-minutes: 15
    env:
      BASE_URL: ${{ vars.STAGING_URL }}
    steps:
      - uses: actions/checkout@v7
      - uses: grafana/setup-k6-action@v1
      - uses: grafana/run-k6-action@v1
        with:
          path: tests/load/smoke.js
          flags: --out json=results.json
      - uses: actions/upload-artifact@v7
        if: always()
        with:
          name: k6-results
          path: results.json
          retention-days: 14
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Os thresholds ficam no script, que lê &lt;code&gt;BASE_URL&lt;/code&gt; do ambiente:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;

export const options = {
  vus: 10,
  duration: &amp;quot;1m&amp;quot;,
  thresholds: {
    http_req_failed: [&amp;quot;rate&amp;lt;0.01&amp;quot;],
    http_req_duration: [&amp;quot;p(95)&amp;lt;500&amp;quot;],
  },
};

export default function () {
  http.get(`${__ENV.BASE_URL}/health`);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A documentação do k6 deixa claro que &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;os checks não afetam o código de saída&lt;/a&gt;, então a decisão de aprovar ou reprovar precisa vir dos thresholds.&lt;/p&gt;
&lt;h2&gt;Como rodar Artillery, Locust ou JMeter no lugar?&lt;/h2&gt;
&lt;p&gt;Troque os passos de instalação e execução, mantenha o resto do workflow e use o mecanismo de cada ferramenta para falhar quando uma meta não for atingida.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artillery&lt;/strong&gt; tem uma &lt;a href=&quot;https://www.artillery.io/docs/cicd/github-actions&quot;&gt;GitHub Action oficial&lt;/a&gt; cujo &lt;a href=&quot;https://github.com/artilleryio/action-cli&quot;&gt;README&lt;/a&gt; diz que a &lt;code&gt;@v2&lt;/code&gt; acompanha a versão 2.x mais recente (conferido em 9 de outubro de 2026). O passo é &lt;code&gt;uses: artilleryio/action-cli@v2&lt;/code&gt; com &lt;code&gt;command: run --target ${{ vars.STAGING_URL }} tests/load/api.yml --output report.json&lt;/code&gt;, e o &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/ensure&quot;&gt;plugin ensure&lt;/a&gt; faz o Artillery sair com código diferente de zero quando uma meta não é atingida. A seção &lt;code&gt;config&lt;/code&gt; do script:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;config:
  target: &amp;quot;https://staging.example.com&amp;quot;
  phases:
    - duration: 60
      arrivalRate: 5
  plugins:
    ensure:
      thresholds:
        - &amp;quot;http.response_time.p95&amp;quot;: 500
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Locust&lt;/strong&gt; &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;sai com código 1 quando alguma requisição falhou&lt;/a&gt;, e para regras de latência você define &lt;code&gt;environment.process_exit_code&lt;/code&gt; num listener do evento &lt;code&gt;quitting&lt;/code&gt;, como mostra a mesma página (conferido em 9 de outubro de 2026). Depois de &lt;code&gt;actions/setup-python@v7&lt;/code&gt; com &lt;code&gt;python-version: &amp;quot;3.13&amp;quot;&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;      - run: pip install locust
      - run: &amp;gt;
          locust -f tests/load/locustfile.py --headless
          -u 20 -r 5 -t 2m -H &amp;quot;$BASE_URL&amp;quot;
          --csv results --html report.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;JMeter&lt;/strong&gt; roda sem interface gráfica com &lt;code&gt;-n&lt;/code&gt;, e as &lt;a href=&quot;https://jmeter.apache.org/usermanual/get-started.html&quot;&gt;opções de linha de comando do manual&lt;/a&gt; não incluem nenhum threshold de aprovação (conferido em 9 de outubro de 2026). Um passo curto pode ler o arquivo de resultados, em CSV com uma coluna &lt;code&gt;success&lt;/code&gt; por padrão, e reprovar o job por conta própria:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;      - uses: actions/setup-java@v6
        with:
          distribution: temurin
          java-version: &amp;quot;21&amp;quot;
      - name: Install JMeter 5.6.3
        env:
          JM_BASE: https://archive.apache.org/dist/jmeter/binaries
        run: curl -sSL &amp;quot;$JM_BASE/apache-jmeter-5.6.3.tgz&amp;quot; | tar -xzf -
      - name: Run the test plan
        run: &amp;gt;
          apache-jmeter-5.6.3/bin/jmeter -n -t tests/load/plan.jmx
          -l results.jtl -e -o report
      - name: Fail above 1% errors
        run: |
          python3 - &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
          import csv, sys
          rows = list(csv.DictReader(open(&amp;quot;results.jtl&amp;quot;)))
          bad = sum(r[&amp;quot;success&amp;quot;] != &amp;quot;true&amp;quot; for r in rows)
          print(f&amp;quot;{bad} of {len(rows)} samples failed&amp;quot;)
          sys.exit(1 if not rows or bad &amp;gt; 0.01 * len(rows) else 0)
          EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Como fazer o job falhar quando o teste não atinge uma meta?&lt;/h2&gt;
&lt;p&gt;Escreva as metas no teste como thresholds e deixe o código de saída fazer o resto. O GitHub marca um passo como falho quando o comando dele termina com código diferente de zero, e o job falha junto.&lt;/p&gt;
&lt;p&gt;Comece com uma taxa de erro rígida e um percentil de latência folgado, e aperte o limite de latência quando souber o quanto seus números variam de uma execução para outra. O &lt;a href=&quot;https://loadtest.app/pt-br/how-to-run-a-load-test/&quot;&gt;guia passo a passo de teste de carga&lt;/a&gt; mostra como escolher essas metas.&lt;/p&gt;
&lt;h2&gt;Onde devem ficar os resultados de cada execução?&lt;/h2&gt;
&lt;p&gt;Envie-os como artefato do workflow, com &lt;code&gt;if: always()&lt;/code&gt; para que um teste reprovado ainda guarde o relatório. Os artefatos ficam guardados por 90 dias por padrão, e &lt;code&gt;retention-days&lt;/code&gt; encurta esse prazo.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/actions/upload-artifact&quot;&gt;README da upload-artifact&lt;/a&gt; documenta os 90 dias padrão (conferido em 9 de outubro de 2026). Defina &lt;code&gt;if-no-files-found: error&lt;/code&gt; para que um relatório ausente faça o passo falhar de forma visível.&lt;/p&gt;
&lt;h2&gt;Quanta carga um runner hospedado pelo GitHub consegue gerar?&lt;/h2&gt;
&lt;p&gt;O suficiente para um smoke test ou uma pequena checagem de regressão. Um runner Linux padrão tem 4 CPUs e 16 GB de RAM em repositórios públicos, 2 CPUs e 8 GB em privados, e um job para depois de 6 horas.&lt;/p&gt;
&lt;p&gt;Esses números vêm da &lt;a href=&quot;https://docs.github.com/en/actions/reference/runners/github-hosted-runners&quot;&gt;referência de runners&lt;/a&gt; e dos &lt;a href=&quot;https://docs.github.com/en/actions/reference/limits&quot;&gt;limites do Actions&lt;/a&gt; do GitHub (conferido em 9 de outubro de 2026), que não trazem nenhum número de largura de banda de rede.&lt;/p&gt;
&lt;p&gt;Um job roda numa única máquina, então é um único gerador de carga: se a CPU dele satura, os tempos de resposta incluem o tempo de espera no próprio runner. Toda requisição também sai dessa máquina, então rate limiters que contam por endereço de cliente enxergam um único cliente muito ativo. O GitHub desaconselha colocar em allowlists as faixas de IP do Azure usadas pelos runners Ubuntu; runners maiores (larger runners) nos planos Team e Enterprise Cloud trazem mais CPU, mais memória e endereços IP estáticos.&lt;/p&gt;
&lt;h2&gt;Quando a carga deve vir de outro lugar?&lt;/h2&gt;
&lt;p&gt;Quando você precisa de mais carga do que uma máquina produz, de tráfego de várias regiões ou de execuções mais longas que o limite de um job.&lt;/p&gt;
&lt;p&gt;Com k6, a &lt;a href=&quot;https://github.com/grafana/run-k6-action&quot;&gt;&lt;code&gt;run-k6-action&lt;/code&gt;&lt;/a&gt; roda o teste no Grafana Cloud k6 quando você define &lt;code&gt;cloud-run-locally: false&lt;/code&gt; e passa &lt;code&gt;K6_CLOUD_TOKEN&lt;/code&gt;, &lt;code&gt;K6_CLOUD_PROJECT_ID&lt;/code&gt; e, com o k6 v2, &lt;code&gt;K6_CLOUD_STACK_ID&lt;/code&gt;. Uma &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/environment-variables/&quot;&gt;execução na nuvem&lt;/a&gt; ignora por padrão o ambiente do runner, então adicione &lt;code&gt;-e BASE_URL=${{ vars.STAGING_URL }}&lt;/code&gt; a &lt;code&gt;flags&lt;/code&gt; (conferido em 10 de outubro de 2026). A &lt;a href=&quot;https://www.artillery.io/docs/cicd/github-actions&quot;&gt;action do Artillery&lt;/a&gt; pode chamar &lt;code&gt;run-fargate&lt;/code&gt; ou &lt;code&gt;run-lambda&lt;/code&gt; para gerar a carga a partir da sua própria conta AWS (ambos conferidos em 9 de outubro de 2026). O &lt;a href=&quot;https://loadtest.app/pt-br/k6-vs-artillery/&quot;&gt;comparativo k6 vs Artillery&lt;/a&gt; cobre os dois.&lt;/p&gt;
&lt;p&gt;Para JMeter, a LoadFocus documenta uma &lt;a href=&quot;https://loadfocus.com/docs/guides/jmeter-load-testing/jmeter-integration-ci-cd/github-actions?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=load-testing-in-github-actions&quot;&gt;integração com o GitHub Actions&lt;/a&gt; baseada no seu cliente npm. Você salva o teste na sua conta LoadFocus, guarda a chave de API e o ID do time como segredos e chama &lt;code&gt;run-test&lt;/code&gt;. As flags abaixo seguem a ajuda do cliente:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;      - run: npm install -g @loadfocus/loadfocus-api-client
      - env:
          LF_KEY: ${{ secrets.LOADFOCUS_API_KEY }}
          LF_TEAM: ${{ secrets.LOADFOCUS_TEAM_ID }}
        run: |
          test -n &amp;quot;$LF_KEY&amp;quot;
          test -n &amp;quot;$LF_TEAM&amp;quot;
          loadfocus-api config set \
            --apikey &amp;quot;$LF_KEY&amp;quot; --teamid &amp;quot;$LF_TEAM&amp;quot;
          loadfocus-api jmeter run-test --name checkout-api \
            --thresholds &amp;quot;avgresponse&amp;lt;=200,errors==0,p95&amp;lt;=250&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O cliente espera até 1.800 segundos por padrão (&lt;code&gt;--wait-timeout&lt;/code&gt; muda isso), então dê ao job um &lt;code&gt;timeout-minutes&lt;/code&gt; acima de 30, como 40. Ele sai com código 1 quando um threshold não é atingido e com 0 quando falta a chave de API ou o ID do time, por isso as linhas &lt;code&gt;test -n&lt;/code&gt; fazem o passo falhar antes quando um segredo está vazio. A carga vem da LoadFocus, que &lt;a href=&quot;https://loadfocus.com/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=load-testing-in-github-actions&quot;&gt;roda scripts JMeter a partir de 25 regiões na nuvem&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Quanto tempo deve durar um teste de carga num pull request?&lt;/strong&gt;
Alguns minutos: o bastante para passar da rampa de subida e obter um percentil estável, e pouco o bastante para ninguém ficar esperando.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;É permitido fazer teste de carga a partir de runners hospedados pelo GitHub?&lt;/strong&gt;
Os &lt;a href=&quot;https://docs.github.com/en/site-policy/github-terms/github-terms-for-additional-products-and-features&quot;&gt;termos do GitHub para o Actions&lt;/a&gt; proíbem perturbar qualquer serviço e limitam os runners hospedados ao trabalho no próprio projeto do repositório (conferido em 9 de outubro de 2026). Testar o ambiente de staging desse mesmo projeto, sem sobrecarregar os servidores do GitHub, é o tipo de teste que esses termos descrevem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Posso usar um runner auto-hospedado no lugar?&lt;/strong&gt;
Sim. Ele roda no seu próprio hardware e na sua rede, e a página de limites do GitHub permite que um job dure até 5 dias nele. Ele continua sendo um único gerador de carga.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/load-test-pass-fail-criteria/&quot;&gt;Critérios de aprovação de um teste de carga: como definir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/how-to-run-a-load-test/&quot;&gt;Como fazer um teste de carga: guia passo a passo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/k6-vs-artillery/&quot;&gt;k6 vs Artillery: qual ferramenta de teste de carga escolher&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Teste de carga com Locust: análise da ferramenta Python</title><link>https://loadtest.app/pt-br/locust-load-testing/</link><guid isPermaLink="true">https://loadtest.app/pt-br/locust-load-testing/</guid><description>Teste de carga com Locust: locustfiles em Python, interface web e modo headless, modo distribuído, CI, limites, outras ferramentas Python e quando usar k6.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, que vende um serviço de teste de carga abordado neste artigo.&lt;/p&gt;&lt;p&gt;O Locust é uma ferramenta de teste de carga em Python, gratuita e sob licença MIT, em que cada teste é um programa Python, executado por usuários leves a partir de uma interface web ou da linha de comando. O teste de carga com Locust combina com equipes que escrevem Python e testam principalmente serviços HTTP. Quem precisa de muitos protocolos prontos para uso ou de um editor gráfico de testes fica mais bem servido pelo JMeter, e quem escreve JavaScript, pelo k6.&lt;/p&gt;
&lt;p&gt;Não rodamos o Locust para esta análise. Os fatos vêm da documentação, do repositório e da página no PyPI do Locust, conferidos em 9 de outubro de 2026, e as avaliações são nossas.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tema&lt;/th&gt;
&lt;th&gt;Locust&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licença&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ambiente&lt;/td&gt;
&lt;td&gt;Python 3.11 ou mais recente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versão atual&lt;/td&gt;
&lt;td&gt;2.46.7 (4 de outubro de 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Formato dos testes&lt;/td&gt;
&lt;td&gt;Classes Python em um locustfile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execução&lt;/td&gt;
&lt;td&gt;Interface web na porta 8089, ou headless&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocolos embutidos&lt;/td&gt;
&lt;td&gt;HTTP e HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escala&lt;/td&gt;
&lt;td&gt;Um master e quantos workers forem necessários&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resultados&lt;/td&gt;
&lt;td&gt;Gráficos ao vivo, CSV, HTML, JSON, OpenTelemetry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI&lt;/td&gt;
&lt;td&gt;Código de saída 1 se alguma requisição falhar&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Quem desenvolve o Locust, e ele ainda é mantido?&lt;/h2&gt;
&lt;p&gt;Lars Holmberg mantém o Locust, e a Microsoft patrocina esse trabalho. As versões saem com frequência: 17 até agora em 2026.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;README do Locust&lt;/a&gt; cita os dois. O &lt;a href=&quot;https://pypi.org/project/locust/&quot;&gt;PyPI&lt;/a&gt; mostra a 2.46.7, publicada em 4 de outubro de 2026, como a versão mais recente, e exige Python 3.11 ou mais recente (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Como funciona um locustfile?&lt;/h2&gt;
&lt;p&gt;Um locustfile é um módulo Python comum com pelo menos uma classe de usuário. Cada usuário simulado executa suas tarefas uma após a outra e faz uma pausa entre elas, conforme o seu &lt;code&gt;wait_time&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Segundo o &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;guia do locustfile&lt;/a&gt;, o &lt;code&gt;HttpUser&lt;/code&gt; dá a cada usuário um &lt;code&gt;client&lt;/code&gt; que encapsula o python-requests, mantém os cookies e registra cada requisição. Os métodos marcados com &lt;code&gt;@task&lt;/code&gt; são sorteados, com peso dado pelo número no decorator, e o &lt;code&gt;on_start&lt;/code&gt; roda uma vez por usuário. Este usuário faz login, navega pelo catálogo quatro vezes mais do que finaliza compras e inicia no máximo uma tarefa a cada 10 segundos:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from locust import HttpUser, task, constant_pacing


class Shopper(HttpUser):
    wait_time = constant_pacing(10)

    def on_start(self):
        self.client.post(&amp;quot;/login&amp;quot;, json={&amp;quot;user&amp;quot;: &amp;quot;demo&amp;quot;})

    @task(4)
    def browse(self):
        self.client.get(&amp;quot;/products?page=2&amp;quot;, name=&amp;quot;/products&amp;quot;)

    @task
    def checkout(self):
        with self.client.post(
            &amp;quot;/checkout&amp;quot;, catch_response=True
        ) as resp:
            if &amp;quot;order_id&amp;quot; not in resp.text:
                resp.failure(&amp;quot;no order id&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O &lt;code&gt;catch_response&lt;/code&gt; permite marcar uma requisição como falha pelo conteúdo, e o &lt;code&gt;name&lt;/code&gt; agrupa URLs variáveis em uma única linha das estatísticas. As outras funções de espera são &lt;code&gt;constant&lt;/code&gt;, &lt;code&gt;between&lt;/code&gt;, &lt;code&gt;constant_throughput&lt;/code&gt; e, desde a &lt;a href=&quot;https://github.com/locustio/locust/releases/tag/2.46.6&quot;&gt;versão 2.46.6&lt;/a&gt;, &lt;code&gt;poisson&lt;/code&gt;; nosso guia sobre &lt;a href=&quot;https://loadtest.app/pt-br/think-time-in-load-testing/&quot;&gt;tempo de pensamento em teste de carga&lt;/a&gt; explica como essas pausas moldam a carga. A documentação acrescenta que o tempo de espera só consegue limitar a vazão e não inicia novos usuários para atingir uma taxa-alvo. Um teste do Locust é, portanto, um grupo fixo de usuários: um &lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;modelo de carga fechado&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;É melhor usar a interface web ou o modo headless?&lt;/h2&gt;
&lt;p&gt;Use a interface web enquanto explora e o modo headless para execuções repetíveis.&lt;/p&gt;
&lt;p&gt;O comando &lt;code&gt;locust&lt;/code&gt; sobe uma &lt;a href=&quot;https://docs.locust.io/en/stable/quickstart.html&quot;&gt;interface web&lt;/a&gt; na porta 8089. Nela você define o host, os usuários e a rampa de subida, acompanha gráficos ao vivo e muda a carga no meio do teste. O &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;modo headless&lt;/a&gt; recebe as mesmas configurações como opções:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;locust -f locustfile.py --headless -u 200 -r 10 -t 10m \
  --host https://staging.example.com \
  --csv results --html report.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;-u&lt;/code&gt; define os usuários, &lt;code&gt;-r&lt;/code&gt; quantos começam por segundo e &lt;code&gt;-t&lt;/code&gt; a duração, já contando a rampa de subida. As mesmas opções também funcionam em &lt;code&gt;locust.conf&lt;/code&gt; ou &lt;code&gt;pyproject.toml&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Como funciona o modo distribuído?&lt;/h2&gt;
&lt;p&gt;Um processo master cuida da interface web e coordena, enquanto processos worker executam os usuários e devolvem as estatísticas. Você precisa de um worker por núcleo de CPU, porque um processo Python não consegue aproveitar totalmente mais de um núcleo.&lt;/p&gt;
&lt;p&gt;Segundo a &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;documentação de carga distribuída&lt;/a&gt;, um único processo passa de mil requisições por segundo com um plano de teste simples, então testes maiores são distribuídos:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# na máquina master
locust -f locustfile.py --master
# em cada máquina worker, um worker por núcleo
locust -f - --worker --master-host 10.0.0.5 --processes -1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;-f -&lt;/code&gt; busca o locustfile no master. O &lt;code&gt;--processes&lt;/code&gt; depende de &lt;code&gt;fork()&lt;/code&gt; e por isso não funciona no Windows, e toda mudança no locustfile exige reiniciar todos os processos. A documentação também cobre um &lt;a href=&quot;https://docs.locust.io/en/stable/kubernetes-operator.html&quot;&gt;operador para Kubernetes&lt;/a&gt; e o &lt;a href=&quot;https://docs.locust.io/en/stable/hosted-load-testing.html&quot;&gt;Azure Load Testing&lt;/a&gt; (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;A LoadFocus, que publica este site, não roda testes do Locust. Ela &lt;a href=&quot;https://loadfocus.com/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=locust-load-testing&quot;&gt;roda planos de teste JMeter e scripts k6&lt;/a&gt; a partir de 25 regiões na nuvem, então para o Locust os caminhos acima continuam sendo as formas de escalar.&lt;/p&gt;
&lt;h2&gt;O Locust consegue testar protocolos além de HTTP?&lt;/h2&gt;
&lt;p&gt;Sim, desde que você traga um cliente Python para o protocolo. Só HTTP e HTTPS vêm embutidos.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;página sobre outros protocolos&lt;/a&gt; mostra como encapsular um cliente para que cada chamada seja registrada, com exemplos para XML-RPC e gRPC e classes de usuário experimentais para MQTT, Socket.IO e OpenAI. O projeto separado &lt;a href=&quot;https://github.com/SvenskaSpel/locust-plugins&quot;&gt;locust-plugins&lt;/a&gt; adiciona usuários para Kafka, FTP, Selenium e Playwright (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;Para HTTP existe ainda o &lt;a href=&quot;https://docs.locust.io/en/stable/increase-performance.html&quot;&gt;&lt;code&gt;FastHttpUser&lt;/code&gt;&lt;/a&gt;, que usa o geventhttpclient e consome bem menos CPU. No melhor caso, segundo a documentação, um processo chega a cerca de 16.000 requisições por segundo, contra 4.000 com o &lt;code&gt;HttpUser&lt;/code&gt;. O &lt;code&gt;FastHttpUser&lt;/code&gt; não deixa cada requisição mais rápida e, por padrão, não verifica certificados TLS.&lt;/p&gt;
&lt;h2&gt;Que relatórios o Locust entrega, e como ele entra na CI?&lt;/h2&gt;
&lt;p&gt;Você recebe gráficos ao vivo na interface web e, se pedir, arquivos de resultados. Na CI, o Locust sai com código 1 se alguma requisição falhou.&lt;/p&gt;
&lt;p&gt;Pela &lt;a href=&quot;https://docs.locust.io/en/stable/configuration.html&quot;&gt;referência de configuração&lt;/a&gt;, &lt;code&gt;--csv&lt;/code&gt; grava arquivos de estatísticas, histórico e falhas, &lt;code&gt;--html&lt;/code&gt; salva um relatório e &lt;code&gt;--json&lt;/code&gt; imprime as estatísticas finais. O &lt;code&gt;--otel&lt;/code&gt; exporta para um backend &lt;a href=&quot;https://docs.locust.io/en/stable/telemetry.html&quot;&gt;OpenTelemetry&lt;/a&gt;. A documentação do modo headless mostra um listener que reprova a execução pela taxa de falhas, pelo tempo de resposta médio ou pelo percentil 95, e nosso guia de &lt;a href=&quot;https://loadtest.app/pt-br/load-testing-in-github-actions/&quot;&gt;teste de carga no GitHub Actions&lt;/a&gt; o coloca em um workflow.&lt;/p&gt;
&lt;h2&gt;O que o Locust faz bem, e onde estão seus limites?&lt;/h2&gt;
&lt;p&gt;Ele se destaca na lógica dos testes e com muitos usuários simultâneos que passam a maior parte do tempo esperando. Fica mais fraco na taxa de requisições por processo e nos protocolos que você precisa conectar por conta própria.&lt;/p&gt;
&lt;p&gt;Como os testes são Python puro, laços, condições, dados gerados e o seu próprio cliente de API funcionam normalmente, e os testes ficam no controle de versão. A página &lt;a href=&quot;https://docs.locust.io/en/stable/what-is-locust.html&quot;&gt;What is Locust&lt;/a&gt; diz que o baixo custo de cada usuário combina com cargas muito concorrentes, mas admite que outras ferramentas podem enviar mais requisições por segundo no mesmo hardware.&lt;/p&gt;
&lt;p&gt;Os limites que a própria documentação reconhece:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um processo Python usa um único núcleo de CPU.&lt;/li&gt;
&lt;li&gt;Bibliotecas que fazem E/S em C bloqueiam o processo, a menos que o gevent consiga aplicar patch nelas.&lt;/li&gt;
&lt;li&gt;O &lt;code&gt;HttpUser&lt;/code&gt; não interpreta HTML nem carrega os recursos da página.&lt;/li&gt;
&lt;li&gt;O tempo de espera não consegue adicionar usuários para manter uma taxa de requisições.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Que outras ferramentas Python existem para teste de carga?&lt;/h2&gt;
&lt;p&gt;O Locust é o motor Python em desenvolvimento ativo. O Molotov, a principal alternativa, não lança nenhuma versão no PyPI desde 2022, e o Taurus roda o Locust por um de seus executores.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/tarekziade/molotov&quot;&gt;Molotov&lt;/a&gt; é uma ferramenta para Python 3.8+ construída sobre asyncio e aiohttp; a &lt;a href=&quot;https://pypi.org/project/molotov/&quot;&gt;versão mais recente no PyPI&lt;/a&gt; é a 2.6, de 21 de outubro de 2022, e o último commit do branch principal é de novembro de 2023 (conferido em 21 de outubro de 2026). O &lt;a href=&quot;https://gettaurus.org/docs/Locust/&quot;&gt;Taurus&lt;/a&gt; roda um locustfile, ou requisições GET e POST simples escritas em YAML, pelo executor &lt;code&gt;locust&lt;/code&gt;. Você instala o Locust por conta própria, em modo distribuído o Taurus inicia só o master e a configuração &lt;code&gt;throughput&lt;/code&gt; não tem efeito nesse executor (conferido em 21 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Quando escolher k6, JMeter ou Gatling em vez do Locust?&lt;/h2&gt;
&lt;p&gt;Escolha outra ferramenta quando a linguagem, os protocolos ou o modelo de carga dela combinarem melhor com a sua equipe.&lt;/p&gt;
&lt;p&gt;Nosso panorama de &lt;a href=&quot;https://loadtest.app/pt-br/open-source-load-testing-tools/&quot;&gt;ferramentas de teste de carga open source&lt;/a&gt; coloca o Locust ao lado de outras cinco.&lt;/p&gt;
&lt;p&gt;Prefira o &lt;strong&gt;k6&lt;/strong&gt; quando sua equipe escreve JavaScript, quer critérios de aprovação como &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; no próprio script ou precisa de um modelo de carga aberto, que é o que os &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/open-vs-closed/&quot;&gt;executores arrival-rate&lt;/a&gt; do k6 oferecem (conferido em 9 de outubro de 2026). A LoadFocus &lt;a href=&quot;https://loadfocus.com/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=locust-load-testing&quot;&gt;roda scripts k6&lt;/a&gt; a partir de 25 regiões na nuvem, mas executa cenários arrival-rate com um número fixo de usuários; para manter uma taxa de requisições, rode-os com o próprio k6.&lt;/p&gt;
&lt;p&gt;Prefira o &lt;strong&gt;JMeter&lt;/strong&gt; quando você precisa de JDBC, JMS, LDAP ou FTP prontos para uso, como lista o &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;README&lt;/a&gt; dele, ou quando seus testadores montam os testes em uma interface gráfica. &lt;a href=&quot;https://loadtest.app/pt-br/locust-vs-jmeter/&quot;&gt;Locust vs JMeter&lt;/a&gt; compara os dois em detalhe.&lt;/p&gt;
&lt;p&gt;Prefira o &lt;strong&gt;Gatling&lt;/strong&gt; quando sua equipe trabalha na JVM e quer &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;perfis de injeção&lt;/a&gt; abertos e fechados em uma mesma API (conferido em 9 de outubro de 2026). &lt;a href=&quot;https://loadtest.app/pt-br/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter&lt;/a&gt; trata disso com mais detalhe.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;O Locust é gratuito para uso comercial?&lt;/strong&gt;
Sim. O Locust é distribuído sob a licença MIT, que permite uso comercial, modificação e redistribuição.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qual versão do Python o Locust exige?&lt;/strong&gt;
Python 3.11 ou mais recente, segundo os metadados no PyPI. Instale com &lt;code&gt;pip install locust&lt;/code&gt;, ou rode em um ambiente temporário com &lt;code&gt;uvx locust&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A LoadFocus consegue rodar testes do Locust?&lt;/strong&gt;
Não. A LoadFocus roda planos de teste JMeter e scripts k6. Para escalar um teste do Locust, use o modo master e workers, o operador para Kubernetes ou o Azure Load Testing.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/locust-vs-jmeter/&quot;&gt;Locust vs JMeter: scripts Python ou planos do JMeter?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-source-load-testing-tools/&quot;&gt;Ferramentas de teste de carga open source: seis opções&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/k6-vs-locust/&quot;&gt;k6 vs Locust: scripts JavaScript ou usuários Python?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-vs-locust/&quot;&gt;Gatling vs Locust: simulações na JVM ou locustfiles Python?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Locust vs JMeter: scripts Python ou planos do JMeter?</title><link>https://loadtest.app/pt-br/locust-vs-jmeter/</link><guid isPermaLink="true">https://loadtest.app/pt-br/locust-vs-jmeter/</guid><description>Locust e JMeter comparados em licença, scripts, protocolos, execução distribuída, CI e relatórios, com dicas claras de quando escolher cada ferramenta.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, que vende um serviço de teste de carga abordado neste artigo.&lt;/p&gt;&lt;p&gt;Locust e Apache JMeter são ferramentas de teste de carga gratuitas e open source, e a melhor escolha depende principalmente de como o seu time quer construir os testes. Escolha o Locust se o seu time escreve Python e quer a lógica do teste como código comum, executada por usuários leves e baseados em eventos. Escolha o JMeter se você precisa de protocolos além de HTTP, como JDBC, JMS ou LDAP, prefere montar os testes em uma interface gráfica ou já tem uma coleção de planos de teste &lt;code&gt;.jmx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Os dados desta comparação Locust vs JMeter vêm da documentação e do repositório de cada projeto, conferidos em 9 de outubro de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Locust&lt;/th&gt;
&lt;th&gt;Apache JMeter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licença&lt;/td&gt;
&lt;td&gt;MIT (&lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;repositório&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;Apache 2.0 (&lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;repositório&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ambiente de execução&lt;/td&gt;
&lt;td&gt;Python 3.11 ou mais recente&lt;/td&gt;
&lt;td&gt;Java 8 ou mais recente (versão 5.6.3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testes escritos como&lt;/td&gt;
&lt;td&gt;Código Python em um locustfile&lt;/td&gt;
&lt;td&gt;Planos de teste montados em uma interface gráfica e salvos como XML (&lt;code&gt;.jmx&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interface gráfica&lt;/td&gt;
&lt;td&gt;Interface web para iniciar, ajustar e acompanhar um teste em andamento&lt;/td&gt;
&lt;td&gt;IDE desktop para gravar, montar e depurar planos de teste&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocolos embutidos&lt;/td&gt;
&lt;td&gt;HTTP e HTTPS; os demais por meio de um cliente Python&lt;/td&gt;
&lt;td&gt;HTTP(S), SOAP/REST, FTP, JDBC, LDAP, JMS, e-mail, TCP, comandos de shell, objetos Java&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usuários virtuais&lt;/td&gt;
&lt;td&gt;Um greenlet por usuário sobre o gevent (baseado em eventos)&lt;/td&gt;
&lt;td&gt;Uma thread Java por usuário&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modo distribuído&lt;/td&gt;
&lt;td&gt;Um master e quantos workers você quiser&lt;/td&gt;
&lt;td&gt;Um cliente que controla servidores JMeter remotos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI e execução sem interface&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--headless&lt;/code&gt;, código de saída 1 quando requisições falham&lt;/td&gt;
&lt;td&gt;Modo CLI (&lt;code&gt;jmeter -n&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relatórios&lt;/td&gt;
&lt;td&gt;Gráficos ao vivo na interface web, arquivos CSV, relatório HTML&lt;/td&gt;
&lt;td&gt;Dashboard HTML, resultados ao vivo com um Backend Listener&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qual é a diferença entre Locust e JMeter?&lt;/h2&gt;
&lt;p&gt;No Locust, um teste é um programa Python. No JMeter, um teste é um plano que você monta em uma interface gráfica desktop e salva em um arquivo, e quase todas as outras diferenças vêm daí.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;README&lt;/a&gt; do Locust descreve testes escritos com laços, condições e bibliotecas comuns de Python. Ele é instalado com &lt;code&gt;pip install locust&lt;/code&gt; e precisa do Python 3.11 ou mais recente, segundo os &lt;a href=&quot;https://github.com/locustio/locust/blob/master/pyproject.toml&quot;&gt;metadados do pacote&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Um teste do JMeter é uma árvore de elementos: um Thread Group para os usuários, samplers para as requisições e assertions e listeners para os resultados. O JMeter 5.6.3, versão atual na &lt;a href=&quot;https://jmeter.apache.org/download_jmeter.cgi&quot;&gt;página de download&lt;/a&gt;, exige Java 8 ou mais recente. O README do &lt;a href=&quot;https://github.com/apache/jmeter/blob/master/README.md&quot;&gt;branch de desenvolvimento&lt;/a&gt; do JMeter já exige Java 17 (conferido em 10 de outubro de 2026). Quando um passo precisa de lógica de verdade, um sampler JSR223 roda um script Groovy dentro do plano.&lt;/p&gt;
&lt;h2&gt;Como se escreve um teste em cada ferramenta?&lt;/h2&gt;
&lt;p&gt;No Locust, você escreve uma classe Python para cada tipo de usuário, com métodos marcados como tarefas. No JMeter, você adiciona um Thread Group e samplers na interface gráfica, salva o plano e roda esse arquivo pela linha de comando.&lt;/p&gt;
&lt;p&gt;Um usuário do Locust que espera de um a três segundos entre as tarefas e consulta a lista de usuários três vezes mais do que abre um usuário específico:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from locust import HttpUser, task, between


class ApiUser(HttpUser):
    wait_time = between(1, 3)

    @task(3)
    def list_users(self):
        self.client.get(&amp;quot;/api/users&amp;quot;)

    @task
    def view_user(self):
        self.client.get(&amp;quot;/api/users/42&amp;quot;, name=&amp;quot;/api/users/[id]&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Para rodar sem interface com 50 usuários, cinco novos por segundo, durante cinco minutos:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;locust -f locustfile.py --headless -u 50 -r 5 \
  --run-time 5m --host https://staging.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No JMeter, o mesmo teste é um Thread Group com 50 threads e um período de rampa de subida, contendo dois samplers HTTP Request. O &lt;a href=&quot;https://jmeter.apache.org/usermanual/get-started.html&quot;&gt;guia de primeiros passos&lt;/a&gt; roda um plano salvo no modo CLI, e &lt;code&gt;-e -o&lt;/code&gt; acrescenta o relatório HTML no final:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;jmeter -n -t api-users.jmx -l results.jtl -e -o report/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O arquivo &lt;code&gt;.jmx&lt;/code&gt; é XML, como mostram os &lt;a href=&quot;https://raw.githubusercontent.com/apache/jmeter/master/bin/examples/CSVSample.jmx&quot;&gt;exemplos que vêm com o JMeter&lt;/a&gt;, e é mais difícil de revisar em um pull request do que um arquivo Python. O JMeter também grava um plano a partir do navegador; o equivalente no Locust é o &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;har2locust&lt;/a&gt;, um conversor de gravações HAR em locustfile que ainda está em beta (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;Quais protocolos cada ferramenta consegue testar?&lt;/h2&gt;
&lt;p&gt;O JMeter cobre muito mais protocolos de fábrica. O Locust vem com HTTP e HTTPS e espera que você traga um cliente Python para todo o resto.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;README&lt;/a&gt; do JMeter lista HTTP e HTTPS, SOAP e REST, FTP, bancos de dados via JDBC, LDAP, mensageria JMS, e-mail por SMTP, POP3 e IMAP, TCP, comandos nativos e objetos Java. JDBC e JMS precisam dos JARs de driver fornecidos pelo seu fornecedor de banco de dados ou de JMS.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;página sobre outros protocolos&lt;/a&gt; da documentação do Locust mostra como encapsular uma biblioteca de protocolo, com exemplos para gRPC, XML-RPC e MQTT, e indica o locust-plugins para Kafka, Selenium e Playwright (conferido em 9 de outubro de 2026). A biblioteca precisa funcionar com o gevent, porque E/S feita em código C compilado bloqueia o processo inteiro; a documentação cita o driver de PostgreSQL psycopg2, que precisa de um pacote extra. Para testes de carga em bancos de dados, o sampler JDBC do JMeter é o caminho mais curto.&lt;/p&gt;
&lt;h2&gt;Como funcionam os usuários virtuais no Locust e no JMeter?&lt;/h2&gt;
&lt;p&gt;O JMeter executa cada usuário virtual como uma thread Java. O Locust executa cada usuário como um greenlet no loop de eventos do gevent, o que mantém baixo o custo de cada usuário.&lt;/p&gt;
&lt;p&gt;Cada thread de um &lt;a href=&quot;https://jmeter.apache.org/usermanual/test_plan.html&quot;&gt;Thread Group&lt;/a&gt; do JMeter percorre o plano inteiro de forma independente. O JMeter inicia por padrão com um heap de 1 GB, que segundo o guia pode não bastar para planos maiores e muitas threads.&lt;/p&gt;
&lt;p&gt;Segundo o README, um único processo do Locust consegue lidar com muitos milhares de usuários simultâneos. A &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;documentação de carga distribuída&lt;/a&gt; acrescenta que um processo Python não aproveita totalmente mais de um núcleo de CPU, então você roda um worker por núcleo, algo que o &lt;code&gt;--processes&lt;/code&gt; configura para você em uma única máquina.&lt;/p&gt;
&lt;h2&gt;Como distribuir um teste entre várias máquinas?&lt;/h2&gt;
&lt;p&gt;As duas têm um modo distribuído embutido. No Locust, um master comanda os workers que executam os usuários, e no JMeter o cliente inicia o plano de teste completo em cada servidor remoto.&lt;/p&gt;
&lt;p&gt;No Locust, um processo iniciado com &lt;code&gt;--master&lt;/code&gt; roda a interface web e avisa os processos &lt;code&gt;--worker&lt;/code&gt; quando iniciar e parar usuários. A documentação do Locust também cobre um &lt;a href=&quot;https://docs.locust.io/en/stable/kubernetes-operator.html&quot;&gt;operador para Kubernetes&lt;/a&gt; e o &lt;a href=&quot;https://docs.locust.io/en/stable/hosted-load-testing.html&quot;&gt;Azure Load Testing&lt;/a&gt;, um serviço da Microsoft que executa testes do Locust na nuvem (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://jmeter.apache.org/usermanual/remote-test.html&quot;&gt;modo de teste remoto&lt;/a&gt; do JMeter permite que um cliente controle quantos servidores você quiser via RMI. Cada servidor roda o plano inteiro, então 1.000 threads em seis servidores viram 6.000 threads. Todos os nós devem rodar a mesma versão do JMeter e do Java, o RMI precisa de um keystore a menos que o SSL esteja desativado, e arquivos de dados precisam ser copiados para cada servidor.&lt;/p&gt;
&lt;p&gt;Existe um terceiro caminho para planos de teste do JMeter. A LoadFocus, que publica este site, &lt;a href=&quot;https://loadfocus.com/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=locust-vs-jmeter&quot;&gt;roda planos de teste JMeter existentes&lt;/a&gt; sem alterações a partir de 25 regiões na nuvem, sem servidores remotos para configurar. A LoadFocus não roda testes do Locust, então para o Locust as opções acima continuam sendo as formas de escalar.&lt;/p&gt;
&lt;h2&gt;Como eles entram na CI e quais relatórios você recebe?&lt;/h2&gt;
&lt;p&gt;Os dois rodam sem interface pela linha de comando. O Locust ainda termina com código de saída 1 quando requisições falham, e o JMeter gera o relatório HTML mais completo.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;documentação do modo headless&lt;/a&gt; do Locust mostra um listener de eventos curto que define o código de saída pela taxa de falhas, pelo tempo de resposta médio ou pelo percentil 95, além de um exemplo para GitHub Actions. As opções &lt;code&gt;--csv&lt;/code&gt; e &lt;code&gt;--html&lt;/code&gt; salvam os resultados e um relatório ao final da execução.&lt;/p&gt;
&lt;p&gt;A documentação do JMeter é categórica: testes de carga rodam no modo CLI, e a interface gráfica fica para montar e depurar. O README indica bibliotecas de terceiros para Maven, Gradle e Jenkins. O &lt;a href=&quot;https://jmeter.apache.org/usermanual/generating-dashboard.html&quot;&gt;dashboard do JMeter&lt;/a&gt; traz uma tabela APDEX, uma tabela de estatísticas com três percentis configuráveis, resumos de erros e gráficos do tempo de resposta.&lt;/p&gt;
&lt;h2&gt;Qual você deve escolher?&lt;/h2&gt;
&lt;p&gt;Escolha o Locust se o seu time escreve Python e quer revisar os testes de carga como o resto do código. Escolha o JMeter em vez dele se você precisa de protocolos além de HTTP, se os seus testers preferem uma interface gráfica ou se você já tem planos &lt;code&gt;.jmx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;O Locust combina com cenários que têm laços, ramificações e dados gerados, com testes que reaproveitam um cliente Python interno da sua API e com alta concorrência de usuários que passam a maior parte do tempo esperando.&lt;/p&gt;
&lt;p&gt;O JMeter é a melhor escolha para testar JDBC, JMS, LDAP, FTP ou e-mail, onde o Locust exigiria um cliente mantido por você, e para testers que gravam um fluxo no navegador e o refinam visualmente. Uma empresa que já usa o JMeter também preserva seus planos e seu conhecimento.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;O Locust é mais rápido que o JMeter?&lt;/strong&gt;
Não medimos isso nós mesmos, então não vamos apontar um vencedor. A comparação justa é rodar o mesmo cenário com as duas ferramentas no seu próprio hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O Locust consegue rodar arquivos .jmx do JMeter?&lt;/strong&gt;
Não, segundo a documentação, que descreve os testes apenas como locustfiles em Python. Levar um plano de teste do JMeter para o Locust significa reescrevê-lo em Python.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A LoadFocus consegue rodar testes do Locust?&lt;/strong&gt;
Não. A LoadFocus roda scripts JMeter e k6. Para escalar um teste do Locust além de uma máquina, use o modo master e workers do Locust, o operador para Kubernetes ou o Azure Load Testing.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/locust-load-testing/&quot;&gt;Teste de carga com Locust: análise da ferramenta Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter: testes como código ou plano na GUI?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/k6-vs-artillery/&quot;&gt;k6 vs Artillery: qual ferramenta de teste de carga escolher&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/k6-vs-locust/&quot;&gt;k6 vs Locust: scripts JavaScript ou usuários Python?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-vs-locust/&quot;&gt;Gatling vs Locust: simulações na JVM ou locustfiles Python?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/jmeter-vs-postman/&quot;&gt;JMeter vs Postman: qual ferramenta para teste de carga?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Modelo de carga aberto vs fechado: qual usar e quando</title><link>https://loadtest.app/pt-br/open-vs-closed-workload-model/</link><guid isPermaLink="true">https://loadtest.app/pt-br/open-vs-closed-workload-model/</guid><description>Modelo de carga aberto vs fechado: taxa de chegada ou usuários fixos, por que o fechado esconde a saturação e o que fazem k6, Gatling, Locust e JMeter.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;Escolher um modelo de carga aberto vs fechado depende principalmente de como os usuários chegam ao seu sistema. Use um modelo aberto, que inicia novas iterações a uma taxa de chegada definida, para sites e APIs públicos em que os usuários continuam chegando por mais lento que você responda, e um modelo fechado, um número fixo de usuários virtuais que esperam cada um o fim da iteração anterior, só onde o próprio sistema limita a concorrência. A escolha pesa mais na saturação, quando um teste fechado freia a própria carga e faz o sistema parecer mais saudável do que está.&lt;/p&gt;
&lt;p&gt;Os fatos sobre as ferramentas vêm da documentação de cada projeto, conferida em 9 de outubro de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Modelo aberto&lt;/th&gt;
&lt;th&gt;Modelo fechado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;O que você define&lt;/td&gt;
&lt;td&gt;Novas iterações ou usuários por segundo&lt;/td&gt;
&lt;td&gt;Usuários virtuais simultâneos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quando as respostas ficam lentas&lt;/td&gt;
&lt;td&gt;O trabalho continua chegando e as filas crescem&lt;/td&gt;
&lt;td&gt;Os usuários esperam e menos carga é enviada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sistemas reais assim&lt;/td&gt;
&lt;td&gt;A maioria dos sites e APIs públicos&lt;/td&gt;
&lt;td&gt;Call centers, filas de venda de ingressos, pools de workers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;constant-arrival-rate&lt;/code&gt;, &lt;code&gt;ramping-arrival-rate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;constant-vus&lt;/code&gt;, &lt;code&gt;ramping-vus&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;&lt;code&gt;injectOpen&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;injectClosed&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;Aproximado com &lt;code&gt;constant_throughput&lt;/code&gt; ou &lt;code&gt;poisson&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Usuários com um &lt;code&gt;wait_time&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;Open Model Thread Group, plugin Arrivals&lt;/td&gt;
&lt;td&gt;Thread Group&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qual é a diferença entre um modelo de carga aberto e um fechado?&lt;/h2&gt;
&lt;p&gt;No modelo aberto, quem decide quando o trabalho chega é o gerador de carga, e no fechado é o tempo de resposta do sistema.&lt;/p&gt;
&lt;p&gt;A documentação do k6 diz isso com clareza: no &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/open-vs-closed/&quot;&gt;modelo fechado&lt;/a&gt;, a próxima iteração de um usuário virtual só começa quando a anterior termina, enquanto no modelo aberto as novas iterações chegam sem depender do fim das anteriores (conferido em 9 de outubro de 2026). Um teste fechado com 50 &lt;a href=&quot;https://loadfocus.com/docs/guides/load-testing/what-are-virtual-users-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=open-vs-closed-workload-model&quot;&gt;usuários virtuais&lt;/a&gt; nunca tem mais de 50 iterações em andamento. Um teste aberto a 50 iterações por segundo dispara mais 50 a cada segundo, e se cada uma demora mais, mais delas se sobrepõem.&lt;/p&gt;
&lt;h2&gt;Por que um modelo fechado esconde a latência quando o sistema satura?&lt;/h2&gt;
&lt;p&gt;Porque o teste fica lento junto com o sistema. Quando as respostas demoram mais, cada usuário de um modelo fechado envia menos requisições, e a carga cai bem na hora em que você queria vê-la subir.&lt;/p&gt;
&lt;p&gt;A documentação do k6 descreve o efeito: respostas mais lentas significam iterações mais longas e uma taxa de chegada menor de iterações novas. A &lt;a href=&quot;https://docs.gatling.io/testing-concepts/workload-models/&quot;&gt;página do Gatling sobre modelos de carga&lt;/a&gt; vai além e diz que usar um modelo fechado contra um sistema que na verdade é aberto é um teste quebrado, que mede um comportamento imaginário (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;Por isso um teste fechado mostra tempos de resposta que se estabilizam, já que nunca pode haver mais requisições em andamento do que usuários. Um teste aberto mostra a fila crescendo, com tempos de resposta que sobem enquanto as chegadas superam o que o sistema processa. Essa segunda imagem é a que seus usuários veriam, e os &lt;a href=&quot;https://loadfocus.com/docs/guides/load-testing/response-time-distribution?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=open-vs-closed-workload-model&quot;&gt;tempos de resposta p95 e p99&lt;/a&gt; que você lê no fim só são tão confiáveis quanto o modelo de carga que os produziu.&lt;/p&gt;
&lt;p&gt;A documentação do k6 observa que parte da literatura sobre testes chama esse problema de &lt;a href=&quot;https://loadtest.app/pt-br/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt;. Um artigo da USENIX de 2006 citado pela documentação do Gatling, &lt;a href=&quot;https://www.usenix.org/legacy/event/nsdi06/tech/full_papers/schroeder/schroeder.pdf&quot;&gt;Open Versus Closed: A Cautionary Tale&lt;/a&gt;, concluiu que os dois modelos dão resultados bem diferentes mesmo com a mesma carga e as mesmas demandas de serviço.&lt;/p&gt;
&lt;h2&gt;Qual modelo combina com o seu tráfego real?&lt;/h2&gt;
&lt;p&gt;Escolha um modelo aberto para tudo que o público consegue acessar, e um fechado só onde o próprio sistema limita quantos usuários ficam ativos ao mesmo tempo.&lt;/p&gt;
&lt;p&gt;A documentação do Gatling cita como sistemas fechados os call centers com todos os atendentes ocupados e os sites de venda de ingressos que colocam os usuários em fila quando lotam, e diz que a maioria dos sites se comporta como sistema aberto. Um job em lote com um número fixo de workers, ou um consumidor de fila com concorrência definida, também é fechado. APIs públicas, páginas web e webhooks são abertos: nada segura a próxima requisição porque a anterior foi lenta.&lt;/p&gt;
&lt;p&gt;Muitos sistemas ficam no meio do caminho: uma compradora chega no próprio ritmo e depois espera cada página durante a visita. O artigo citado chama isso de modelo parcialmente aberto. No k6 ou no Gatling, defina a taxa de chegada das sessões e faça de cada iteração uma jornada de usuário completa, com as próprias pausas.&lt;/p&gt;
&lt;h2&gt;Como configurar cada modelo no k6?&lt;/h2&gt;
&lt;p&gt;Pelo executor. &lt;code&gt;constant-vus&lt;/code&gt; e &lt;code&gt;ramping-vus&lt;/code&gt; dão um modelo fechado, e &lt;code&gt;constant-arrival-rate&lt;/code&gt; e &lt;code&gt;ramping-arrival-rate&lt;/code&gt; dão um aberto.&lt;/p&gt;
&lt;p&gt;Um cenário fechado define &lt;code&gt;executor: &amp;quot;constant-vus&amp;quot;&lt;/code&gt; com um número de &lt;code&gt;vus&lt;/code&gt; e uma &lt;code&gt;duration&lt;/code&gt;. Um cenário aberto define uma taxa, e você pré-aloca usuários virtuais suficientes para sustentá-la:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;export const options = {
  scenarios: {
    open_model: {
      executor: &amp;quot;constant-arrival-rate&amp;quot;,
      rate: 50,
      timeUnit: &amp;quot;1s&amp;quot;,
      duration: &amp;quot;5m&amp;quot;,
      preAllocatedVUs: 100,
    },
  },
  thresholds: {
    dropped_iterations: [&amp;quot;count&amp;lt;10&amp;quot;],
  },
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O k6 &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/arrival-rate-vu-allocation/&quot;&gt;só inicia uma iteração enquanto tem um usuário virtual livre&lt;/a&gt;, e a documentação desaconselha depender de &lt;code&gt;maxVUs&lt;/code&gt;, porque adicionar usuários no meio do teste pode sobrecarregar o gerador de carga. Quando nenhum usuário está livre, o k6 registra uma &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/dropped-iterations/&quot;&gt;iteração descartada&lt;/a&gt;, o que, já perto do fim de um teste, costuma indicar que o sistema está ficando lento. O limite acima faz a execução falhar ao chegar a dez. Não coloque &lt;code&gt;sleep()&lt;/code&gt; no fim de uma iteração com taxa de chegada, porque o executor já cadencia os inícios (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;Se você roda scripts k6 na LoadFocus, a &lt;a href=&quot;https://loadfocus.com/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=open-vs-closed-workload-model&quot;&gt;execução de k6 na nuvem&lt;/a&gt; da plataforma usa a carga definida nas configurações do teste, e o validador de scripts avisa que cenários com taxa de chegada rodam ali com um número fixo de usuários, então a taxa de requisições não é mantida. Para um teste de verdade com modelo aberto, rode os executors de taxa de chegada com o próprio k6, ou em um serviço que os execute do jeito que foram escritos.&lt;/p&gt;
&lt;h2&gt;Como Gatling, Locust e JMeter expressam cada modelo?&lt;/h2&gt;
&lt;p&gt;O Gatling separa os dois modelos na API, o JMeter oferece os dois por meio de thread groups diferentes, e o Locust é construído em torno de um número fixo de usuários.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gatling.&lt;/strong&gt; Um cenário usa &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;&lt;code&gt;injectOpen&lt;/code&gt; ou &lt;code&gt;injectClosed&lt;/code&gt;&lt;/a&gt;. Passos abertos como &lt;code&gt;constantUsersPerSec&lt;/code&gt; e &lt;code&gt;rampUsersPerSec&lt;/code&gt; definem taxas de chegada, e passos fechados como &lt;code&gt;constantConcurrentUsers&lt;/code&gt; e &lt;code&gt;rampConcurrentUsers&lt;/code&gt; definem a concorrência. &lt;a href=&quot;https://docs.gatling.io/testing-concepts/workload-models/&quot;&gt;Um mesmo perfil de injeção não pode misturar os dois&lt;/a&gt; (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Locust.&lt;/strong&gt; Você define um número de usuários, e o &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;&lt;code&gt;wait_time&lt;/code&gt;&lt;/a&gt; de cada usuário controla a pausa entre tarefas. &lt;code&gt;constant_throughput&lt;/code&gt; e &lt;code&gt;constant_pacing&lt;/code&gt; ajustam essa pausa para que cada usuário rode no máximo um número definido de tarefas por segundo, mas a documentação diz que o tempo de espera só consegue limitar a vazão e não inicia novos usuários para atingir uma meta. &lt;code&gt;poisson()&lt;/code&gt; sorteia pausas aleatórias, que a documentação considera mais próximas das chegadas reais. O exemplo da documentação para 500 iterações de tarefa por segundo é &lt;code&gt;constant_throughput(0.1)&lt;/code&gt; com 5.000 usuários, um pool fechado com bastante folga (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JMeter.&lt;/strong&gt; O &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Thread_Group&quot;&gt;Thread Group&lt;/a&gt; clássico é um pool fechado de threads. Os timers Constant Throughput e Precise Throughput cadenciam esse pool rumo a uma taxa alvo, e a referência avisa que a vazão cai se o servidor não der conta ou se faltarem threads. Para chegadas, o JMeter 5.5 adicionou o &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Open_Model_Thread_Group&quot;&gt;Open Model Thread Group&lt;/a&gt;, ainda marcado como experimental, com agendas como &lt;code&gt;rate(10/sec) random_arrivals(1 min)&lt;/code&gt;. O plugin da comunidade &lt;a href=&quot;https://jmeter-plugins.org/wiki/ArrivalsThreadGroup/&quot;&gt;Arrivals Thread Group&lt;/a&gt; inicia novas threads quando todas as existentes estão ocupadas, com um limite de concorrência como válvula de segurança (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;h2&gt;O que observar em um teste com modelo aberto?&lt;/h2&gt;
&lt;p&gt;Observe o gerador de carga tão de perto quanto o sistema sob teste. No modelo aberto, um sistema lento significa mais usuários simultâneos do seu lado, e isso custa memória e CPU.&lt;/p&gt;
&lt;p&gt;Defina um teto, como &lt;code&gt;maxVUs&lt;/code&gt; no k6 ou o limite de concorrência do plugin do JMeter, e trate atingi-lo como um resultado: o sistema não conseguiu absorver a taxa que você pediu.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Um modelo de carga fechado é a escolha certa em algum caso?&lt;/strong&gt;
Sim. Use-o quando o sistema real limita a concorrência, como um pool fixo de workers, um consumidor de fila ou um call center, ou quando você quer saber quantas sessões simultâneas um componente aguenta. Para tráfego web público, um modelo aberto se encaixa melhor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adicionar tempo de pensamento transforma um modelo fechado em aberto?&lt;/strong&gt;
Não. O tempo de pensamento reduz a frequência com que cada usuário envia requisições, mas cada usuário continua esperando a resposta anterior, então um sistema lento ainda freia o teste. Só uma taxa de chegada definida independentemente dos tempos de resposta gera um modelo aberto.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quantos usuários virtuais um teste com taxa de chegada precisa?&lt;/strong&gt;
O suficiente para cobrir todas as iterações em andamento ao mesmo tempo. A documentação do k6 sugere a mediana da duração de uma iteração multiplicada pela taxa alvo, mais uma margem para a variação, ajustada com testes curtos antes do teste completo.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/coordinated-omission/&quot;&gt;Coordinated omission: o que é e como evitar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/littles-law-load-testing/&quot;&gt;Lei de Little em teste de carga: dimensionar e conferir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/think-time-in-load-testing/&quot;&gt;Tempo de pensamento em teste de carga: como definir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/throughput-vs-latency/&quot;&gt;Vazão vs latência: como se relacionam sob carga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/amdahls-law/&quot;&gt;Lei de Amdahl: fórmula, exemplos e limites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/queueing-theory/&quot;&gt;Teoria das filas: o que é e por que a latência dispara&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Tempo de pensamento em teste de carga: como definir</title><link>https://loadtest.app/pt-br/think-time-in-load-testing/</link><guid isPermaLink="true">https://loadtest.app/pt-br/think-time-in-load-testing/</guid><description>Tempo de pensamento em teste de carga: por que as pausas mudam a carga, como ele difere do pacing e como defini-lo no k6, no JMeter e no Locust.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;Tempo de pensamento em teste de carga é a pausa que um usuário virtual faz entre duas ações, representando os segundos que uma pessoa real passa lendo uma página ou preenchendo um formulário. Ele decide quanta pressão cada usuário virtual exerce: quanto mais longa a pausa, menos requisições por segundo o mesmo número de usuários envia. Meça o valor com dados de usuários reais, varie-o aleatoriamente em torno desse valor e escreva-o no script com o comando de pausa da sua ferramenta.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tempo de pensamento por volta&lt;/th&gt;
&lt;th&gt;Uma volta leva&lt;/th&gt;
&lt;th&gt;Requisições por segundo com 100 usuários&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;0 s&lt;/td&gt;
&lt;td&gt;0,5 s&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 s&lt;/td&gt;
&lt;td&gt;1,5 s&lt;/td&gt;
&lt;td&gt;cerca de 67&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 s&lt;/td&gt;
&lt;td&gt;3,5 s&lt;/td&gt;
&lt;td&gt;cerca de 29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 s&lt;/td&gt;
&lt;td&gt;5,5 s&lt;/td&gt;
&lt;td&gt;cerca de 18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 s&lt;/td&gt;
&lt;td&gt;10,5 s&lt;/td&gt;
&lt;td&gt;cerca de 10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;É só aritmética, sem nenhum teste por trás: uma requisição por volta, uma resposta em 0,5 segundo, e o número de usuários dividido por (tempo de resposta + tempo de pensamento).&lt;/p&gt;
&lt;h2&gt;O que é tempo de pensamento em teste de carga?&lt;/h2&gt;
&lt;p&gt;Tempo de pensamento é a espera proposital que um script de teste insere entre os passos de uma jornada de usuário. Ele reproduz a parte humana de uma sessão: ler, comparar, digitar.&lt;/p&gt;
&lt;p&gt;No script de uma loja, ele fica entre &amp;quot;abrir a página do produto&amp;quot; e &amp;quot;adicionar ao carrinho&amp;quot;, fora de qualquer requisição. O &lt;a href=&quot;https://loadfocus.com/docs/guides/load-testing/what-is-delay-when-running-a-load-test?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=think-time-in-load-testing&quot;&gt;guia da LoadFocus sobre atrasos em teste de carga&lt;/a&gt; separa esse tempo do atraso de rampa, que adiciona usuários aos poucos, e do atraso de início entre um usuário e o próximo, e observa que muitas ferramentas chamam de &amp;quot;delay&amp;quot;, sem mais nada, o atraso de rampa. Quando uma ferramenta oferecer um campo &amp;quot;delay&amp;quot;, confira a qual dos três ele se refere.&lt;/p&gt;
&lt;h2&gt;Por que o tempo de pensamento muda a carga com o mesmo número de usuários?&lt;/h2&gt;
&lt;p&gt;Com um número fixo de usuários virtuais, cada um espera uma resposta, faz uma pausa e só então envia a próxima requisição. A volta dele leva o tempo de resposta mais o tempo de pensamento, então cada segundo de pausa a mais reduz as requisições que cada usuário envia por segundo.&lt;/p&gt;
&lt;p&gt;Cem usuários sem pausa enviam 200 requisições por segundo com uma resposta de 0,5 segundo; com uma pausa de 5 segundos enviam cerca de 18, de modo que duas execuções &amp;quot;com 100 usuários&amp;quot; podem ser testes bem diferentes. A documentação do k6 descreve o mesmo efeito para o seu &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/open-vs-closed/&quot;&gt;modelo fechado&lt;/a&gt;: a próxima iteração só começa quando a anterior termina, então respostas mais lentas também reduzem o ritmo (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;Cortar o tempo de pensamento para tirar mais carga de menos usuários tem um custo: vinte usuários sem pausas podem igualar o ritmo de requisições de várias centenas que fazem pausas, mantendo abertas muito menos sessões e conexões do que a produção.&lt;/p&gt;
&lt;h2&gt;Qual é a diferença entre tempo de pensamento e pacing?&lt;/h2&gt;
&lt;p&gt;Tempo de pensamento é uma pausa depois de um passo, então uma volta fica mais longa sempre que as respostas ficam lentas. Pacing fixa o intervalo entre o início de uma volta e o início da seguinte, e encurta a espera quando o trabalho demorou mais.&lt;/p&gt;
&lt;p&gt;Com pacing de 30 segundos, um usuário começa uma volta a cada 30 segundos, quer as requisições tenham levado 2 segundos ou 20, o que combina com testes montados a partir de volumes de negócio como &amp;quot;500 pedidos por hora&amp;quot;. A documentação do &lt;a href=&quot;https://docs.locust.io/en/stable/api.html&quot;&gt;&lt;code&gt;constant_pacing&lt;/code&gt;&lt;/a&gt; do Locust explica o caso extremo: se a tarefa durar mais que o intervalo, a espera cai para zero (conferido em 9 de outubro de 2026). Muitos scripts usam os dois, com tempo de pensamento entre os passos e pacing na volta inteira.&lt;/p&gt;
&lt;h2&gt;O tempo de pensamento deve ser fixo ou aleatório?&lt;/h2&gt;
&lt;p&gt;Aleatório, em torno de uma média que você mediu. Uma pausa fixa mantém no mesmo passo os usuários que começaram juntos, que chegam à mesma página no mesmo momento, volta após volta.&lt;/p&gt;
&lt;p&gt;Essas ondas sincronizadas podem criar picos que a produção nunca vê, e uma pausa aleatória espalha os usuários. Mantenha a média onde seus dados a colocam: uma pausa uniforme entre 2 e 8 segundos dá 5 em média, a mesma carga média de uma pausa fixa de 5 segundos. A distribuição uniforme é a escolha simples por padrão; uma normal (gaussiana) agrupa as pausas em torno de um valor típico, e uma exponencial gera muitas esperas curtas e algumas longas.&lt;/p&gt;
&lt;h2&gt;Como escolher os valores do tempo de pensamento?&lt;/h2&gt;
&lt;p&gt;Tire-os do que os usuários reais fazem em cada passo, usando sua ferramenta de analytics, os logs de acesso ou uma ferramenta de monitoramento de usuários reais (RUM). Use um valor diferente por passo, porque ler a página de um produto leva mais tempo do que apertar um botão.&lt;/p&gt;
&lt;p&gt;O tempo na página registrado pelo analytics, ou o intervalo entre requisições consecutivas de uma mesma sessão nos logs de acesso, se aproxima do tempo de pensamento daquele passo. Use a mediana como pausa média e a dispersão para definir a faixa aleatória, e descarte os tempos ociosos, como uma aba esquecida aberta durante o almoço.&lt;/p&gt;
&lt;p&gt;Uma API chamada por outros programas não tem ninguém humano no circuito, então modele diretamente o ritmo de requisições dela. Sem dados, anote no plano de teste os valores que você supôs, para que uma execução futura os substitua; o &lt;a href=&quot;https://loadtest.app/pt-br/how-to-run-a-load-test/&quot;&gt;guia passo a passo para fazer um teste de carga&lt;/a&gt; mostra onde eles entram.&lt;/p&gt;
&lt;h2&gt;Como adicionar tempo de pensamento no k6, JMeter, Gatling, Locust e Artillery?&lt;/h2&gt;
&lt;p&gt;Cada ferramenta tem seu próprio comando de pausa, e a maioria também oferece pacing ou controle de ritmo.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ferramenta&lt;/th&gt;
&lt;th&gt;Pausa fixa&lt;/th&gt;
&lt;th&gt;Pausa aleatória&lt;/th&gt;
&lt;th&gt;Pacing ou ritmo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sleep(3)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sleep(2 + Math.random() * 6)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Executores por taxa de chegada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;Constant Timer&lt;/td&gt;
&lt;td&gt;Uniform ou Gaussian Random Timer&lt;/td&gt;
&lt;td&gt;Constant Throughput Timer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pause(3)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pause(2, 8)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pace(30)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;&lt;code&gt;constant(3)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;between(2, 8)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;constant_pacing&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery&lt;/td&gt;
&lt;td&gt;&lt;code&gt;think: 3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;think&lt;/code&gt; + &lt;code&gt;jitter&lt;/code&gt; (em &lt;code&gt;config.http.defaults&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Taxa de chegada por fase&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Os fatos da tabela acima e das notas abaixo vêm da documentação de cada projeto, conferidos em 9 de outubro de 2026; as cinco ferramentas aparecem na nossa análise de &lt;a href=&quot;https://loadtest.app/pt-br/open-source-load-testing-tools/&quot;&gt;ferramentas de teste de carga open source&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;k6.&lt;/strong&gt; &lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6/sleep/&quot;&gt;&lt;code&gt;sleep(t)&lt;/code&gt;&lt;/a&gt; pausa o usuário virtual por &lt;code&gt;t&lt;/code&gt; segundos; a documentação monta pausas aleatórias com &lt;code&gt;Math.random()&lt;/code&gt; ou com &lt;code&gt;randomIntBetween()&lt;/code&gt; do k6-utils:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;
import { sleep } from &amp;quot;k6&amp;quot;;

export default function () {
  http.get(&amp;quot;https://example.com/products&amp;quot;);
  sleep(2 + Math.random() * 6); // de 2 a 8 segundos
  http.get(&amp;quot;https://example.com/cart&amp;quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;JMeter.&lt;/strong&gt; Entre os &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#timers&quot;&gt;timers&lt;/a&gt;, o Constant Timer recebe um atraso em milissegundos, os Uniform e Gaussian Random Timers somam uma parte aleatória a um deslocamento fixo, e o Constant Throughput Timer varia suas pausas para manter uma meta de amostras por minuto. Um timer roda antes de cada sampler do seu escopo, então um único timer no nível do Thread Group pausa antes de cada requisição.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gatling.&lt;/strong&gt; &lt;a href=&quot;https://docs.gatling.io/concepts/scenario/&quot;&gt;&lt;code&gt;pause(2, 8)&lt;/code&gt;&lt;/a&gt; espera um tempo aleatório uniforme, e &lt;code&gt;pace(30)&lt;/code&gt; dentro de um laço o executa no máximo uma vez a cada 30 segundos. No &lt;a href=&quot;https://docs.gatling.io/concepts/simulation/&quot;&gt;nível da simulação&lt;/a&gt;, você pode passar todas as pausas para uma distribuição normal ou exponencial, ou desligá-las com &lt;code&gt;disablePauses()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Locust.&lt;/strong&gt; O &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;&lt;code&gt;wait_time&lt;/code&gt;&lt;/a&gt; vale depois de cada tarefa, então uma tarefa com duas requisições sob &lt;code&gt;constant_throughput(2)&lt;/code&gt; envia quatro requisições por segundo por usuário.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artillery.&lt;/strong&gt; Um &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/http&quot;&gt;passo &lt;code&gt;think&lt;/code&gt;&lt;/a&gt; pausa por um número de segundos, e uma configuração &lt;code&gt;think.jitter&lt;/code&gt; em &lt;code&gt;config.http.defaults&lt;/code&gt; adiciona variação aleatória a cada passo think. Para ver duas dessas ferramentas lado a lado, leia &lt;a href=&quot;https://loadtest.app/pt-br/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;O tempo de pensamento importa num teste por taxa de chegada?&lt;/h2&gt;
&lt;p&gt;Menos, no que diz respeito ao ritmo de requisições. Quando a ferramenta inicia novas iterações num ritmo fixo, as pausas decidem quanto tempo cada usuário fica e, portanto, quantos estão ativos ao mesmo tempo.&lt;/p&gt;
&lt;p&gt;Os &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/constant-arrival-rate/&quot;&gt;executores por taxa de chegada&lt;/a&gt; do k6 ditam o ritmo das iterações pela taxa, e a documentação desaconselha um &lt;code&gt;sleep&lt;/code&gt; no fim da iteração; as &lt;a href=&quot;https://www.artillery.io/docs/reference/test-script&quot;&gt;fases de carga&lt;/a&gt; do Artillery também criam um número fixo de novos usuários virtuais por segundo (ambos conferidos em 9 de outubro de 2026). O tempo de pensamento entre os passos continua moldando cada sessão.&lt;/p&gt;
&lt;h2&gt;Como as ferramentas de script da LoadFocus definem o tempo de pensamento?&lt;/h2&gt;
&lt;p&gt;Elas o escrevem no script do k6 ou do JMeter como valor inicial, para você ajustar depois.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://loadfocus.com/docs/guides/k6-load-testing/import-to-k6-from-curl-har-postman-openapi?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=think-time-in-load-testing&quot;&gt;importação de cURL, HAR, Postman ou OpenAPI&lt;/a&gt; transforma uma requisição capturada em um script do k6 que termina cada iteração com &lt;code&gt;sleep(1)&lt;/code&gt;; trate esse segundo como um valor provisório a substituir pelas suas medições. O gerador de testes com IA da LoadFocus é instruído a dar a cada passo um tempo de pensamento, escreve esse tempo como &lt;code&gt;sleep()&lt;/code&gt; para o k6 ou como Constant Timer para o JMeter, e avisa quando um cenário com vários passos não tem nenhum.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Dá para rodar um teste de carga sem tempo de pensamento?&lt;/strong&gt;
Sim, para encontrar a vazão máxima de um endpoint ou num teste de estresse, desde que você apresente o resultado em requisições por segundo. Ele diz pouco sobre quantos usuários reais o sistema consegue atender.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O tempo de pensamento entra no tempo de resposta?&lt;/strong&gt;
Não nos tempos de cada requisição. No k6, &lt;code&gt;http_req_duration&lt;/code&gt; cobre o envio, a espera e o recebimento, enquanto &lt;code&gt;iteration_duration&lt;/code&gt; cobre a volta inteira (&lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;referência de métricas&lt;/a&gt;, conferido em 9 de outubro de 2026). Um Transaction Controller do JMeter deixa os timers fora do seu tempo, a menos que você marque a opção que os inclui.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-vs-closed-workload-model/&quot;&gt;Modelo de carga aberto vs fechado: qual usar e quando&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/littles-law-load-testing/&quot;&gt;Lei de Little em teste de carga: dimensionar e conferir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/how-to-run-a-load-test/&quot;&gt;Como fazer um teste de carga: guia passo a passo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/queueing-theory/&quot;&gt;Teoria das filas: o que é e por que a latência dispara&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Ferramentas de teste de carga WebSocket: seis opções</title><link>https://loadtest.app/pt-br/websocket-load-testing-tools/</link><guid isPermaLink="true">https://loadtest.app/pt-br/websocket-load-testing-tools/</guid><description>Ferramentas de teste de carga WebSocket comparadas: k6, Artillery, Gatling, JMeter, Locust e Tsung, o que cada uma suporta e quando escolher outra.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, que vende um serviço de teste de carga abordado neste artigo.&lt;/p&gt;&lt;p&gt;Entre as ferramentas de teste de carga WebSocket, k6, Artillery, Gatling e Tsung suportam o protocolo de fábrica, enquanto o JMeter precisa do plugin WebSocket Samplers e o Locust precisa de código cliente escrito por você ou do seu usuário experimental de Socket.IO. Escolha pela linguagem em que o seu time escreve e, depois, pelo rigor com que você precisa verificar as mensagens que o servidor devolve.&lt;/p&gt;
&lt;p&gt;Para este artigo, não rodamos essas ferramentas contra um servidor WebSocket. Os dados vêm da documentação e do repositório de cada projeto, conferidos em 9 de outubro de 2026, e as notas de &amp;quot;Prefira&amp;quot; são a nossa avaliação.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ferramenta&lt;/th&gt;
&lt;th&gt;Suporte a WebSocket&lt;/th&gt;
&lt;th&gt;Testes escritos em&lt;/th&gt;
&lt;th&gt;Verificar o que o servidor envia&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;De fábrica: &lt;code&gt;k6/websockets&lt;/code&gt;, o antigo &lt;code&gt;k6/ws&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;Handlers de eventos no seu script&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery&lt;/td&gt;
&lt;td&gt;Engines de fábrica &lt;code&gt;ws&lt;/code&gt; e &lt;code&gt;socketio&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;YAML, mais funções JavaScript&lt;/td&gt;
&lt;td&gt;Respostas e acknowledgements do Socket.IO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;Parte do SDK de HTTP&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript&lt;/td&gt;
&lt;td&gt;Checks que esperam uma mensagem específica&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apache JMeter&lt;/td&gt;
&lt;td&gt;Plugin WebSocket Samplers&lt;/td&gt;
&lt;td&gt;Planos de teste montados na interface gráfica&lt;/td&gt;
&lt;td&gt;Samplers de request-response e de leitura&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;Seu próprio cliente, ou o &lt;code&gt;SocketIOUser&lt;/code&gt; experimental&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;O que o seu código reportar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tsung&lt;/td&gt;
&lt;td&gt;Tipo de sessão de fábrica &lt;code&gt;ts_websocket&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;XML&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ack&lt;/code&gt; espera uma resposta do servidor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;O que muda na carga WebSocket em relação à carga HTTP?&lt;/h2&gt;
&lt;p&gt;Um usuário WebSocket abre uma conexão e a mantém durante toda a sessão, e o servidor pode mandar mensagens quando quiser. Por isso um teste tem dois controles, conexões abertas e mensagens por segundo, e cada um carrega o servidor de um jeito.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/protocols/websockets/&quot;&gt;guia de WebSocket do k6&lt;/a&gt; descreve tráfego full-duplex sobre uma única conexão TCP e explica que um usuário virtual roda ali um loop de eventos enquanto o socket fica aberto e para de repetir a função principal. A &lt;a href=&quot;https://docs.gatling.io/reference/script/websocket/&quot;&gt;referência de WebSocket do Gatling&lt;/a&gt; acrescenta que o tráfego vai nos dois sentidos, então o modelo de requisição e resposta do HTTP deixa de servir.&lt;/p&gt;
&lt;p&gt;Planeje três formatos de teste. Muitas conexões ociosas mostram quantos sockets os seus servidores conseguem manter. Um grupo menor de clientes que falam muito testa o tratamento de mensagens. Um broadcast, em que uma mensagem vai para todos os assinantes, testa o caminho do push.&lt;/p&gt;
&lt;h2&gt;O que medir em um teste de carga WebSocket?&lt;/h2&gt;
&lt;p&gt;Meça o tempo de conexão, a latência das mensagens e as conexões perdidas, além de quantas conexões continuam abertas. São esses valores que os usuários de um app em tempo real sentem.&lt;/p&gt;
&lt;p&gt;As &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;métricas embutidas do k6&lt;/a&gt; incluem &lt;code&gt;ws_connecting&lt;/code&gt;, &lt;code&gt;ws_ping&lt;/code&gt;, &lt;code&gt;ws_session_duration&lt;/code&gt;, &lt;code&gt;ws_sessions&lt;/code&gt; e contadores de mensagens. Nenhuma delas cronometra uma mensagem da aplicação, então o tempo entre a mensagem de um cliente e a resposta do servidor pede uma métrica Trend própria. A engine &lt;code&gt;ws&lt;/code&gt; do Artillery reporta a contagem e a taxa de mensagens, e a engine de Socket.IO acrescenta &lt;code&gt;socketio.response_time&lt;/code&gt;, do envio de uma mensagem até a chegada da resposta.&lt;/p&gt;
&lt;p&gt;Para as conexões perdidas, conte os eventos close e error que o seu script não provocou, e compare as sessões iniciadas com as que ainda estão abertas no fim de cada etapa.&lt;/p&gt;
&lt;h2&gt;Quando o k6 é a ferramenta WebSocket certa?&lt;/h2&gt;
&lt;p&gt;Quando o seu time escreve JavaScript e cada usuário virtual precisa manter vários sockets ao mesmo tempo. O k6 traz suporte a WebSocket de fábrica, sem extensão para instalar.&lt;/p&gt;
&lt;p&gt;O módulo &lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-websockets/&quot;&gt;&lt;code&gt;k6/websockets&lt;/code&gt;&lt;/a&gt; segue a API WebSocket do navegador e usa um loop de eventos global, que permite a um usuário virtual manter várias conexões abertas. O módulo antigo &lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-ws/&quot;&gt;&lt;code&gt;k6/ws&lt;/code&gt;&lt;/a&gt; continua documentado, mas o k6 recomenda &lt;code&gt;k6/websockets&lt;/code&gt; para testes novos, e &lt;code&gt;k6/experimental/websockets&lt;/code&gt; está obsoleto.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;import { WebSocket } from &amp;#39;k6/websockets&amp;#39;;

export default function () {
  const ws = new WebSocket(&amp;#39;wss://example.com/ws&amp;#39;);
  ws.onopen = () =&amp;gt; ws.send(&amp;#39;hello&amp;#39;);
  ws.onmessage = (e) =&amp;gt; {
    console.log(e.data);
    ws.close();
  };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Os &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; também funcionam com métricas próprias, então uma meta de latência não cumprida devolve à CI um código de saída diferente de zero. Prefira o Artillery quando o seu servidor fala Socket.IO e você quer verificar emits e acknowledgements sem escrever código cliente. A nossa comparação &lt;a href=&quot;https://loadtest.app/pt-br/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt; cobre as outras diferenças.&lt;/p&gt;
&lt;h2&gt;Quando o Artillery faz sentido?&lt;/h2&gt;
&lt;p&gt;Quando você quer cenários YAML curtos, ou quando o seu servidor usa Socket.IO. As duas engines vêm com o próprio Artillery.&lt;/p&gt;
&lt;p&gt;Um cenário na &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/websocket&quot;&gt;engine de WebSocket&lt;/a&gt; é montado com cinco ações: &lt;code&gt;connect&lt;/code&gt;, &lt;code&gt;send&lt;/code&gt;, &lt;code&gt;think&lt;/code&gt;, &lt;code&gt;loop&lt;/code&gt; e &lt;code&gt;function&lt;/code&gt;. A &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/socketio&quot;&gt;engine de Socket.IO&lt;/a&gt; vai além: um &lt;code&gt;emit&lt;/code&gt; pode declarar a resposta que espera, validar um acknowledgement com uma correspondência JSONPath e dividir o cenário com requisições HTTP, o que serve bem a apps que fazem login por HTTP antes de abrir um socket.&lt;/p&gt;
&lt;p&gt;Prefira o k6 ou o Gatling quando um teste precisa verificar o que um servidor WebSocket puro devolve, porque a documentação da engine &lt;code&gt;ws&lt;/code&gt; não descreve nenhuma etapa que espere ou compare uma resposta.&lt;/p&gt;
&lt;h2&gt;Para quem é o Gatling em WebSockets?&lt;/h2&gt;
&lt;p&gt;Para times na JVM, ou no SDK de JavaScript do Gatling, que querem escrever as verificações de mensagens dentro do cenário. O suporte a WebSocket faz parte do SDK de HTTP do Gatling, então os passos HTTP e WebSocket dividem a mesma simulação.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://docs.gatling.io/reference/script/websocket/&quot;&gt;referência&lt;/a&gt; cobre &lt;code&gt;connect&lt;/code&gt;, &lt;code&gt;sendText&lt;/code&gt;, &lt;code&gt;sendBytes&lt;/code&gt; e &lt;code&gt;close&lt;/code&gt;, além de checks que bloqueiam até a mensagem esperada chegar ou um timeout passar. As configurações do protocolo permitem reconectar um socket que o servidor fechou, responder automaticamente a certas mensagens de texto, como um ping, e guardar em buffer as mensagens que nenhum check reconheceu. Segundo o &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;repositório&lt;/a&gt;, WebSocket faz parte da Community Edition sob Apache 2.0, sem limites.&lt;/p&gt;
&lt;p&gt;Prefira o k6 se você gosta mais de reagir às mensagens enviadas pelo servidor em handlers de eventos do que em checks bloqueantes.&lt;/p&gt;
&lt;h2&gt;O JMeter consegue fazer teste de carga de WebSockets?&lt;/h2&gt;
&lt;p&gt;Sim, com um plugin. O JMeter não tem sampler de WebSocket, e a extensão de costume é o WebSocket Samplers, de Peter Doornbosch.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html&quot;&gt;referência de componentes&lt;/a&gt; do JMeter não menciona WebSocket em nenhum momento. O &lt;a href=&quot;https://bitbucket.org/pjtr/jmeter-websocket-samplers/src/master/&quot;&gt;repositório do plugin&lt;/a&gt; descreve seis samplers: abrir conexão, request-response, ping-pong, leitura única, escrita única e fechamento. Eles rodam na thread do próprio thread group, suportam &lt;code&gt;wss&lt;/code&gt; e frames binários, e podem filtrar os frames que não importam para o teste. A instalação é pelo Plugins Manager ou copiando o jar para &lt;code&gt;lib/ext&lt;/code&gt;, e a versão 1.3.2 foi marcada em janeiro de 2026 (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;Escolha outra ferramenta se você prefere não manter um plugin de terceiros em cada gerador de carga.&lt;/p&gt;
&lt;h2&gt;E o Locust e o Tsung?&lt;/h2&gt;
&lt;p&gt;O Locust só chega aos WebSockets puros com código cliente que você adiciona, e o Tsung os suporta na configuração XML, mas lança versões novas raramente. Os dois funcionam, com mais esforço.&lt;/p&gt;
&lt;p&gt;Segundo a &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;documentação do Locust&lt;/a&gt;, a ferramenta suporta de fábrica só HTTP e HTTPS; outros protocolos entram envolvendo uma biblioteca cliente e disparando um evento request depois de cada chamada. A biblioteca precisa aceitar o patch do gevent, ou vai bloquear o processo inteiro. Para Socket.IO existe um &lt;code&gt;SocketIOUser&lt;/code&gt; experimental. Escolha o Locust se o seu time escreve Python e não se importa de manter esse código cliente.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/processone/tsung&quot;&gt;Tsung&lt;/a&gt; é um projeto em Erlang que se descreve como uma ferramenta de teste de carga distribuída e multiprotocolo. A sua &lt;a href=&quot;https://github.com/processone/tsung/blob/develop/docs/conf-sessions.rst&quot;&gt;documentação de sessões&lt;/a&gt; define para WebSocket as requisições &lt;code&gt;connect&lt;/code&gt;, &lt;code&gt;message&lt;/code&gt; e &lt;code&gt;close&lt;/code&gt;, com um atributo &lt;code&gt;ack&lt;/code&gt; para esperar uma resposta. A sua &lt;a href=&quot;https://github.com/processone/tsung/tags&quot;&gt;última versão marcada&lt;/a&gt;, a 1.8.0, é de março de 2023.&lt;/p&gt;
&lt;h2&gt;Onde entra um serviço hospedado como a LoadFocus?&lt;/h2&gt;
&lt;p&gt;Manter muitos sockets abertos a partir das suas próprias máquinas dá trabalho, e um serviço hospedado assume a geração de carga. Ele se encaixa melhor quando os seus testes já são scripts k6.&lt;/p&gt;
&lt;p&gt;A LoadFocus, que publica este site, &lt;a href=&quot;https://loadfocus.com/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=websocket-load-testing-tools&quot;&gt;roda scripts k6&lt;/a&gt; a partir de 25 regiões na nuvem, e a sua página de k6 lista conexões WebSocket entre os recursos do k6 suportados. Ela também oferece um &lt;a href=&quot;https://loadfocus.com/templates/load-testing-for-websocket-ramp-up-and-ramp-down?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=websocket-load-testing-tools&quot;&gt;template de teste WebSocket com rampa de subida e descida&lt;/a&gt; (em inglês). Não verificamos se ela roda plugins do JMeter como o WebSocket Samplers, então não afirmamos nada sobre isso.&lt;/p&gt;
&lt;h2&gt;Como escolher entre elas?&lt;/h2&gt;
&lt;p&gt;Parta da linguagem do seu time e depois pergunte se você testa WebSockets puros ou Socket.IO e com que rigor precisa verificar as mensagens enviadas pelo servidor. Normalmente sobram uma ou duas candidatas.&lt;/p&gt;
&lt;p&gt;Escreva nas duas o mesmo teste curto de conectar, enviar e receber, e compare o tempo de conexão e a latência das mensagens com pouca carga. O nosso guia &lt;a href=&quot;https://loadtest.app/pt-br/how-to-run-a-load-test/&quot;&gt;Como fazer um teste de carga&lt;/a&gt; mostra os passos, e o panorama de &lt;a href=&quot;https://loadtest.app/pt-br/open-source-load-testing-tools/&quot;&gt;ferramentas de teste de carga open source&lt;/a&gt; compara esses projetos além do WebSocket.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Com qual ferramenta de teste de carga WebSocket devo começar?&lt;/strong&gt;
Se o seu time escreve JavaScript, comece pelo k6, que traz WebSocket de fábrica. Para apps com Socket.IO, a engine do Artillery pede menos código, e times da JVM vão se sentir em casa no Gatling.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O JMeter consegue testar WebSockets sem plugin?&lt;/strong&gt;
A referência de componentes dele não traz nenhum sampler de WebSocket, então o caminho prático é o plugin WebSocket Samplers, instalado pelo Plugins Manager ou como jar em &lt;code&gt;lib/ext&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Devo usar k6/ws ou k6/websockets?&lt;/strong&gt;
Use &lt;code&gt;k6/websockets&lt;/code&gt; em testes novos, como recomenda a documentação do k6. O módulo antigo &lt;code&gt;k6/ws&lt;/code&gt; continua documentado para scripts existentes.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-source-load-testing-tools/&quot;&gt;Ferramentas de teste de carga open source: seis opções&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/how-to-load-test-a-graphql-api/&quot;&gt;Teste de carga de API GraphQL: guia prático&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/http-benchmarking-tools/&quot;&gt;Ferramentas de benchmark HTTP: wrk, hey, oha, ab e mais&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/grpc-load-testing/&quot;&gt;Teste de carga gRPC: ferramentas, configuração e métricas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/artillery-load-testing/&quot;&gt;Teste de carga com Artillery: análise da ferramenta Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/tsung-load-testing/&quot;&gt;Teste de carga com Tsung: análise da ferramenta Erlang&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Como fazer um teste de carga: guia passo a passo</title><link>https://loadtest.app/pt-br/how-to-run-a-load-test/</link><guid isPermaLink="true">https://loadtest.app/pt-br/how-to-run-a-load-test/</guid><description>Como fazer um teste de carga do início ao fim: definir a meta, roteirizar uma jornada, validar o script, subir a carga e ler os resultados que importam.</description><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, um serviço de teste de carga mencionado neste artigo.&lt;/p&gt;&lt;p&gt;Para fazer um teste de carga, decida como é um bom resultado, roteirize uma jornada de usuário realista, confira esse script com um único usuário e depois aumente a carga em degraus enquanto observa tempos de resposta e erros. Compare o que você mediu com a meta definida no começo e mude uma coisa de cada vez antes da próxima execução.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Passo&lt;/th&gt;
&lt;th&gt;O que você faz&lt;/th&gt;
&lt;th&gt;Pronto quando&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1. Definir a meta&lt;/td&gt;
&lt;td&gt;Escolher a carga a testar e os números que contam como aprovação&lt;/td&gt;
&lt;td&gt;Você consegue escrever os critérios numa frase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Roteirizar uma jornada&lt;/td&gt;
&lt;td&gt;Transformar um caminho real de usuário em script&lt;/td&gt;
&lt;td&gt;O script roda sem erros&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Teste de fumaça&lt;/td&gt;
&lt;td&gt;Rodar com um usuário virtual&lt;/td&gt;
&lt;td&gt;Todas as verificações passam&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Subir a carga&lt;/td&gt;
&lt;td&gt;Aumentar a carga em degraus e segurar na meta&lt;/td&gt;
&lt;td&gt;Você chega à meta ou a uma condição de parada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Ler os resultados&lt;/td&gt;
&lt;td&gt;Comparar percentis e erros com a meta&lt;/td&gt;
&lt;td&gt;Você sabe se passou e o que mudar&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;O que decidir antes de rodar um teste de carga?&lt;/h2&gt;
&lt;p&gt;Decida para qual carga você está testando e qual resultado conta como aprovado. Sem as duas coisas, um teste de carga gera números, mas não uma resposta.&lt;/p&gt;
&lt;p&gt;Parta do tráfego real se você tiver. Seu analytics ou seus logs de acesso mostram o horário de pico, quantas requisições por segundo chegam e quais páginas ou endpoints recebem a maior parte. Coloque a meta acima desse pico, porque a ideia é saber que você tem folga. Depois escreva os critérios como números, por exemplo: o percentil 95 do tempo de resposta fica abaixo de 500 ms e menos de 1% das requisições falham com 200 usuários virtuais.&lt;/p&gt;
&lt;p&gt;Duas decisões práticas também entram aqui. Escolha um ambiente parecido com a produção em tamanho e configuração, porque um servidor de staging com um quarto da capacidade diz pouco sobre a produção. E garanta que você tem permissão para testá-lo: rodar um teste de carga contra um sistema que não é seu, ou que é compartilhado com outros times, sem avisar parece exatamente um ataque.&lt;/p&gt;
&lt;h2&gt;Como roteirizar uma jornada de usuário realista?&lt;/h2&gt;
&lt;p&gt;Roteirize o caminho que mais importa para o negócio, passo a passo, com pausas onde uma pessoa de verdade leria ou digitaria. Um script que chama uma única URL o mais rápido possível mede alguma coisa, mas raramente o que importa.&lt;/p&gt;
&lt;p&gt;Numa loja pode ser: abrir a página inicial, buscar, abrir um produto, colocar no carrinho. Numa API: fazer login, listar itens, buscar um item. Coloque uma pausa curta entre os passos (tempo de pensamento), use dados de teste variados para que os caches se comportem como na vida real e verifique cada resposta para que uma página de erro não passe por uma resposta rápida.&lt;/p&gt;
&lt;p&gt;Este é o script que usamos no exemplo deste guia, escrito para k6. Ele sobe para 10 usuários virtuais, segura a carga e desce, com dois critérios de aprovação embutidos:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;
import { check, sleep } from &amp;quot;k6&amp;quot;;

export const options = {
  stages: [
    { duration: &amp;quot;10s&amp;quot;, target: 10 },
    { duration: &amp;quot;20s&amp;quot;, target: 10 },
    { duration: &amp;quot;5s&amp;quot;, target: 0 },
  ],
  thresholds: {
    http_req_duration: [&amp;quot;p(95)&amp;lt;500&amp;quot;],
    http_req_failed: [&amp;quot;rate&amp;lt;0.01&amp;quot;],
  },
};

export default function () {
  const res = http.get(&amp;quot;http://127.0.0.1:8765/&amp;quot;);
  check(res, { &amp;quot;status is 200&amp;quot;: (r) =&amp;gt; r.status === 200 });
  sleep(1);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Uma jornada real tem várias requisições e URLs reais. Esta é minúscula de propósito, para os passos ficarem fáceis de acompanhar.&lt;/p&gt;
&lt;h2&gt;Por que rodar primeiro um teste de fumaça com um usuário?&lt;/h2&gt;
&lt;p&gt;Um teste de fumaça com um usuário virtual prova que o script funciona antes de colocar carga de verdade em qualquer coisa. É o jeito mais barato de pegar uma URL errada, um token de login faltando ou uma verificação que sempre falha.&lt;/p&gt;
&lt;p&gt;No k6 você pode &lt;a href=&quot;https://grafana.com/docs/k6/latest/get-started/running-k6/&quot;&gt;sobrescrever a carga pela linha de comando&lt;/a&gt;, então o mesmo script roda uma vez com um único usuário:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;k6 run --vus 1 --iterations 1 script.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Na nossa execução, a única verificação passou, então o script estava pronto para a carga. Se uma verificação falhar aqui, corrija o script antes de seguir: erros com um usuário viram ruído com cem.&lt;/p&gt;
&lt;h2&gt;Como subir a carga?&lt;/h2&gt;
&lt;p&gt;Aumente a carga em degraus e segure cada degrau tempo suficiente para estabilizar, em vez de pular direto para a meta. Uma rampa em degraus mostra a partir de qual nível as coisas começam a piorar.&lt;/p&gt;
&lt;p&gt;Um formato comum é subir até um primeiro degrau, segurar alguns minutos, subir para o próximo, segurar de novo e assim por diante até a meta, e depois descer. Olhando cada patamar separado, você vê se os tempos de resposta sobem aos poucos com a carga ou ficam estáveis e depois saltam. Esse salto, o ponto em que cada usuário a mais deixa cada requisição mais lenta, é a coisa mais útil que um teste de carga pode encontrar. Nosso exemplo só sobe para 10 usuários e segura por 20 segundos, o suficiente para mostrar os degraus, mas curto demais para um teste real.&lt;/p&gt;
&lt;h2&gt;O que observar enquanto o teste roda?&lt;/h2&gt;
&lt;p&gt;Observe os percentis do tempo de resposta, a taxa de erros e a vazão do lado do gerador de carga, e CPU, memória e carga do banco de dados no sistema testado. As três primeiras dizem como os usuários sentiriam, e as três últimas dizem por quê.&lt;/p&gt;
&lt;p&gt;Combine condições de parada antes de começar, por exemplo: parar se a taxa de erros passar de 5% ou se os tempos de resposta chegarem a vários segundos. Continuar forçando um sistema que já caiu não ensina nada, e num ambiente compartilhado atrapalha o trabalho dos outros.&lt;/p&gt;
&lt;p&gt;Observe também o gerador de carga. Se ele estiver com a CPU a 100%, as respostas lentas podem estar vindo do seu próprio notebook, e não do servidor.&lt;/p&gt;
&lt;h2&gt;Como ler os resultados de um teste de carga?&lt;/h2&gt;
&lt;p&gt;Leia os percentis e a taxa de erros contra os critérios que você anotou no começo. O tempo de resposta médio é o número menos útil do relatório.&lt;/p&gt;
&lt;p&gt;Este foi o resultado da nossa execução de exemplo (35 segundos, até 10 usuários virtuais, uma pequena página estática servida num notebook, em 8 de outubro de 2026):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Métrica&lt;/th&gt;
&lt;th&gt;Valor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Requisições&lt;/td&gt;
&lt;td&gt;282 (8 por segundo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requisições com falha&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tempo de resposta médio&lt;/td&gt;
&lt;td&gt;0,69 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Percentil 90&lt;/td&gt;
&lt;td&gt;0,66 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Percentil 95&lt;/td&gt;
&lt;td&gt;0,71 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Percentil 99&lt;/td&gt;
&lt;td&gt;2,68 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requisição mais lenta&lt;/td&gt;
&lt;td&gt;15,98 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thresholds&lt;/td&gt;
&lt;td&gt;Os dois aprovados&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Os números são minúsculos porque o alvo era um arquivo estático na mesma máquina, então eles não servem como benchmark. A lição está no formato: a média ficou acima do percentil 90, porque um punhado de requisições lentas a puxou para cima. Os percentis descrevem o que a maioria das requisições viveu, e o percentil 99 e a requisição mais lenta mostram a cauda que poucos usuários enfrentam. Julgue a execução pelo percentil dos seus critérios e use a cauda para decidir se algo merece um olhar mais de perto.&lt;/p&gt;
&lt;p&gt;Se uma execução não bater a meta, mude uma única coisa (uma consulta, uma configuração de cache, um tamanho de instância) e rode o mesmo teste de novo, para saber o que fez a diferença.&lt;/p&gt;
&lt;h2&gt;Quando rodar o teste a partir da nuvem?&lt;/h2&gt;
&lt;p&gt;Leve o gerador de carga para a nuvem quando uma máquina não consegue produzir a carga necessária, ou quando importa onde seus usuários estão. Um notebook no Wi-Fi do escritório mede a sua conexão tanto quanto o seu servidor.&lt;/p&gt;
&lt;p&gt;O mesmo script k6 pode rodar em infraestrutura que você mesmo opera, no serviço hospedado da Grafana ou na &lt;a href=&quot;https://loadfocus.com/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=how-to-run-a-load-test&quot;&gt;LoadFocus, que roda scripts k6 a partir de 25 regiões na nuvem&lt;/a&gt;. Os relatórios dela separam os resultados por localização e mostram o tempo de resposta em relação ao número de usuários virtuais, que é onde o salto descrito acima aparece (&lt;a href=&quot;https://loadfocus.com/docs/guides/load-testing/analyzing-load-test-results?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=how-to-run-a-load-test&quot;&gt;como ler os resultados na LoadFocus&lt;/a&gt;).&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Quanto tempo deve durar um teste de carga?&lt;/strong&gt;
O suficiente para segurar a carga da meta por vários minutos depois da subida, para que picos curtos não decidam o resultado. Segurar por pelo menos 10 minutos é um bom começo, e bem mais se você estiver procurando vazamentos de memória ou uma degradação lenta.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;De quantos usuários virtuais eu preciso?&lt;/strong&gt;
Calcule a partir do tráfego real. Pegue as requisições por segundo do horário de pico, estime quantas requisições uma jornada faz e quanto tempo ela dura, e dimensione os usuários virtuais para que o teste produza essa taxa com alguma folga.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;É seguro fazer teste de carga em produção?&lt;/strong&gt;
Pode ser, com cuidado: teste num horário tranquilo, avise quem opera o sistema, defina condições de parada e comece bem abaixo do pico esperado. Muitos times preferem um ambiente de staging do tamanho da produção, para que um teste que falhe não afete nenhum cliente.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/load-test-pass-fail-criteria/&quot;&gt;Critérios de aprovação de um teste de carga: como definir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/load-testing-in-github-actions/&quot;&gt;Teste de carga no GitHub Actions: guia prático&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>k6 vs Artillery: qual ferramenta de teste de carga escolher</title><link>https://loadtest.app/pt-br/k6-vs-artillery/</link><guid isPermaLink="true">https://loadtest.app/pt-br/k6-vs-artillery/</guid><description>k6 e Artillery comparados em scripts, protocolos, critérios de aprovação, execução distribuída e licenças, e quando vale escolher cada ferramenta.</description><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, que vende um serviço de teste de carga abordado neste artigo.&lt;/p&gt;&lt;p&gt;k6 e Artillery são ferramentas de teste de carga open source em que os testes são escritos como código, e qualquer uma das duas testa bem uma API HTTP sob carga. Escolha o k6 se você quer um único binário, a lógica do teste em JavaScript e limites de aprovação já embutidos. Escolha o Artillery se o seu time já vive no Node.js, prefere cenários curtos em YAML ou precisa de testes de navegador com Playwright e execuções distribuídas na AWS ou no Azure direto da linha de comando.&lt;/p&gt;
&lt;p&gt;Os dados abaixo vêm da documentação e do repositório de cada projeto, conferidos em 8 de outubro de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;k6&lt;/th&gt;
&lt;th&gt;Artillery&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licença&lt;/td&gt;
&lt;td&gt;AGPL-3.0 (&lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;repositório&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;MPL-2.0, alguns módulos de Azure sob BSL (&lt;a href=&quot;https://github.com/artilleryio/artillery&quot;&gt;repositório&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ambiente de execução&lt;/td&gt;
&lt;td&gt;Um binário Go com um motor JavaScript embutido&lt;/td&gt;
&lt;td&gt;Node.js, versão LTS mais recente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scripts de teste&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;YAML, TypeScript ou JavaScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocolos principais&lt;/td&gt;
&lt;td&gt;HTTP, WebSockets, gRPC&lt;/td&gt;
&lt;td&gt;HTTP, WebSocket, Socket.IO (gRPC e Kinesis via engines adicionais)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testes de navegador&lt;/td&gt;
&lt;td&gt;Módulo de navegador embutido&lt;/td&gt;
&lt;td&gt;Playwright&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Critérios de aprovação&lt;/td&gt;
&lt;td&gt;Thresholds&lt;/td&gt;
&lt;td&gt;Plugin &lt;code&gt;ensure&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execução distribuída&lt;/td&gt;
&lt;td&gt;k6-operator no Kubernetes, ou Grafana Cloud k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;run-lambda&lt;/code&gt; ou &lt;code&gt;run-fargate&lt;/code&gt; na AWS, &lt;code&gt;run-aci&lt;/code&gt; no Azure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qual é a diferença entre k6 e Artillery?&lt;/h2&gt;
&lt;p&gt;Eles se diferenciam principalmente no ambiente de execução e na forma de descrever a carga. O k6 é uma ferramenta compilada em Go que executa código de teste em JavaScript, enquanto o Artillery é uma ferramenta Node.js que lê cenários em YAML ou JavaScript.&lt;/p&gt;
&lt;p&gt;Essa diferença aparece logo no primeiro dia. Instalar o k6 é instalar um pacote ou &lt;a href=&quot;https://grafana.com/docs/k6/latest/set-up/install-k6/&quot;&gt;um binário independente&lt;/a&gt;, sem um ambiente de execução para manter. O Artillery &lt;a href=&quot;https://www.artillery.io/docs/get-started/get-artillery&quot;&gt;precisa do Node.js&lt;/a&gt; e é instalado pelo npm, o que é natural num projeto JavaScript e é mais um ambiente para manter atualizado em qualquer outro lugar.&lt;/p&gt;
&lt;p&gt;Em protocolos, o que os dois têm em comum cobre quase todo o trabalho web: ambos falam HTTP e WebSockets de fábrica. O k6 traz também gRPC, e o Artillery, Socket.IO. O Artillery ganha gRPC e Kinesis com &lt;a href=&quot;https://www.artillery.io/docs/reference/engines&quot;&gt;engines adicionais&lt;/a&gt; instaladas à parte (conferido em 9 de outubro de 2026), e o k6 vai além com seu ecossistema de extensões.&lt;/p&gt;
&lt;h2&gt;Como se escreve um teste em cada ferramenta?&lt;/h2&gt;
&lt;p&gt;No k6 você escreve um módulo JavaScript com as opções no topo e uma função padrão que cada usuário virtual executa. No Artillery você normalmente escreve um arquivo YAML com um bloco &lt;code&gt;config&lt;/code&gt; para a carga e um bloco &lt;code&gt;scenarios&lt;/code&gt; para o que cada usuário virtual faz.&lt;/p&gt;
&lt;p&gt;Um teste k6 que sobe para 20 usuários virtuais e falha se o percentil 95 do tempo de resposta passar de 500 ms:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;
import { check, sleep } from &amp;quot;k6&amp;quot;;

export const options = {
  stages: [
    { duration: &amp;quot;30s&amp;quot;, target: 20 },
    { duration: &amp;quot;1m&amp;quot;, target: 20 },
    { duration: &amp;quot;15s&amp;quot;, target: 0 },
  ],
  thresholds: { http_req_duration: [&amp;quot;p(95)&amp;lt;500&amp;quot;] },
};

export default function () {
  const res = http.get(&amp;quot;https://staging.example.com/api/users&amp;quot;);
  check(res, { &amp;quot;status is 200&amp;quot;: (r) =&amp;gt; r.status === 200 });
  sleep(1);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A mesma ideia no &lt;a href=&quot;https://www.artillery.io/docs/reference/test-script&quot;&gt;formato YAML do Artillery&lt;/a&gt;, com dez novos usuários virtuais por segundo durante um minuto:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;config:
  target: &amp;quot;https://staging.example.com&amp;quot;
  phases:
    - duration: 60
      arrivalRate: 10
  plugins:
    ensure:
      thresholds:
        - &amp;quot;http.response_time.p95&amp;quot;: 500
scenarios:
  - flow:
      - get:
          url: &amp;quot;/api/users&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Os dois exemplos modelam a carga de jeitos diferentes. O script k6 define um número de usuários virtuais simultâneos, e o arquivo do Artillery define quantos usuários virtuais novos chegam a cada segundo. O k6 também consegue controlar taxas de chegada com seus &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/&quot;&gt;executors de cenários&lt;/a&gt;, e o Artillery pode limitar a concorrência com &lt;code&gt;maxVusers&lt;/code&gt;, então escolha o modelo que se parece com o jeito que o tráfego real chega ao seu sistema, e não o que cada ferramenta mostra primeiro.&lt;/p&gt;
&lt;h2&gt;Como o k6 e o Artillery decidem se um teste passou?&lt;/h2&gt;
&lt;p&gt;Os dois transformam uma meta de desempenho em código de saída, que é o que um pipeline de CI precisa. Uma meta não cumprida encerra a execução com código de saída diferente de zero nas duas ferramentas.&lt;/p&gt;
&lt;p&gt;No k6 as metas são &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; e ficam nas opções do script, como no exemplo acima. No Artillery elas ficam no &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/ensure&quot;&gt;plugin &lt;code&gt;ensure&lt;/code&gt;&lt;/a&gt;, que aceita limites simples e condições que combinam várias métricas.&lt;/p&gt;
&lt;p&gt;A diferença prática está em onde as metas ficam. Os thresholds do k6 ficam no mesmo arquivo da lógica do teste. As verificações do Artillery ficam no bloco &lt;code&gt;config&lt;/code&gt;, onde alguém que nunca mexe nos cenários ainda consegue ajustá-las.&lt;/p&gt;
&lt;h2&gt;Como rodar um teste maior do que uma máquina consegue gerar?&lt;/h2&gt;
&lt;p&gt;As duas ferramentas conseguem distribuir um teste entre várias máquinas, por caminhos bem diferentes. O k6 se apoia no Kubernetes ou no serviço hospedado da Grafana, e o Artillery na sua própria conta da AWS ou do Azure.&lt;/p&gt;
&lt;p&gt;Para o k6, o &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt; divide um teste entre pods de um cluster Kubernetes, e o Grafana Cloud k6 roda os mesmos scripts como serviço hospedado. Para o Artillery, os comandos &lt;code&gt;run-lambda&lt;/code&gt; e &lt;code&gt;run-fargate&lt;/code&gt; &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/aws-lambda&quot;&gt;sobem workers na sua conta da AWS&lt;/a&gt; depois de uma configuração de IAM feita uma única vez com uma stack do CloudFormation. No Azure, o &lt;code&gt;run-aci&lt;/code&gt; faz o mesmo com &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/azure-aci&quot;&gt;Azure Container Instances&lt;/a&gt;, mas exige uma assinatura paga do Artillery para qualquer uso além de avaliação (conferido em 9 de outubro de 2026). Se você já usa Kubernetes, o caminho do operator vai parecer familiar. Se prefere não operar nada, o caminho serverless do Artillery tem menos peças móveis, desde que o teste possa viver na AWS ou no Azure.&lt;/p&gt;
&lt;p&gt;Existe um terceiro caminho para scripts k6. &lt;a href=&quot;https://loadfocus.com/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=k6-vs-artillery&quot;&gt;A LoadFocus roda scripts k6&lt;/a&gt; na própria infraestrutura de nuvem a partir de 25 regiões, então o script que você roda no notebook vira um teste distribuído sem cluster nem conta da AWS. A LoadFocus não roda scripts do Artillery, então para o Artillery os próprios comandos dele para AWS e Azure continuam sendo o jeito de escalar.&lt;/p&gt;
&lt;h2&gt;Para onde vão os resultados?&lt;/h2&gt;
&lt;p&gt;As duas ferramentas mostram um resumo no fim de cada execução e podem enviar métricas para outros sistemas, para painéis e alertas.&lt;/p&gt;
&lt;p&gt;Segundo o &lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;repositório&lt;/a&gt;, o k6 oferece estatísticas resumidas ou métricas detalhadas exportadas para o serviço que você escolher. O Artillery lista no &lt;a href=&quot;https://github.com/artilleryio/artillery&quot;&gt;repositório&lt;/a&gt; mais de 20 integrações de monitoramento, observabilidade e CI/CD. As duas conseguem alimentar os painéis que você já tem. Antes de decidir, confira se a saída exata de que você precisa está na lista, porque as duas listas mudam de uma versão para outra.&lt;/p&gt;
&lt;h2&gt;Qual delas você deve escolher?&lt;/h2&gt;
&lt;p&gt;Escolha o k6 quando quiser um único binário na CI, lógica de teste em JavaScript com controle de fluxo de verdade e thresholds no mesmo arquivo do teste. Ele também combina com times que já usam Grafana, porque a ferramenta open source e o serviço hospedado compartilham a mesma API de scripts.&lt;/p&gt;
&lt;p&gt;Escolha o Artillery quando o seu time escreve Node.js todo dia, quando um arquivo YAML curto é mais fácil para o resto do time revisar do que um script, ou quando você precisa de testes de navegador com Playwright e de Socket.IO na mesma ferramenta. O escalonamento serverless dele também é o caminho mais curto se a sua infraestrutura já vive na AWS e o Kubernetes não faz parte dela.&lt;/p&gt;
&lt;p&gt;Se ainda estiver em dúvida, escreva o mesmo teste de fumaça nas duas. Vinte linhas bastam para ver qual delas o seu time lê com mais facilidade numa revisão de código.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;O k6 é gratuito?&lt;/strong&gt;
Sim. O k6 é open source sob a licença AGPL-3.0 e roda de graça nas suas próprias máquinas. O Grafana Cloud k6 é um serviço hospedado separado, com preços próprios.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O Artillery é gratuito?&lt;/strong&gt;
Em grande parte. A maior parte do Artillery está sob a licença MPL-2.0, mas alguns módulos específicos de Azure usam uma licença source-available que exige licença comercial para uso em produção no Azure, segundo o repositório do projeto (conferido em 8 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A LoadFocus consegue rodar testes do Artillery?&lt;/strong&gt;
Não. A LoadFocus roda scripts k6 e JMeter. Para escalar um teste do Artillery além de uma máquina, use os comandos do próprio Artillery para AWS Lambda, Fargate ou Azure Container Instances na sua própria conta de nuvem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qual ferramenta consome menos recursos no gerador de carga?&lt;/strong&gt;
Não medimos isso nós mesmos, então não apontamos um vencedor. O projeto k6 diz que até máquinas mais simples conseguem simular muito tráfego, e a comparação justa é rodar o mesmo cenário com as duas ferramentas no seu próprio hardware.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-vs-k6/&quot;&gt;Gatling vs k6: simulações na JVM ou um único binário Go?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/how-to-run-a-load-test/&quot;&gt;Como fazer um teste de carga: guia passo a passo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/open-source-load-testing-tools/&quot;&gt;Ferramentas de teste de carga open source: seis opções&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/load-testing-in-github-actions/&quot;&gt;Teste de carga no GitHub Actions: guia prático&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/k6-vs-locust/&quot;&gt;k6 vs Locust: scripts JavaScript ou usuários Python?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/artillery-load-testing/&quot;&gt;Teste de carga com Artillery: análise da ferramenta Node.js&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Ferramentas de teste de carga open source: seis opções</title><link>https://loadtest.app/pt-br/open-source-load-testing-tools/</link><guid isPermaLink="true">https://loadtest.app/pt-br/open-source-load-testing-tools/</guid><description>Seis ferramentas de teste de carga open source analisadas: JMeter, k6, Gatling, Locust, Artillery e Vegeta, seus pontos fortes e quando escolher outra.</description><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: o loadtest.app é publicado pela LoadFocus, que vende um serviço de teste de carga abordado neste artigo.&lt;/p&gt;&lt;p&gt;Seis ferramentas de teste de carga open source muito usadas hoje são Apache JMeter, k6, Gatling, Locust, Artillery e Vegeta. Escolha pela linguagem em que o seu time escreve testes e pela forma como você precisa escalar: JMeter para a maior cobertura de protocolos, k6 ou Artillery para JavaScript, Gatling para a JVM, Locust para Python e Vegeta para verificações HTTP rápidas com taxa fixa.&lt;/p&gt;
&lt;p&gt;Para este artigo, não fizemos benchmark dessas ferramentas umas contra as outras. Os dados vêm do repositório e da documentação de cada projeto, conferidos em 8 de outubro de 2026, e as notas de &amp;quot;Bom para&amp;quot; são a nossa avaliação.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ferramenta&lt;/th&gt;
&lt;th&gt;Licença&lt;/th&gt;
&lt;th&gt;Testes escritos em&lt;/th&gt;
&lt;th&gt;Roda em&lt;/th&gt;
&lt;th&gt;Distribuir a carga entre máquinas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Apache JMeter&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Planos de teste montados numa interface gráfica&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;Modo remoto (cliente-servidor) embutido&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;AGPL-3.0&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;Um binário Go&lt;/td&gt;
&lt;td&gt;k6-operator no Kubernetes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;Apache 2.0 (alguns componentes sob licença enterprise)&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript, TypeScript&lt;/td&gt;
&lt;td&gt;JVM&lt;/td&gt;
&lt;td&gt;Edição Enterprise comercial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Embutido&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery&lt;/td&gt;
&lt;td&gt;MPL-2.0 (alguns módulos de Azure sob BSL)&lt;/td&gt;
&lt;td&gt;YAML, JavaScript, TypeScript&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;AWS Lambda, Fargate ou Azure ACI pela CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vegeta&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Linha de comando ou código Go&lt;/td&gt;
&lt;td&gt;Um binário Go&lt;/td&gt;
&lt;td&gt;Rodar várias instâncias&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;O Apache JMeter ainda vale a pena?&lt;/h2&gt;
&lt;p&gt;Vale, principalmente quando você precisa de protocolos além de HTTP. O JMeter cobre o leque mais amplo das seis e tem o maior volume de planos de teste e conhecimento acumulado.&lt;/p&gt;
&lt;p&gt;O JMeter é uma aplicação Java sob a licença Apache 2.0. A &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;lista de protocolos&lt;/a&gt; inclui HTTP e HTTPS, web services SOAP e REST, FTP, bancos de dados via JDBC, LDAP, mensageria JMS, e-mail e TCP puro. Você monta os planos de teste numa interface gráfica de desktop, roda os testes de verdade sem interface pela linha de comando, e o modo remoto cliente-servidor distribui um teste entre várias máquinas.&lt;/p&gt;
&lt;p&gt;Bom para sistemas com vários protocolos, times que já têm planos de JMeter e testers que preferem montar testes de forma visual. Escolha outra coisa quando o seu time quer testes como código puro, revisados como a aplicação, porque planos XML montados numa interface gráfica são difíceis de ler num pull request.&lt;/p&gt;
&lt;h2&gt;Quando o k6 é a escolha certa?&lt;/h2&gt;
&lt;p&gt;Quando o seu time escreve JavaScript e quer testes em código com limites de aprovação embutidos. Ele vem como um único binário Go, o que deixa a configuração na CI simples.&lt;/p&gt;
&lt;p&gt;O k6 está &lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;sob a licença AGPL-3.0&lt;/a&gt; e fala HTTP, WebSockets e gRPC, com um módulo de navegador para verificações de front-end. Os thresholds transformam uma meta, como um limite para o percentil 95, num código de saída diferente de zero para a CI. Para escalar, o &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt; roda testes distribuídos no Kubernetes, e a Grafana vende um serviço hospedado.&lt;/p&gt;
&lt;p&gt;Bom para desenvolvedores que mantêm testes de API junto do código e para pipelines de CI. Escolha outra coisa quando o seu time não quer JavaScript, ou quando a licença AGPL não combina com o jeito como você embute ou distribui a ferramenta. Comparamos as duas em detalhe em &lt;a href=&quot;https://loadtest.app/pt-br/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Para quem é o Gatling?&lt;/h2&gt;
&lt;p&gt;Para times na JVM que querem testes como código e um relatório HTML detalhado sem nada a mais. Ele também oferece um SDK de JavaScript e TypeScript sobre o mesmo motor.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;Gatling&lt;/a&gt; roda os usuários virtuais num motor não bloqueante construído sobre o Netty, então uma única máquina consegue gerar muita carga. As simulações são escritas em Java, Kotlin, Scala, JavaScript ou TypeScript e rodam por plugins de Maven, Gradle, sbt ou npm. A edição community está sob Apache 2.0 e cobre HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events e JMS, enquanto os componentes de gRPC, MQTT e GraphQL usam a licença enterprise do Gatling.&lt;/p&gt;
&lt;p&gt;Bom para times de Java e Scala e para quem quer relatórios completos sem ferramentas extras. Escolha outra coisa quando você precisa distribuir a carga entre máquinas só com a edição open source: gerar carga a partir de infraestrutura gerenciada ou privada é o papel do Gatling Enterprise, a edição comercial.&lt;/p&gt;
&lt;h2&gt;O Locust é uma boa escolha para times de Python?&lt;/h2&gt;
&lt;p&gt;É. Os testes do Locust são Python puro, então laços, condições e qualquer biblioteca Python funcionam como em código comum.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;Locust&lt;/a&gt; está sob a licença MIT e funciona por eventos com gevent, o que permite que um único processo atenda muitos usuários. Os testes rodam pela linha de comando ou por uma interface web que mostra ao vivo a vazão, os tempos de resposta e os erros, e o Locust distribui um teste entre várias máquinas por conta própria. HTTP vem embutido, e outros protocolos entram escrevendo Python.&lt;/p&gt;
&lt;p&gt;Bom para times de Python, cenários com lógica complexa e quem gosta de acompanhar um teste no navegador. Escolha outra coisa quando você quer testes declarativos no estilo de arquivo de configuração, ou quando um plugin pronto para um protocolo incomum importa mais do que escrever o seu.&lt;/p&gt;
&lt;h2&gt;Quando o Artillery faz sentido?&lt;/h2&gt;
&lt;p&gt;Quando o seu time vive no Node.js, gosta de cenários curtos em YAML ou quer testes de navegador com Playwright na mesma ferramenta dos testes de API.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/artilleryio/artillery&quot;&gt;Artillery&lt;/a&gt; está quase todo sob MPL-2.0, com alguns módulos de Azure sob uma licença source-available. Ele traz de fábrica HTTP, WebSocket e Socket.IO, ganha gRPC e Kinesis com &lt;a href=&quot;https://www.artillery.io/docs/reference/engines&quot;&gt;engines adicionais&lt;/a&gt;, e os comandos &lt;code&gt;run-lambda&lt;/code&gt; e &lt;code&gt;run-fargate&lt;/code&gt; distribuem um teste entre workers na sua própria conta da AWS. O comando &lt;code&gt;run-aci&lt;/code&gt; faz o mesmo no Azure Container Instances, com uma assinatura paga do Artillery para qualquer uso além de avaliação (conferido em 9 de outubro de 2026).&lt;/p&gt;
&lt;p&gt;Bom para times de Node.js, testes mistos de API e navegador, e empresas que já usam AWS. Escolha outra coisa quando você prefere não ter Node.js nos seus geradores de carga, ou quando testes grandes precisam rodar fora da AWS e do Azure.&lt;/p&gt;
&lt;h2&gt;Para que serve o Vegeta?&lt;/h2&gt;
&lt;p&gt;Para verificações HTTP rápidas, com taxa constante, pela linha de comando. Ele faz uma coisa só, enviar requisições a uma taxa fixa, e mantém essa coisa simples.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/tsenart/vegeta&quot;&gt;Vegeta&lt;/a&gt; é uma ferramenta Go sob a licença MIT que funciona como programa de linha de comando ou como biblioteca Go, com uma CLI pensada para se combinar com outras ferramentas Unix. Como ele mantém a taxa de requisições constante em vez de modelar usuários, responde melhor a perguntas como &amp;quot;o que acontece com 500 requisições por segundo?&amp;quot; do que reproduz jornadas de usuário.&lt;/p&gt;
&lt;p&gt;Bom para conferir rapidamente um endpoint, testes de capacidade com taxa fixa e scripts de shell. Escolha outra coisa quando você precisa de jornadas com vários passos, tempo de pensamento ou relatórios detalhados.&lt;/p&gt;
&lt;h2&gt;Onde entra um serviço hospedado como a LoadFocus?&lt;/h2&gt;
&lt;p&gt;Nenhuma dessas ferramentas precisa de um serviço hospedado, mas gerar carga grande ou espalhada geograficamente a partir das suas próprias máquinas dá trabalho. Um serviço hospedado assume a geração de carga e deixa os seus scripts como estão.&lt;/p&gt;
&lt;p&gt;A LoadFocus, que publica este site, é um desses serviços. Ela &lt;a href=&quot;https://loadfocus.com/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=open-source-load-testing-tools&quot;&gt;roda planos de teste JMeter existentes&lt;/a&gt; e &lt;a href=&quot;https://loadfocus.com/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=open-source-load-testing-tools&quot;&gt;scripts k6&lt;/a&gt; a partir de 25 regiões na nuvem. Ela não roda testes de Gatling, Locust, Artillery ou Vegeta, então para essas ferramentas valem as opções de escala descritas acima. Grafana Cloud k6 e Gatling Enterprise são os caminhos hospedados dos próprios fabricantes para k6 e Gatling.&lt;/p&gt;
&lt;h2&gt;Como escolher entre elas?&lt;/h2&gt;
&lt;p&gt;Parta da linguagem que o seu time já escreve e dos protocolos que você precisa testar, e depois veja como cada ferramenta escala. Isso costuma reduzir seis opções a uma ou duas.&lt;/p&gt;
&lt;p&gt;Depois escreva o mesmo teste curto nas suas duas favoritas. Ler os dois lado a lado resolve a maioria das discussões mais rápido do que qualquer tabela de recursos, e o nosso guia &lt;a href=&quot;https://loadtest.app/pt-br/how-to-run-a-load-test/&quot;&gt;Como fazer um teste de carga&lt;/a&gt; acompanha esse primeiro teste passo a passo.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Qual ferramenta de teste de carga open source é a mais fácil para começar?&lt;/strong&gt;
Para um único endpoint HTTP, Vegeta ou k6 dão um resultado em minutos, porque cada um é um único binário. Para jornadas com vários passos, escolha a ferramenta cuja linguagem de teste o seu time já escreve.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ferramentas de teste de carga open source conseguem rodar testes distribuídos?&lt;/strong&gt;
Conseguem, por caminhos diferentes: o JMeter tem um modo remoto embutido, o Locust distribui entre máquinas nativamente, o k6 usa o k6-operator no Kubernetes e o Artillery usa AWS Lambda, Fargate ou Azure Container Instances. No Gatling, gerar carga a partir de infraestrutura gerenciada ou privada faz parte da edição comercial Enterprise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O JMeter é melhor que o k6?&lt;/strong&gt;
Nenhum é melhor no geral. O JMeter cobre mais protocolos e combina com o desenho de testes em interface gráfica, enquanto o k6 combina com desenvolvedores que querem testes como código JavaScript na CI.&lt;/p&gt;
&lt;h2&gt;Leituras relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/http-benchmarking-tools/&quot;&gt;Ferramentas de benchmark HTTP: wrk, hey, oha, ab e mais&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/locust-load-testing/&quot;&gt;Teste de carga com Locust: análise da ferramenta Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/gatling-load-testing/&quot;&gt;Teste de carga com Gatling: análise da ferramenta JVM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/websocket-load-testing-tools/&quot;&gt;Ferramentas de teste de carga WebSocket: seis opções&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/k6-vs-artillery/&quot;&gt;k6 vs Artillery: qual ferramenta de teste de carga escolher&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/how-to-run-a-load-test/&quot;&gt;Como fazer um teste de carga: guia passo a passo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/azure-load-testing/&quot;&gt;Azure Load Testing: análise do serviço da Microsoft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/artillery-load-testing/&quot;&gt;Teste de carga com Artillery: análise da ferramenta Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/nbomber-load-testing/&quot;&gt;Teste de carga com NBomber: análise do framework .NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/tsung-load-testing/&quot;&gt;Teste de carga com Tsung: análise da ferramenta Erlang&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/pgbench/&quot;&gt;pgbench: benchmark e teste de carga do PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/pt-br/sysbench/&quot;&gt;Como usar o sysbench: benchmarks de CPU, disco e MySQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>