Thrift常见报错问题以及定位方式总结

1,033 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天

目录

Aache Thrift最常见的报错信息为:

问题定位:No more data to read.

问题定位:Connection refused.

问题定位:No route to host.

问题定位:Called write on non-open socket.

问题定位:Thrfit_EAGAIN (timed out).

问题定位:Thrfit_EAGAIN (unavailable resources).

问题定位:socket open() error:没有到主机的路由


Aache Thrift最常见的报错信息:

No more data to read

Called write on non-open socket

Connection refused

Thrift _EAGAIN(timed out)

Interrupted systemcall

当出现连接报错时,可以使用ping、netstat、ss、nc、telnet等工具或命令快速判断节点的网络状态。注意日志或者的UI出现RPC报错时,需要判断的是目的节点的状态。例如使用netstat -anp | grep “端口号”可以查看到当前进程是否对指定的端口号成功监听,同时查看当前的连接情况。

**问题定位 ** N o more data to read.

“**No more data to read. **”是最常见的Apache Thrift报错,该报错的根本原因是“连接被对端关闭”,这个报错信息是thrift独有的,只要看见这个报错,必然与thrift相关,原因可能是:

1、如果是长连接,连接闲置时间超过服务端的接收超时,则服务端就会将连接关闭,此后再使用该连接发送数据则会出现“No more data to read.”的报错;

2、此外,服务端连接进行recv时如果被系统中断打断,也会触发服务端关闭连接,此时客户端再对连接进行操作,同样会出现“No more data to read.”的报错;

3、并发压力比较大的时候,client端connect成功,但server端由于并发压力过大并没有真正的accept,client端此时再使用这个连接进行通信,同样会出现“No more data to read.”的报错。该问题可以通过调整TCP内核参数规避缓解,但是调整内核参数需要集群所有节点同时调整,同时需要root权限,建议慎重。

在这里插入图片描述​编辑

TCP在三次握手过程中内核会维护两个队列:半连接队列,即SYN队列和全连接队列,即ACCEPT队列;

握手过程中,第一次握手server收到client的syn后,内核会把该连接存储到半连接队列中,同时回复syn+ack给client(第二次握手),第三次握手时server收到client的ack,如果此时全连接队列未满,内核会把连接从半连接队列移除,并将其添加到 accept 队列,等待应用进程调用 accept 函数取出连接,如果全连接队列已满,内核的行为取决于内核参数。
tcp_abort_on_overflow=0,server会丢弃client的ack。
tcp_abort_on_overflow=1,server 会发送 reset 包给 client。

**问题定位 ** Connection refused.

“Connection refused.”出现的原因通常是服务端的进程崩溃产生。需要检查服务端的日志,确认报错的时间段服务端的进程是否为启动状态。如果长期报Connection refused且目标节点的进程状态正常的话,则需要确认如下几点:

1、确认hostname和IP映射是否正确,查看/etc/hosts文件,如果配置错误及时修改;

2、确认目标节点的进程是否对端口正常监听;

**问题定位 ** No route to host .

出现No route to host报错通常意味着目标节点服务器发生了重启。

另外一种出现No route to host报错的原因是由于/etc/hosts主机名映射出错导致,此时需要细心检查全部节点的主机名映射。集群增加节点应格外注意检查,容易忘记对原有节点添加新节点的主机名映射。

问题定位 :Called write on non-open socket.

出现这个报错的原因是socket连接打开失败,使用无效的连接进行send操作造成的,这种报错通过重试一般就可规避,如果持续出现此类报错,还是需要检查目标节点的进程状态、端口监听情况和主机名映射。可以充分参考“Connection refused.”的定位方法。

问题定位 :Thrfit_EAGAIN (timed out).

出现这个报错的原因是客户端接收超时,可能是由于连接任务过多造成的。

出现超时报错的另外一种原因,可能是由于目标节点的CPU爆满造成,此时需要重点关注该目标节点的CPU使用情况。

问题定位 :Thrfit_EAGAIN (unavailable resources).

出现这个报错的原因是客户端接收超时,并且已经超过了thrift recv() 重试次数。

**问题定位 ** socket open() error:没有到主机的路由

查看目标节点和本地节点防火墙是否运行,保证防火墙关闭

CentOS 7下查看防火墙状态命令:firewall-cmd --state(可能需要root权限)

关闭防火墙:systemctl stop firewalld.service