關於linux中的CONNTRACK_MAX和HASHSIZE要注意的地方
如果在壓力測試的時候,並發數增大,但無法完成測試,可以嘗試調整下參數:
vi /etc/sysctl.conf
在kernel2.6之前的添加項:
net.ipv4.netfilter.ip_conntrack_max = 655360
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
kernel2.6之後的添加項:
net.nf_conntrack_max = 655360 # net.nf_conntrack_max = 655360 也可以
net.netfilter.nf_conntrack_tcp_timeout_established = 1200
sysctl -p /etc/sysctl.conf
如果報錯:error: "net.nf_conntrack_max" is an unknown key 則需要使用modprobe載入ip_conntrack模塊,lsmod查看模塊已載入。
modprobe ip_conntrack
關於
--CONNTRACK_MAX 允許的最大跟蹤連接條目,是在內核內存中netfilter可以同時處理的“任務”(連接跟蹤條目)
--HASHSIZE 存儲跟蹤連接條目列表的哈西表的大小
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(但是可以手工設置成更大的值)