最新消息:

LVS的hash size(zz)

技术相关 admin 2708浏览

LVS(Director)的连接跟踪表(也称Hash表),保存了来自客户端的每个新建连接。这么做的主要目的是为了保存足够的信息,使得来自同一个客户端的后续的数据报能通过同一个网络连接发送到相同的真实服务器上(RealServer).每个连接的信息包括CIP,VIP,目标IP,cport(clientPort),dport,协议类型等,还包括lvs的一些其他信息,比如定时器、连接状态标记、锁等等。这些都在include/net/ip_vs.h的struct ip_vs_conn里面定义.
这个结构的大小是128+8=136字节。每条记录用一个ip_vs_conn结构表示,这个结构使用了Linux里面的典型数据结构struct list_head构造双向链表,使得所有的记录以链表形式链接起来。

  • struct list_head 的大小为8个字节(两个int :pre,*next);
  • struct ip_vs_conn里面的其他元素就是每个连接的具体信息,一共128字节。

所以,hash表里面的每条记录(每个连接),占据136字节内存。

hash table里面表长的仅仅是每个链的头指针(list_head):
hash size 设置为10BITS的话,buckets = 1<<10 = 1024,消耗的内存
1024 * 8 / 1024 = 8KB

ipvsadm的启动信息里面显示的信息:
IPVS: Connection hash table configured (size=1024, memory=8Kbytes)

连接跟踪表里面的每行称为hash bucket(hash桶),每列称为一个连接跟踪记录。每行(bucket)可以有N列(也就是N条连接记录),这个N是无限的,取决于内存大小。

LD(Director)在每接到一个包后都会在hash表里面进行查找匹配,这个查找要求非常快速。LVS使用hash技术来决定先查找哪个bucket。每行(bucket或者row)的记录数(column)越少,查询速度就越快。LVS程序员建议每行16-20条记录。

2.6内核可以在编译的时候配置IP_VS_TAB_BITS累设置hash桶的大小(buckets).默认是12,也就是有2^12 = 4096个bucket。这个是LD用来加速链接记录查询的hash 桶(buckets)的大小,而不是LD支持的最大并发连接数的大小。(最大连接数仅仅受限于LD的内存)

显示连接跟踪表信息:

ipvsadm

转载请注明:Kermit的网站 » LVS的hash size(zz)