这篇文档说明了对netfilter conntrack(更有NAT)性能调整时您必须知道的一些事情。

  本文档最新版能够在下面这个地址找到:

  http://www.wallfire.org/misc/netfilter_conntrack_perf.txt

  ------------------------------------------------------------------------------

  这里我们能够调整两个参数:

  -允许的最大跟踪连接条目,在这篇文档中我们叫作CONNTRACK_MAX

  -存储跟踪连接条目列表的哈西表的大小,在这篇文档中我们叫做HASHSIZE(下面是这个结构的描述)

  CONNTRACK_MAX是在内核内存中netfilter能够同时处理的“任务”(连接跟踪条目)。

  一个跟踪连接的条目是存储在一个链接起来的列表的一个节点上,每个列表都是个哈西表的元素。因此每个哈西表的条目(也叫一个桶-bucket)包含了一个链接起来的跟踪连接条目。

  要访问一个特定包的跟踪连接条目,内核必须:

  -针对一个包中的已定义的一些字符计算哈西值。这是个不间断的计算。

  这个哈西值就会被当作哈西表的索引来使用,而跟踪连接条目的列表就存储在这里。

  -反复的查看链接列表中的跟踪连接条目以找到匹配的那一个。

  这是个耗资源的操作,依赖于列表的大小(也依赖于列表中被操作的跟踪连接条目的位置)。

  哈西表包含了HASHSIZE大小的链接条目。当条目满的时候(总的跟踪连接条目数达到了CONNTRACK_MAX),理想状态下,每个列表(在最优化的条件下)将包含大约CONNTRACK_MAX/HASHSIZE的条目数。

  不管您是否有连接,哈西表都将占用一个固定大小的非交换内核内存。但是最大连接跟踪条目会检测最多能够存储多少条目(globally into the

  linked lists),也就是说他们最多能够占用多少的内核内存。

  这篇文档将给您一些关于为了达到最好的netfilter conntracking/NAT系统性能,如何调优HASHSIZE和CONNTRACK_MAX值的提示。

  CONNTRACK_MAX和HASHSIZE的默认值

  ============================================

  一般来说,CONNTRACK_MAX和HASHSIZE都会配置在“合理”使用的值上,依据可使用的RAM的大小来计算这个值。

  CONNTRACK_MAX的默认值

  ------------------------------

  在i386架构上,CONNTRACK_MAX = RAMSIZE (以bytes记) / 16384 =

  RAMSIZE (以MegaBytes记) * 64,

  因此,一个32位的带512M内存的PC在默认情况下能够处理512*1024^2/16384 = 512*64 = 32768个并发的netfilter连接。

  但是真正的公式是:

  CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (x / 32)

  这里x是指针的bit数,(例如,32或64bit)

  请注意:

  -默认的CONNTRACK_MAX值不会低于128

  -对于带有超过1G内存的系统,CONNTRACK_MAX的默认值会被限制在65536(但是能够手工配置成更大的值)

  HASHSIZE的默认值

  -------------------------

  通常,CONNTRACK_MAX = HASHSIZE * 8。这意味着每个链接的列表平均包含8个conntrack的条目(在优化的情况并且CONNTRACK_MAX达到的情况下),每个链接的列表就是个哈西表条目(一个桶)。

  在i386架构上,HASHSIZE = CONNTRACK_MAX / 8 =

  RAMSIZE (以bytes记) / 131072 = RAMSIZE (以MegaBytes记) * 8。

  举例来说,一个32位、带512M内存的PC能够存储512*1024^2/128/1024 =

  512*8 = 4096 个桶(链接表)

  但是真正的公式是:

  HASHSIZE = CONNTRACK_MAX / 8 = RAMSIZE (以bytes记) / 131072 / (x / 32)

  这里x是指针的bit数,(例如,32或64bit)

  请注意:

  -默认HASHSIZE的值不会小于16

  -对于带有超过1G内存的系统,HASHSIZE的默认值会被限制在8192(但是能够手工配置成更大的值)

  读取CONNTRACK_MAX和HASHSIZE

  ==================================

  现在通过/proc文档系统我们能够在运行时读取CONNTRACK_MAX的值。

  在Linux kernel 2.4.23版本前,使用:

  # cat /proc/sys/net/ipv4/ip_conntrack_max

  在Linux kernel 2.4.23版本后,使用:

  # cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max

  (旧的 /proc/sys/net/ipv4/ip_conntrack_max是不建议使用的!)

  当前的HASHSIZE总是能够在syslog信息中找到(对任何一个内核版本),桶(也就是HASHSIZE)的数目是在ip_conntrack初始化的时候显示出来的。

  对于linux内核2.4.24以后,当前的HASHSIZE值能够在运行时使用下面的命令读取:

  # cat /proc/sys/net/ipv4/netfilter/ip_conntrack_buckets

  修改CONNTRACK_MAX和HASHSIZE

  ====================================

  默认的CONNTRACK_MAX和HASHSIZE的值都会因主机的不同而不同,但您能够在只做防火墙的高负载的系统上增加他们。

  因此CONNTRACK_MAX和HASHSIZE值假如需要的话能够手工更改。

  读取桶是个连续性的操作(我们的兴趣在于得到一个哈西列表),请记得内核需要不停的遍历一个链接的列表去查找一个跟踪连接条目。因此一个链接列表(CONNTRACK_MAX/HASHSIZE的值在优化的状态下并且达到上限)的平均值不能配置太大。这个比值默认值是8(当值是自动计算的时候)。

  在系统有足够的内存并且性能真的很重要的时候,您能够试着使平均值是个跟踪连接条目配一个哈西桶,这意味着HASHSIZE = CONNTRACK_MAX。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!