在sysctl.conf中的ipv6 max_addresses(Debian 6)

我想给Debian 6主机分配任意数量的IPv6地址,但是我看到下面的设置,并想知道设置更高的后果是什么,或者这个设置是否会影响系统性能,从而达到极限。

net.ipv6.conf.eth0.max_addresses=16 

Linode和其他一些网站build议设置为32,如果你需要更多的地址分配给一个接口,但为什么32? 如果我愿意,我可以分配64,128,5000个IPv6地址吗? 我这样做是为了避免在一定程度上基于名称的Web服务托pipe,以便我可以将每个站点绑定到不同的IP地址的端口80。

可以/我应该net.ipv6.conf.eth0.max_addresses=3000 ? 为什么或者为什么不?

由于效率和时间的复杂性。 基本上,我们应该保持路由表的简短(但在不同的级别上),因为对于接收到的每个数据包,系统需要遍历整个路由表,寻找匹配来知道如何路由该数据包。 这会导致路由表长度的平均值和最坏情况下的O(n)查找时间。

接口地址也有类似的问题。 该接口可能必须检查通过电缆的每秒数千个数据包,以确定哪些数据包指定给该主机。 简单的方法是:对于每个到达的数据包,将其目标地址与分配给该接口的每个地址范围进行比较。 请注意,这是另一个连续的任务,每个数据包需要O(n),这意味着:如果每秒必须处理数千个数据包,则会花费处理时间。

另外还有一个问题:当你为本地链接添加越来越多的地址时,每个新地址都会增加链路中所有其他主机在邻居(ARP)表中所需的内存。 这不是一个大问题(ARP代理也是这样),但是对于整个本地networking的性能还是有一些影响的。

这使得将大量地址分配给单个主机是一个不太好的主意。 像16或32这样非常保守的限制就足够好了,同时也提醒pipe理员这些成本。

如果您需要将大量地址路由到一台机器,则应该创build一个子网。 在一个子网内select连续的地址,并将整个子网路由到该机器。 然后你使用某种forms的内部路由或一些iptables / route技巧来完成机器内部的所有工作。 这基本上是我们在单个物理服务器上托pipe大量虚拟机时所做的。