dmesg, syslog に "nf_conntrack: table full, dropping packet." とエラーが出るのを回避する

haproxyを検証しようとしていて起きた。

  • LB:
    • os: centos6
    • httpd: haproxy epel 1.4.22
  • server
    • os: centos6
    • httpd: nginx epel 1.0.15


仮想OS上のCentOS6のhaproxy目掛けてhttp_load をぶっこんだところ、syslogに大量のエラーが出た。

__ratelimit: 10662 callbacks suppressed
nf_conntrack: table full, dropping packet.
nf_conntrack: table full, dropping packet.
nf_conntrack: table full, dropping packet.
nf_conntrack: table full, dropping packet.
nf_conntrack: table full, dropping packet.

名前からするとiptablesのmoduleぽい。

# lsmod  | grep nf_conntrack
nf_conntrack_ipv4       9506  3 iptable_nat,nf_nat
nf_conntrack           79453  4 ipt_MASQUERADE,iptable_nat,nf_nat,nf_conntrack_ipv4
nf_defrag_ipv4          1483  1 nf_conntrack_ipv4

メモリ消費量増えそうな気がするけど、/procのnf_conntrack_max の数値を増やしたら、エラーは出なくなって、http_load のrpsも上がった。

net.netfilter.nf_conntrack_maxとnet.nf_conntrack_maxは連動していて、どちらかを変更すればもう一方も変更されるみたい。念の為systl.confには両方書いておいた。

# sysctl -a | grep nf_conntrack_max
net.netfilter.nf_conntrack_max = 15704
net.nf_conntrack_max = 15704
# vim /etc/sysctl.conf 
#### 追加
net.netfilter.nf_conntrack_max  = 50000
net.nf_conntrack_max = 50000

abの結果

/proc (/etc/sysctl.conf 変更前)
$ http_load -parallel 5000 -seconds 5 url.txt   
15976 fetches, 2063 max parallel, 15480 bytes, in 5.00174 seconds
0.968953 mean bytes/connection
3194.09 fetches/sec, 3094.92 bytes/sec
msecs/connect: 183.26 mean, 4175.3 max, 0.105 min
msecs/first-response: 133.948 mean, 3378.41 max, 0.369 min
HTTP response codes:
        code 200 -- 3096
/proc (/etc/sysctl.conf 変更後)
$ http_load -parallel 5000 -seconds 5 url.txt   
33529 fetches, 2063 max parallel, 32485 bytes, in 5.0001 seconds
0.968863 mean bytes/connection
6705.67 fetches/sec, 6496.87 bytes/sec
msecs/connect: 295.982 mean, 3901.65 max, 0.111 min
msecs/first-response: 195.308 mean, 1350.56 max, 0.347 min
HTTP response codes:
        code 200 -- 6497