Nginx Setting server_names_hash_max_size and server_names_hash_bucket_size

Key takeaways

  • The default value of server_names_hash_bucket_size depends on the size of the processor’s cache line
  • If a large number of server names are defined, or unusually long server names are defined, tuning the server_names_hash_max_size and server_names_hash_bucket_size directives at the http level may become necessary.
  • If the default value of server_names_hash_bucket_size used at the server is not enough, means nginx complained with could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32, the directive value should be increased to the next power of two (e.g. in this case to 64).
  • If a large number of server names are defined, and nginx complained with the following error could not build the server_names_hash, you should increase either server_names_hash_max_size: 512 or server_names_hash_bucket_size: 32. try to set server_names_hash_max_size to a number close to the number of server names. Only if this does not help, or if nginx’s start time is unacceptably long, try to increase server_names_hash_bucket_size.
  • The hash bucket size parameter is aligned to the size that is a multiple of the processor’s cache line size

Общая рекомендация заключается в том, чтобы оба значения были как можно меньше.
Если nginx жалуется, сначала увеличьте max_size, пока он жалуется. Если число превышает какое-то большое число (например, 32769), увеличьте значение bucket_size до значения, кратного значению по умолчанию на вашей платформе, до тех пор, пока оно жалуется. Если он больше не жалуется, уменьшите max_size назад до тех пор, пока он не будет жаловаться. Теперь у вас есть лучшая настройка для вашего набора имен серверов (каждый набор имен серверов может нуждаться в другой настройке).
Больше max_size означает больше потребляемой памяти (один раз на одного работника или сервер, пожалуйста, прокомментируйте, если знаете).
Чем больше bucket_size, тем больше циклов ЦП (для каждого поиска доменного имени) и больше передач из основной памяти в кэш.
Параметр max_size напрямую не связан с количеством имен серверов, если число серверов удваивается, вам может потребоваться увеличить размер max_size в 10 раз или даже больше, чтобы избежать коллизий. Если вы не можете избежать их, вы должны увеличить bucket_size.
Говорят, что bucket_size увеличивается до следующей степени двух, исходя из исходного кода, который я бы оценил, этого должно быть достаточно, чтобы сделать его кратным значению по умолчанию, это должно поддерживать оптимальную передачу в кэш.
Среднее доменное имя должно умещаться в 32 байта, даже с учетом издержек хеш-массива. Если вы увеличите размер bucket_size до 512 байт, он будет содержать 16 доменных имен с конфликтующим хеш-ключом. Это не то, что вы хотите, если происходит столкновение, он ищет линейно. Вы хотите иметь как можно меньше столкновений.
Если у вас max_size меньше 10000 и мало bucket_size, вы можете столкнуться с длительным временем загрузки, потому что nginx будет пытаться найти оптимальный размер хеша в цикле.
Если у вас max_size больше 10000, будет выполнено «только» 1000 циклов, прежде чем он будет жаловаться.

https://gist.github.com/muhammadghazali/6c2b8c80d5528e3118613746e0041263

 

do changes in /etc/security/limits.conf require a reboot?

 

o temporarily set the open files limit for the user you are currently logged in under (e.g. ‘root’):You can also use the ulimit command to change the values in your current shell. However, hard limits can only be adjusted downwards unless you’re root.

Example:

# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 62449
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

To change the nofile to 94000 you can do:

ulimit -n 94000

Leave a Comment

Your email address will not be published. Required fields are marked *

Shares