Delirios de un Informático

Linux y el tope de conexiones

Anoche nos encontramos con un curioso problema: uno de nuestros servidores tardaba de 5 a 20 segundos en responder a peticiones aleatoriamente, es decir, una o dos de cada diez tardaban demasiado. Tras haber experimentado problemas con MySQL debido a la cuota en disco, las primeras investigaciones iban por ahí pero los tiempos de las consultas eran normales pero no el tiempo transcurrido entre consulta y consulta. Vimos entonces que aleatoriamente aparecían mensajes de fallos conexion a Memcached:

(tcp 11211) failed with: Connection timed out (110)

Pronto lo descartamos porque teniendo exactamente las mismas versiones del módulo de conexióna Memcached de PHP en dos servidores diferentes, uno fallaba y el otro no. Por eso empezamos a buscar problemas de conectividad, que confirmamos con un simple ping. Aleatoriamente aparecía el siguiente error:

ping: sendmsg: Operation not permitted

También empezamos a ver en los logs mensajes como estos:

Feb  3 02:46:04 web01 kernel: [13125398.627517] __ratelimit: 632 messages suppressed
Feb  3 02:46:04 web01 kernel: [13125398.627517] nf_conntrack: table full, dropping packet.
Feb  3 02:46:09 web01 kernel: [13125404.307638] __ratelimit: 862 messages suppressed
Feb  3 02:46:09 web01 kernel: [13125404.307638] nf_conntrack: table full, dropping packet.
Feb  3 02:46:14 web01 kernel: [13125409.874286] __ratelimit: 788 messages suppressed
Feb  3 02:46:14 web01 kernel: [13125409.874286] nf_conntrack: table full, dropping packet.

Por fin el problema: se había llegado al tope de conexiones establecido en la configuración. Ese número de conexiones es global, para todas las interfaces de red. Por eso los timeout de Memcache o las conexiones lentas a MySQL: cualquier conexión de red podía fallar. La solución fué muy simple:

sysctl -w net.netfilter.nf_conntrack_max=131072

Hecho esto (para hacerlo permanente ha de añadirse el valor a /etc/sysctl.conf) desaparecen los errores y todo vuelve a la normalidad. ¿Pero porqué llegamos al tope de conexiones?. En Bitacoras.com tenemos muchos widgets que son muy ligeros pero que generan muchísimas peticiones (botones de voto del agregador, imáges de posición en el top…) que se resuelven muy rápidamente al estar muchos datos cacheados pero que hacen llegar al servidor al tope del que hablamos….