问题背景
在一次现场硬件部署实施过程中,实施人员突然发现网络大批量请求超时的情况,在确认现场网络通畅的情况下,立刻通知给了我们开发人员。经过调试,发现所有接口均出现了断断续续无法访问的情况,基本上完全处于不可用状态。出现这种情况第一反应是网络问题,因为线上机房位于位于电政办,之前有过网路不稳定的情况,在电话沟通后得知对方此时网络也异常慢,此时已无力吐槽这贷款了。
但是问题真的就只是网络带宽这么简单吗?
通过Zabbix排查问题
线上集群几乎每个节点都部署了Zabbix集群监控,通过NetWork监控项可以排查网络问题,大体流量图如下:
可以发现,除了部分时刻网络流量骤增之外,大部分时间还是比较平稳的,其中绿色代表incoming流量,蓝色代表outgoing流量。根据此图(主要是没有流量断点)可以大致判断并非完全是由于网络问题导致的问题。
但是再仔细想想,整个系统采用的是分布式架构,各节点间的调用均通过RPC调用,只有几个节点是对外通过Nginx代理访问的,也就是说Nginx节点入口是导致问题的关键。然而遗憾的是Nginx节点上并没有部署Zabbix,只能手动排查了。
发现真实问题原因
首先在Nginx节点上执行已下命令
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"t",state[key]}'
可以发现等待请求在不断增加,说明有较多请求阻塞了。很自然的联系到Nginx的配置,
这里修改了worker_processes 、worker_connections配置,重启Nginx,再次执行命令,此时发现阻塞的请求数量有所下降,但是还是一直不断的在增加。
好吧到这里基本已经开始怀疑服务器跟带宽已经跟不上了,但是究竟是啥请求在一直访问呢?
执行netstat -t查看一下,发现所有的请求均来自与39节点,该节点上最近刚刚部署了C/S端的程序,于是通知C部门排查,最终确认了问题。停掉C/S端后,其他请求陆续恢复了正常。