有关Squid中的FileDescriptor解释:
即文件描述符,是一个简单的整数,用以标明每一个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。
遇到的现象和问题:
Unix/linux操作系统通常给每个进程能打开的文件数量强加一个限制。更甚的是,通常有一个系统级的限制。可以在命令行中用ulimit -a命令查看,多数程序运行时,报出"too many openfiles"或本例中的squid的情况都与系统中“open files”环境参数有关,也就是ulimit -n。
因为squid 的工作方式,文件描述符的限制可能会极大的影响性能。当squid 用完所有的文件描述符后,它不能接收用户新的连接。也就是说,用完文件描述符导致拒绝服务。直到一部分当前请求完成,相应的文件和socket 被关闭,squid 不能接收新请求。当squid发现文件描述符短缺时,它会发布警告。
比如我们这次遇到的“WARNING! Your cache is running out of filedescriptors”
检查当前的squid配置:
执行squidclient mgr:info命令可以查看当前squid的所有运行时参数,其中squidclient mgr:info | grep 'file desc'就可以看到关于文件描述符的配置了,例如:
Maximum number of file descriptors: 16384 (这个是最大数量,当然是我们优化以后的,默认是1024,做网关代理肯定不够用了)
Largest file desc currently in use: 1640 (当前最大使用量)
Number of file desc currently in use: 1301 (当前使用量)
Available number of file descriptors: 15083 (剩余数量)
Reserved number of file descriptors: 100 (保留数量)
通常Squid在安装过程中,执行./configure时,会根据系统中ulimit -n的输出值,来判断其最大可用的FileDescriptor。所以,在运行./configure 之前,检查你的系统的文件描述符限制是否合适,能给你避免一些麻烦。大多数情况下,1024 个文件描述符足够了。非常忙的cache可能需要4096或更多。
修改的方法:
#通常情况下,应当将FileDescriptor至少设置为ulimit -n的2倍。
第一步:将ulimit -n的数量先加大:ulimit -HSn 32768。
这个通常有几种方法:
1.直接执行:ulimit -HSn 32768,但重启OS后会失效
2.编辑/etc/rc.local,加入一行:ulimit -HSn 32768,重启后生效
3.编辑/etc/security/limits.conf,重启后生效(下面2种都可以,其区别可以网上搜一下):
a.* - nofile 32768
b.proxy soft nofile 32768
proxy hard nofile 32768
4.编辑/etc/init.d/squid,在该脚本执行start()动作前,加入“ulimit -HSn 32768”
第二步:将squid的filedescriptors增大,这个通常也有几种方法:
1.修改/etc/squid/squid.conf,将max_filedesc设置为32768
2.编译安装squid时,在执行configure前,先在命令行执行一次:ulimit -HSn 32768
3.编译安装squid时,在执行configure时,加上--with-maxfd=32768 参数
相比较而言,还是第一种简单。