现场:Webservice服务器保持大量close_wait状态的连接,日志出现too many open files错误。导致服务器拒绝访问。
原因:
数据库锁表。客户端请求数据时,缓存的刷新时间超过设置的值,需要重新拉取数据库的数据来刷新缓存。此时客户端超时,发出fin状态码,要求关闭连接,而服务器迟迟未取得数据,无法发送ack确认数据传送完毕。所以一直处于close_wait状态,导致大量close_wait。
程序中经常访问的文件、socket在linux中都是文件file,出现too many open files就是由于连接数超过设置的用户进程最大打开文件数阈值。
解决方法:
1 设置最大打开文件数阈值
查看每个用户进程最大打开文件数:
ulimit -a
查看当前系统打开的文件数量:
lsof | wc -l
查看某一进程的打开文件数量:
lsof -p pid | wc -l
设置open files数值:
ulimit -n 2048
用户级永久设置方法:
vi /etc/security/limits.conf 在最后加入 * soft nofile 4096 * hard nofile 4096
系统级永久设置方法:
vi /etc/sysctl.conf文件 配置 fs.file-max 生效 sysctl -p
2 设置tcp_keepalive参数
暂时生效:
sysctl -w net.ipv4.tcp_keepalive_time=600 sysctl -w net.ipv4.tcp_keepalive_probes=2 sysctl -w net.ipv4.tcp_keepalive_intvl=2
永久生效:
vi /etc/sysctl.conf 配置 net.ipv4.tcp_keepalive_time = 1800 net.ipv4.tcp_keepalive_probes = 3 net.ipv4.tcp_keepalive_intvl = 15 重启network生效 /etc/rc.d/init.d/network restart
3 修改代码
增加查询锁表异常捕获,发送邮件通知,重要的是保证web服务能持续提供服务。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于