对于iptables来说,最核心的就是 ip_conntrack ,即最大连线数量决定了它的处理能力。你上面也提到过,通过 /proc/sys/net/ipv4/ip_conntrack_max 可以查到,默认这个值是随着内存大小的变更而变动的,其计算公式为: CONNTRACK_MAX = RAMSIZE(in bytes) / 16384 / (x / 32) ,其中 x 为系统的位数,如32位的系统就填写32,64位的系统就填写64。
ok,现在我们就可以套用以下,假设32位的系统拥有512M内存:
ip_conntrack_max = 512*1024*1024/16384/1 = 32768得出的这个32768是何意思呢——即 iptables 最大可同时跟踪的连线数量!不过当内存超过768M时好像公式就失效了(可能还有其他计算方法,我还没搞清),但这并不影响 ip_conntrack 这个核心模块的使用。
当默认这值不能满足需要时该如何呢?easy!只要手工载入 ip_conntrack 这个模块,并修改其参数即可,如下:
modprobe ip_conntrack hashsize=16384
这么设置什么意义呢?如果我们需要追踪连线的数量为:2^17 = 131072,此时 hashsize = 131072 / 8 = 16384,此时/proc/sys/net/ipv4/ip_conntrack_max=131072了!问题接着来了,哪此时的变更引起的内存消耗呢?让我们计算一下:ip_conntrack追踪每个连线消耗的内存为228byete(测试用的 ip_conntrack 版本为 v2.4),算一下131072的上限消耗的内存为:
131072 * 228 / 1024 / 1024 = 28.5M
因此,我觉得10万并发处理量也是很有可能的!
2009年4月13日星期一
订阅:
评论 (Atom)