Nginx:1M 地图的最佳 map_hash_max_size 和 map_hash_bucket_size?

Nginx:1M 地图的最佳 map_hash_max_size 和 map_hash_bucket_size?

我有 1M 静态重写规则并使用此地图配置。如何确定map_hash_max_size和的最佳值map_hash_bucket_size?我想优化内存消耗。文档关于这一点,非常简单。

其他人在 Nginx 论坛上提问,沒有回应。

答案1

server_names_hash_bucket_size我对和的源代码进行了分析server_names_hash_max_size,我猜测它使用与地图相同的哈希值。

以下是我的回答

  • 一般建议是使这两个值尽可能保持较小。
  • 如果 nginx 抱怨,max_size则先增加,直到它抱怨为止。如果数字超过某个大数字(例如 32769),则增加到bucket_size您平台上默认值的倍数,直到它抱怨为止。如果它不再抱怨,则减少,max_size直到它不再抱怨为止。现在,您已经为您的密钥集做好了最佳设置(每组密钥可能需要不同的设置)。
  • 越大max_size意味着消耗的内存越多(每个工作者或服务器一次,如果您知道请评论)。
  • 更大bucket_size意味着更多的 CPU 周期(对于每个键查找)和更多的从主内存到缓存的传输。
  • max_size与按键数量没有直接关系,如果按键数量增加一倍,则可能需要增加max_size10 倍甚至更多以避免碰撞。如果无法避免,则必须增加bucket_size
  • bucket_size据说会增加到下一个 2 的幂,从源代码来看,我判断它应该足以使其成为默认值的倍数,这应该可以使传输到缓存达到最佳状态。
  • 大小bucket_size取决于密钥的长度。如果平均密钥大小为 32 字节(包含哈希数组开销),则增加到bucket_size512 字节意味着它可以容纳 16 个有冲突哈希密钥的密钥。如果发生冲突,这不是您想要的结果它线性搜索. 您希望尽可能减少碰撞。
  • 如果你有max_size 少于 10000并且很小bucket_size,您可能会遇到较长的加载时间,因为 nginx 会尝试在循环中找到最佳哈希大小。
  • 如果有max_size大于 10000 的数字,那么在出现抱怨之前“仅”会执行 1000 次循环。

答案2

nginx 文档中有关 hash 和桶大小太模糊了。这些数字是以字节数表示的吗?条目数?

我有一个 128,592 字节地图文件有 1351 个条目。适用于此案例的最小值为:

map_hash_bucket_size 128;
map_hash_max_size 45948;

我不知道这些数字之间的关系。我通过将存储桶大小增加到 128,然后进行二进制搜索来找到最大大小,从而得出了这些数字。

相关内容