运行之前可以执行成功的 sql 查询语句报错,报错信息“connection xxx get none response from xxx in 3600 seconds. It may ...”。
➢ 解答
这是因为节点间有 UDP 丢包。
UDP Packet Lost - receive buffer errors。
确认是否是 packet reassembles failed 导致 UDP 丢包
#执行命令
$ cat /proc/net/snmp | grep "Ip"
Ip: Forwarding DefaultTTL InReceives InHdrErrors InAddrErrors ForwDatagrams InUnknownProtos InDiscards InDelivers OutRequests OutDiscards OutNoRoutes ReasmTimeout ReasmReqds ReasmOKs ReasmFails FragOKs FragFails FragCreates
Ip: 1 64 148635009 0 0 0 0 0 148628477 148758559 0 0 0 0 0 0 0 0 0
#确认 ReasmTimeout 与 ReasmFails 值
- ReasmTimeout: 分片在 reassemble buffer 中超时后被丢弃的计数
- ReasmFails: 报文重组失败计数。该值包含 timeout 的计数
确认方法
- 当系统中有大量的 ReasmTimeout 计数的增长时,一般需要确认的是底层链路是否存在一定的丢包率
- packet reassembles failed 计数一直在增长
- 通过 ReasmTimeout 的计数排除掉是 timeout 造成的 failed 增长,或者 timeout 的计数只是 failed 中的一部分
- 通过 ReasmFails 增长的规律进行判断,因为 buffer 满后丢包的过程是会有大量丢包的,所以这个时候 packet reassembles failed 是一次性巨量的增长,而非 1、2 的增加。
可以将 gp_max_packet_size 设置为小于 MTU (1500)的值,比如 1024,然后重启集群。