Nginx: ótimos map_hash_max_size e map_hash_bucket_size para o mapa 1M?

4

Eu tenho regras de reescrita estática de 1 milhão e uso esta configuração de mapa . Como determinar os valores ideais para map_hash_max_size e map_hash_bucket_size ? Eu quero otimizar o consumo de memória. A documentação é muito pequena sobre isso.

Alguém mais perguntou no fórum Nginx , mas sem resposta.

    
por Willem 03.07.2015 / 12:52

2 respostas

1

Eu fiz uma análise do código-fonte para server_names_hash_bucket_size e server_names_hash_max_size , acho que ele usa o mesmo hash do mapa.

Aí vem uma cópia generalizada da minha resposta :

  • A recomendação geral seria manter os dois valores o menor possível.
  • Se reclamações do nginx aumentam max_size primeiro, desde que se queixem. Se o número exceder um número grande (32769, por exemplo), aumente bucket_size para múltiplos de valor padrão em sua plataforma, desde que se queixem. Se não reclamar mais, diminua max_size desde que não reclame. Agora você tem a melhor configuração para o seu conjunto de chaves (cada conjunto de chaves pode precisar de configuração diferente).
  • Maior max_size significa mais memória consumida (uma vez por funcionário ou servidor, por favor, comente se você souber).
  • Maior bucket_size significa mais ciclos de CPU (para cada consulta de chave) e mais transferências da memória principal para o cache.
  • max_size não está relacionado ao número de chaves diretamente, se o número de chaves duplicar, você pode precisar aumentar max_size 10 vezes ou até mais para evitar colisões. Se você não pode evitá-los, você tem que aumentar bucket_size .
  • Diz-se que bucket_size é aumentado para a próxima potência de dois, a partir do código-fonte que eu julgaria que deveria ser suficiente para torná-lo múltiplo do valor padrão, isso deve manter as transferências em cache ideais.
  • O tamanho de bucket_size depende do tamanho das suas chaves. Se o tamanho médio da chave for de 32 bytes (com sobrecarga de matriz de hash), o aumento de bucket_size a 512 bytes significaria que ele pode acomodar 16 chaves com chave hash de colisão. Isso não é algo que você quer, se a colisão acontecer ele procura linearmente . Você quer ter menos colisões possíveis.
  • Se você tem max_size menor que 10000 e pequena bucket_size , você pode se deparar com um longo tempo de carregamento porque o nginx tentaria encontrar o tamanho de hash ideal em um loop.
  • Se você tiver max_size maior que 10000, haverá "apenas" 1000 loops realizados antes de reclamar.
por 23.01.2018 / 11:23
0

A documentação do nginx no hash e no tamanho do intervalo é terrivelmente vaga. Esses números são expressos em bytes? Entradas?

Eu tenho um arquivo de mapa de 128.592 bytes com 1351 entradas. Os valores mínimos que funcionaram para este caso são:

map_hash_bucket_size 128;
map_hash_max_size 45948;

Eu não sei qual é a relação entre esses números. Cheguei nelas aumentando o tamanho do balde para 128, depois fazendo uma pesquisa binária pelo tamanho máximo.

    
por 16.10.2015 / 03:19