使用代理的时候,每次请求切换会有代理发生异常,在高并发的情况下,会产生许多由于代理连接异常导致的半连接假死连接,这些连接系统在进行keepalive探测后会进行回收,如果回收速度过慢的话,达到最大文件句柄数后所有request请求就无法建立连接,就会报出 Too many open files。
sudo netstat -natep | grep 代理端口 或爬虫进程ID #可以查看爬虫程序占用的ESTABLISHED的连接
解决办法:
修改系统最大文件句柄数:
vim /etc/security/limits.conf中添加如下设置:
* soft nofile 65535
* hard nofile 65535
配置完成后,查看一下:ulimit -a,若是显示没有变化,则需要重启服务器后才生效。
修改系统开启或者关闭保活探测,默认情况下是关闭的
sysctl -a | grep keepalive 可以查看当前配置
编辑/etc/sysctl.conf,添加或修改一下几个参数:
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_retries1 = 3
net.ipv4.tcp_retries2 = 15
net.ipv4.tcp_syn_retries = 6
net.ipv4.tcp_synack_retries = 5
保存退出并sysctl -p,使修改生效。