眼瞅着马上到18点了,小编今天约了媳妇下班一起去美食街探店,谁曾想半路上公司故障群亮起了一片红灯,心里嘀咕着是谁这么不醒目,无奈之下只能抛妻急忙赶回公司处理问题了!
好了,废话少说,直接看问题,客户端反馈接口请求报大量504 gateway time-out 的网络请求错误,当遇到这个问题我得第一想法肯定是服务器压力过大了,所以我从以下几点一一做了排查:
- 检查服务cpu、内存、磁盘等基础指标,好家伙,看起来没有什么异常指标,先排除了首要机器压力问题
- 检查带宽、连接数 相关指标后,发现带宽接近瓶颈,连接数有点超,初步判断是服务器压力开始上来了
- 确定了带宽,连接数异常后,一般压力会来到会来到接口服务这层来,由于前面接了一层nginx,按道理来说只要nginx错误日志开起来后,应该会有相关504错误体现,但是发现nginx并没有相关错误日志
- nginx没有相关错误日志一下子让我不知所措,所以我直接执行了
top
命令,发现并没有有哪个服务压力很高的情况 - 既然没有到这一层,那么只有两种假设,一种是没有到服务器这边,另外一种是进了服务器,但是没有到nginx这一层
- 然后就查看了下系统日志,执行了下以下命令查看系统日志
tail -f /var/log/message
,发现输出错误,错误如下:kernel: nf_conntrack: table full, dropping packet
好家伙看到这个错误信息,大概应该就是原因导致的,大概的意思就是服务器丢包了,然后科学上网查了下具体的原因,具体的原因是:
iptables 中的连接跟踪模块将连接存储在 conntrack 表中。table full, dropping packet表示表已满,无法为新连接创建新条目。结果,发生丢包。这个问题可以通过增加跟踪连接的允许条目数来解决。
具体的解决方案:
sudo sysctl -w net.netfilter.nf_conntrack_max=1048576
sudo sysctl -w net.nf_conntrack_max=1048576
sudo sysctl -p
改完配置后,服务再也没有丢包了!回家吃饭,oh yeah~