Por que o nf_conntrack_count continua aumentando?

5

Estou usando o Ubuntu 11.10 & nginx. Meu servidor está fazendo atualmente cerca de 350 rps (essa é a carga que está chegando). Eu uso o iptables para garantir que as conexões em certas portas sejam restritas apenas às caixas que possuo.

Eu notei que nf_conntrack_count continua aumentando. Não importa o que eu envio nf_conntrack_max para, nf_conntrack_count corresponde a ele em um dia. Além disso, não corresponde ao que netstat -tn me diz. Aqui estão os números:

$ sudo sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max
net.netfilter.nf_conntrack_count = 649715
net.netfilter.nf_conntrack_max = 650000


$ netstat -tn | awk '{n[$6]++} END { for(k in n) { print k, n[k]; }}'
CLOSING 6
ESTABLISHED 2933
FIN_WAIT1 116
FIN_WAIT2 3447
LAST_ACK 35
SYN_RECV 79
TIME_WAIT 27141


$ sudo conntrack -L | awk '{n[$4]++}; END {for(k in n) { print k, n[k]; }}'
conntrack v1.0.0 (conntrack-tools): 648611 flow entries have been shown.
CLOSE 443
CLOSE_WAIT 2210
ESTABLISHED 645529
FIN_WAIT 45
LAST_ACK 50
SYN_RECV 74
TIME_WAIT 259

Eu não quero continuar aumentando nf_conntrack_max até saber exatamente o que está acontecendo. Eu definitivamente não tenho 650.000 conexões para minha caixa (IP único, então eu não tenho muitas portas).

Alguma idéia do que está acontecendo ou o que eu posso fazer para explicar isso? Se você precisar de mais números, provavelmente posso obtê-los.

Observe que a maioria das minhas conexões é HTTP (as únicas exceções são minhas sessões ssh) e o tempo limite de keepalive em nginx está definido como 15 segundos. Também net.netfilter.nf_conntrack_tcp_timeout_time_wait = 1

Qualquer ajuda apreciada.

    
por bluesmoon 17.07.2012 / 18:56

1 resposta

6

Eu posso ter uma pista. O campo de tempo limite de conntrack -L tem vários valores que estão no intervalo de 430.000 segundos. Isso parece suspeitamente próximo ao valor padrão de nf_conntrack_tcp_timeout_established . Eu ajustei nf_conntrack_tcp_timeout_established para 300 e todas as novas entradas na tabela têm um valor de tempo limite menor que 300. Isso parece sugerir que as entradas permaneçam na tabela de controle de conexão enquanto o tcp_timeout_established for válido.

Acrescentarei a esta resposta à medida que obtiver mais informações.

    
por 17.07.2012 / 19:14