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

Wil*_*lem 5 performance nginx memory-usage

我有 1M 静态重写规则并使用此映射配置。如何确定的最佳值map_hash_max_sizemap_hash_bucket_size?我想优化内存消耗。关于这一点的文档非常少。

别人在 Nginx 论坛上问过,但没有回应。

小智 5

我对server_names_hash_bucket_sizeand的源代码进行了分析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和 small bucket_size,则可能会遇到很长的加载时间,因为 nginx 会尝试在循环中找到最佳哈希大小。
  • 如果您的数量max_size大于 10000,则在它会抱怨之前将“仅”执行 1000 次循环。


Dan*_*scu 2

关于哈希值和存储桶大小的 nginx 文档非常模糊。这些数字是用字节表示的吗?参赛作品?

我有一个 128,592 字节的映射文件,其中包含 1351 个条目。适用于本例的最小值为:

map_hash_bucket_size 128;
map_hash_max_size 45948;
Run Code Online (Sandbox Code Playgroud)

我不知道这些数字之间有什么关系。我通过将存储桶大小增加到 128,然后对最大大小进行二分搜索来得到它们。