O baseline
O burst corrigido é o que se deve comparar contra trabalhos futuros: 752 msg/s entregues, 98,9% de
sucesso, 26,3 s para 20 000 mensagens.
O router nunca foi o gargalo
fireflo_router_queue marcou 0 durante todo o burst de 20 000 mensagens e teve pico de 18 em
toda outra execução.
Mensagens estavam sendo roteadas tão rápido quanto chegavam; depois se acumulavam na fila do
worker do fornecedor, que atingiu 7 987. Tudo que limitava o throughput estava a jusante do
código de roteamento.
A linha única que cortou perda em 92%
O primeiro burst perdeu 2 528 mensagens, cada umamessage.dropped reason=maxAttempts attempts=20 limit=20, com 151 985 tentativas de submit para 24 000 mensagens aceitas — cerca de seis cada.
A conexão do fornecedor nunca caiu. Isto não era conectividade. O SMSC de teste parou de
responder rápido o bastante sob burst, submits expiraram, o worker fez retry, e mensagens que usaram
todas as 20 tentativas de roteamento foram abandonadas.
Re-executando com transceivers = 1 — mesmas mensagens, mesma janela, mesmas threads de router:
A fila ainda atingiu 8 042 e o router ainda nunca ficou atrás, então a forma da execução foi
idêntica. O que mudou é que uma sessão única não provoca o que quer que o SMSC de teste faça quando
over-sessioned.
A alavanca que parecia óbvia e não fez nada
Uma versão anterior do baseline dizia que o fix para o 1,1% residual era aumentaroutSms.routing.maxAttempts e outSms.routing.retryBackoffMillis, argumentando que uma mensagem
sobrevive apenas cerca de dois segundos de um fornecedor não aceitando.
Isso foi medido e está errado.
Sem melhoria, e marginalmente mais lento. Mais retries contra um fornecedor que não está aceitando
é mais carga sobre a coisa já recusando.
O que consertou foi
vendor1.tps = 300 — pacear o gateway ao que o fornecedor realmente
conseguia receber. Zero perdidas, zero ESME_RMSGQFUL, e exatamente 1,00 submits por mensagem.
O que medir no seu próprio deployment
1
Fila do router contra fila do fornecedor
Router estável, fila do fornecedor crescendo = o fornecedor é o limite. Ambas crescendo =
ingress ultrapassando o roteamento.
2
Submits por mensagem
1,00 é saudável. Qualquer coisa materialmente acima disso são retries, e retries são capacidade
de fornecedor desperdiçada.
3
Contagem de ESME_RMSGQFUL
Não-zero significa que você está empurrando mais forte do que a outra ponta aceita.
4
Perda no teto de tentativas
message.dropped reason=maxAttempts é o estado final de tudo acima.Ressalvas
- Um SMSC de teste não é uma operadora. As duas execuções de burst foram limitadas pelo simulador, não pelo FireFlo.
- A variação entre execuções foi maior que o efeito da configuração de janela. Aumentar
windowSize100 → 500 e transceivers 1 → 4 produziu 337 e 910 msg/s em duas execuções de configuração idêntica, contra 500 e 840 do baseline. Esta bancada não pode resolver esse efeito — o que é uma afirmação sobre a medição, não uma evidência de que a janela não importa. message.trace.mode = allproduziu 226 MB de log para uma execução de 20 000 mensagens. Útil para uma investigação, ruinoso como padrão.
Relacionado
Queues
Distinguindo um problema de volume de um problema de fornecedor.
Generating traffic
Produzindo carga para medir contra.