我有 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_size
10 倍甚至更多以避免碰撞。如果无法避免,则必须增加bucket_size
。bucket_size
据说会增加到下一个 2 的幂,从源代码来看,我判断它应该足以使其成为默认值的倍数,这应该可以使传输到缓存达到最佳状态。- 大小
bucket_size
取决于密钥的长度。如果平均密钥大小为 32 字节(包含哈希数组开销),则增加到bucket_size
512 字节意味着它可以容纳 16 个有冲突哈希密钥的密钥。如果发生冲突,这不是您想要的结果它线性搜索. 您希望尽可能减少碰撞。 - 如果你有
max_size
少于 10000并且很小bucket_size
,您可能会遇到较长的加载时间,因为 nginx 会尝试在循环中找到最佳哈希大小。 - 如果有
max_size
大于 10000 的数字,那么在出现抱怨之前“仅”会执行 1000 次循环。