Posts Cota para Uso de Tempo em Threads
Post
Cancel

Cota para Uso de Tempo em Threads

Esta é uma cota introduzida pela KIP-124, e pode ser confusa no primeiro contato.

Ao ler a proposta de melhoria existem exemplos de valores para request_percentage, como o seguinte:

1
2
3
4
5
6
bin/kafka-configs --zookeeper localhost:2181 \
  --alter \
  --add-config 'request_percentage=200' \
  --entity-type users

# 'request_percentage=200' ?????
  • 200%?

O entendimento comum por pocentagem é um valor entre 0 e 100, que é relavito a qualquer notação numérica, seja ela de tempo ou volume de dados.

Exemplos:

  • 20% de 1 segundo é o equivalente a 200 milissegundos
  • 10% de 100 bytes é o equivalante a 10 bytes

Bem, mas a cota request_percentage utiliza notação absoluta. E neste artigo existem os detalhes sobre como utilizá-la de maneira efetiva, algo importante se um cluster Apache Kafka® receberá múltiplos tenants.

A Cota

A primeira vista parece um erro de digitação encontrar na documentação oficial um exemplo para request_percentage com o valor 200. Mas ele está lá propositalmente. E se compreende isso ao ler seção Rejected Alternatives.

Especificamente a opção Use request time percentage across all threads instead of per-thread percentage for quota bound.

Ela explica porque foi implementada uma solução com valor absoluto. Que, resumindo, foi escolhida para evitar ajustes automáticos quando num.io.threads ou num.network.threads são modificados.

Absolute quota was chosen to avoid automatic changes to client quota values when num.io.threads or num.network.threads is modified.

Isso quer dizer que 200% está correto e significa uma cota em duas threads, ou seja, 100% da janela de tempo para uso em cada uma.

Entendedo a Conta da Capacidade Total

A capacidade total é expressada pela seguinte formula:

1
(num.io.threads + num.network.threads) * 100%
  • (número de threads para E/S + número de threads para rede) * cem porcento

Então, se num.io.threads=8 e num.network.threads=3 haverá a seguinte capacidade:

1
2
3
(8 + 3) * 100
11 * 100
1100

Capacidade total de 1100%. Sim, você leu correto: mil e cem porcento

Ou seja, a capacidade total é a soma dos 100% da janela de tempo que cada thread.

E normalmente as configurações de threads é alinhada com o número total de núcleos de processamente, assim como a própria KIP-124 descreve. Então se existirem 32 núcleos disponíveis a conta ficará assim:

1
2
3
(32 + 32) * 100
64 * 100
6400

Isso mesmo!

  • 6400%
  • seis mil e quatrocentros porcento

Naturalmente, é 100% da janela de tempo configurada na propriedade quota.window.size.seconds.

Na Prática

Então se existe as seguinte configuração:

  • capacidade total: 6400
  • request_percentage: 200
  • quota.window.size.seconds: 1

Significa que o client.id ou user em questão pode utilizar 1s em duas threads ao mesmo tempo. E ao execeder isso seu throttling iniciará.

Quantidade fixa tenants

Se existem 50 tenants e busca-se distribuir igualitariamente a capacidade total, então:

1
2
request_percentage=6400 / 50
request_percentage=128

Então para cada client.id ou user, request_percentage será igual a 128%. O que dá direito ao uso de duas threads, uma delas 100% da janela de tempo e 28% (praticamente 1/3) em outra, simultaneamente.

Quantidade variável de tenants

Quando a quantidade de tenants e variável e mesmo assim deseja-se distribuir igualitariamente a capacidade total, será necessário ajustar o request_percentage de todos sempre que um novo for adicionado.

Se existem 100 tenants, a distribuição será a seguinte:

1
2
request_percentage=6400 / 100
request_percentage=64
  • para cada client.id ou user, request_percentage será igual a 64%.

Ao adicionar mais 15 tenants, aos 100 que existiam, haverá o seguinte:

1
2
request_percentage=6400 / 115
request_percentage=55.7

Então todos os 115 tenants deverão ter seu request_percentage ajustado para 55.7%.

Bônus

Este é um script para suportar o ajuste igualitário em um cluster Apache Kafka® com quantidade variável de tenants.

Faça o download

Depois de executá-lo, além da capacidade total disponível e o valor de request_percentage por tenant, também será exibido o comando Kafka CLI para atualização do valor.

Exemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#                       <kafka>         <tenants>
./request_percentage.sh localhost:19092 120

broker.id...................: 30
num.io.threads..............: 8
num.network.threads.........: 3
quota.window.size.seconds...: 1

capacidade total............: 1100
tenants.....................: 120

request_percentage p/ tenant: 9.2

Comando atualização cota para user default:
  kafka-configs.sh --bootstrap-server localhost:19092 --alter --add-config 'request_percentage=9.2' --entity-type users --entity-default

Comando atualização cota para client.id default:
  kafka-configs.sh --bootstrap-server localhost:19092 --alter --add-config 'request_percentage=9.2' --entity-type clients --entity-default

Photo by Jason Richard on Unsplash

Este post é licenciado sob CC BY 4.0 pelo autor.