我们有一个thrift服务,在日志中发现了很多类似于“THeaderException: Unsupported client type”的错误。他的发生频率很固定,大概每分钟一次,我们不知道发生了什么问题。也不知道是否影响了我们的服务。所以开始了故障排查。
我们第一步的设想是这样的。我们先用tcpdump抓包。然后用包里面的时间和服务日志的时间对应,这样就可以知道发送请求的IP地址,然后就可以知道是谁发来的请求了。我们才开始只抓了eth0上,发现没有抓到,于是我们加了loopback,终于抓到了。
下一个问题是,抓到的都是local端口的,而且端口号不固定。我们的猜测是这些请求是由一些临时的进程从随机的端口发送过来的,所以我们也没有办法找到具体是谁发送了这个进程。
下一步,我们写了一个简单的ebpf的脚本,这个脚本可以告诉我们哪个进程创建了tcp链接。于是我们就找到了process的名字,叫StatusCheck(). 然后我们进行了一番推测,觉得这个应该是容器组用来给服务做健康测试的。于是我们就去问了容器组。
最后的结论是:我们用了一个很老的健康测试的协议(framed)。但是在server端只支持新的协议类型了(header)。所以才会有这样的问题。