我有1M静态重写规则并使用this map configuration.如何确定map_hash_max_size和map_hash_bucket_size的最佳值?我想优化内存消耗. documentation对此非常小.
别人asked it on the Nginx forum,但没有回应.
这是answer的通用副本:
>一般建议是保持两个值尽可能小.
>如果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个密钥.如果碰撞发生在it searches linearly,这不是你想要的东西.你希望尽可能减少碰撞.
>如果你有max_size less than 10000和小bucket_size,你会遇到很长的加载时间,因为Nginx会尝试在循环中找到最佳的散列大小.
>如果你的max_size大于10000,那么在它抱怨之前会执行“仅”1000个循环.