---
title: 建链失败定位思路
description: "在调用通信算子时，HCCL会通过参数面网络基于TCP协议进行socket连接创建，以此来基于业务需要进行地址等信息交换，此时如果出现某种故障导致部分rank未调用到预期的通信算子，导致无法发起建链请求，或由于网络连通性、行为一致性问题导致无法响应彼此之间的建链请求，就会导致其他rank出现socket连接超时报错。"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/API/hcclug/hcclug_000048.html
sourcePath: /source/zh/canncommercial/900/API/hcclug/hcclug_000048.html
indexId: 9133c6e22e278942fd4a3526a8fde6f40640cfa77146efe149120fef3a3ebfe759
---
# 建链失败定位思路

在调用通信算子时，HCCL会通过参数面网络基于TCP协议进行socket连接创建，以此来基于业务需要进行地址等信息交换，此时如果出现某种故障导致部分rank未调用到预期的通信算子，导致无法发起建链请求，或由于网络连通性、行为一致性问题导致无法响应彼此之间的建链请求，就会导致其他rank出现socket连接超时报错。

由于HCCL的算法和算子调用顺序的原因，建链超时会呈现在rank间有级联传递的情况，因此如果发现建链超时，需要优先找到故障点位置。

HCCL在参数面建链阶段提供了下文所述机制来辅助问题快速定位。

#### 建链根节点定位机制

考虑到建链问题的级联传播问题，如rank0在和rank1建链等待超时，而rank1在和rank2建链等待超时，若此时rank1和rank2的建链由于网络或其他原因导致失败，在rank0上最终也会上报和rank1的建链超时报错，但失败的根因却在rank1和rank2之间。因此在集群中找到建链失败根节点位置是较为困难和繁琐的，HCCL会在业务上建链失败后立即启动故障探测链路，其主要的实现原理为：


图1 建链失败根节点定位原理图

1. 每个rank在建链失败后会启动监听能够响应所有rank故障探测链路的server端。
2. 向无法响应自己业务建链请求的远端发起故障探测链路连接请求。
3. 如果远端无法响应自己的探测建链请求，则认为和远端的链路，或远端的业务进程存在问题，产生探测失败事件。并向已经在server端建立成功的其他链路发送扩散该事件。
4. 如果远端建立起了探测链路，则接收对端发送的探测失败事件并进行转发。

这样，如果出现任何单点问题导致的建链失败，可以通过日志快速定位故障点的节点位置，并进行下一步的问题定位。详细的定位流程可参考建链超时（EI0006）。

如果经过探测无任何事件，则很有可能是行为一致性问题，也就是每个rank均已进入建链阶段并响应其他rank的故障探测请求，但由于彼此调用的通信算子不一致导致链路互等超时，一般是由于集群行为一致性问题，请检查脚本、环境、版本、数据集等因素。如果需要参考通信算子的行为，可以通过建链失败报错日志中关键字“Alloc transports failed”中对应的tag信息推测算子行为，比如遍历每个rank的tag信息，如果16rank通信域内，15rank均为allgather，1个rank为AllReduce，则重点分析两个算子的调用逻辑差异。

针对建链超时场景，可快速判断是否为全量建链超时，若非全量建链超时，可先重点排查未上报建链超时报错的节点，可参考的命令为：

```
for i in *;do cd $i;pwd;grep -rnc "connection fail" | grep -v ":0" | wc -l; cd ..;done
```


#### 一致性校验机制

HCCL在与对端成功创建socket链接后，会互相交换算子入参、CANN版本等信息并与本端的信息做校验，如果此时校验结果存在不一致的情况，则会在CANN日志及打印日志中上报错误并返回错误码。详细问题定位流程可参考10.3.3参数一致性校验(EI0005)。

单算子模式下，为了保证性能HCCL仅在每个通信域新类型或算法的算子被首次调用时才会触发建链，由于建链成功后才会进行一致性校验，因此此特性无法拦截所有的下发不一致问题。


#### 报错阶段分析

HCCL在通信算子参数面建链阶段会有以下几个常见的报错阶段场景：

- 针对Atlas A3 训练系列产品 / Atlas A3 推理系列产品与Atlas A2 训练系列产品 / Atlas A2 推理系列产品，device网卡端口绑定失败，可通过以下命令排查是否有端口绑定失败问题，详细信息可参考  参数面端口绑定失败（EI0019）
。

```
grep -rE "socket type\[(0|1)\].*Please check the port status and whether the port is being used by other process"
```


- 参数面socket建链超时，可通过以下命令排查是否有参数面建链失败问题，详细信息可参考  建链超时（EI0006）
。

```
grep -r "wait socket establish timeout"
```


- 通信算子一致性校验失败，可通过以下命令排查是否有一致性校验失败问题，详细信息可参考  参数一致性校验(EI0005)
。

```
grep -r "CMD information .* check fail"
```
