Header Ads

Squid cache running out of filedecriptors

Para los que usamos Squid-Cache y muchas distros que lo incluyen, en ocasiones, cuando la cantidad de clientes superan las 50 conexiones simultáneas, en los logs comienza a salir un extraño mensaje:
WARNING! Your cache is running out of filedescriptors
Y posiblemente en sarg:
The maximum number of open file descriptors to avoid "Too many open files" error message
Lo anterior es causado por el valor por default en el kernel de linux del descriptor de archivos (FD), que no opera en "armonía" con Squid.
Hay una explicación muy larga de este asunto, así que pedimos de antemano disculpas a los eruditos en la materia, ya que trataremos de no complicar el post con excesivos tecnicismos sobre el funcionamiento de Squid y el Kernel de Linux y más bien sintetizaremos el problema y la solución en pocas líneas.
Si echamos una mirada a squid.conf veremos lo siguiente:
#  TAG: max_filedescriptors
# Reduce the maximum number of filedescriptors supported below
# the usual operating system defaults.
#
# Remove from squid.conf to inherit the current ulimit setting.
#
# Note: Changing this requires a restart of Squid. Also
# Use operating system limits set by ulimit.
# not all I/O types supports large values (eg on Windows).
#Default:
Lo que sucede es que, de acuerdo con Squid, no hacer nada sería tomar los valores por defecto del sistema (lo cual no es bueno, ya que el valor por defecto es muy bajo, o sea 1024) y hacer algo también es malo, porque genera error, descrito hace años en el siguiente Bug.
Para solucionarlo, muchos creen que con modificar /etc/sysctl.conf, y agregándole valores altos es más que suficiente:
Maximum number of file descriptors:   65535
Available number of file descriptors: 65528
Reserved number of file descriptors:   100
O más altos...
# Increase size of file handles and inode cache
fs.file-max = 2097152
Pero esto no servirá de mucho si nuestro sistema aún conserva el valor por default de 1024. Así las cosas, para erradicar este molesto aviso (que puede llegar a incluso a experimentar problemas de conectividad en nuestra red local), primero debemos confirmar el valor por default en nuestro sistema. En dependencia de su versión de Squid y del Kernel, ejecute algunos de los siguientes comandos: 
squidclient mgr:info | grep 'file descri'
Y la respuesta es similar a:
Maximum number of file descriptors:   1024
Available number of file descriptors:  338
Reserved number of file descriptors:   100
O también con:
ulimit -a | grep 'open files'
open files      (-n) 1024
O con cualquiera de estos dos:
cat /proc/sys/fs/file-max
sysctl fs.file-max
Lo siguiente es establecer el nuevo valor para FD. La forma más sencilla es editar el archivo de configuración limits.conf:
sudo nano /etc/security/limits.conf
Y al final del archivo incrementamos o agregamos el valor (de 1024 a, por ejemplo, 4096, o a cualquier número extremo si queremos llevar las cosas a otro nivel):
* - nofile 4096
En algunos sistemas puede que tenga que especificar los dos límites (hard and soft limits), pero puede poner el mismo valor para ambos:
* soft nofile 4096
* hard nofile 4096
Y confirmar con:
ulimit -Sn
ulimit -Hn
En cualquier caso, sea cual sea el número que elija, también deberá ponerlo al final de /etc/squid/squid.conf :
max_filedesc 4096
Y también en /etc/sysctl.conf
Sin embargo antes de comenzar a subir este valor arbitrariamente, sería prudente conocer qué tantos archivos abiertos tenemos y verificar este dato en varios lapsos de tiempo y de carga, para poder tomar la decisión correcta. Esta información se consigue con el comando:
cat /proc/sys/fs/file-nr
Con la tecnología de Blogger.