我将配置文件中的PACKET_PAYLOAD_SIZE 9000 改为1000,将buffer_size从32改为9,其余不变相同的一个workload,执行后者报错如图,AI告诉我是pfc resume的时候输入的队列id不对导致的,存在这个问题吗。
PFC 触发链路是:
SwitchNode::SendToDev()
-> CheckAndSendPfc(inDev, qIndex)
-> device->SendPfc(qIndex, 0) // pause
恢复链路是:
SwitchNode::SwitchNotifyDequeue()
-> CheckAndSendResume(inDev, qIndex)
-> device->SendPfc(qIndex, 1) // resume
GPU/NIC 收到 resume 后:
QbbNetDevice::Receive()
-> Resume(qIndex)
问题就在 Resume():
Ptr lastQp = m_rdmaEQ->GetQp(qIndex);
这里的 qIndex 是 PFC 队列号/优先级号,比如 3,不是 RDMA QP 数组下标。
你这次 gdb 里已经看到:
qIndex = 3
node id = 10
node type = 0
RDMA QP count = 2
也就是只有 2 个 QP,却访问 GetQp(3),直接越界段错误。
为什么 BUFFER_SIZE=9 更容易触发?
PFC 阈值这样算:
(buffer_size - total_hdrm - total_rsrv - shared_used_bytes) >> pfc_a_shift[port]
BUFFER_SIZE 从 32MB 改成 9MB,buffer_size 变小,PFC threshold 明显变低,更容易 pause,也更频繁 resume。于是更容易走到这个错误的 Resume(qIndex)。
我将配置文件中的PACKET_PAYLOAD_SIZE 9000 改为1000,将buffer_size从32改为9,其余不变相同的一个workload,执行后者报错如图,AI告诉我是pfc resume的时候输入的队列id不对导致的,存在这个问题吗。
PFC 触发链路是:
SwitchNode::SendToDev()
-> CheckAndSendPfc(inDev, qIndex)
-> device->SendPfc(qIndex, 0) // pause
恢复链路是:
SwitchNode::SwitchNotifyDequeue()
-> CheckAndSendResume(inDev, qIndex)
-> device->SendPfc(qIndex, 1) // resume
GPU/NIC 收到 resume 后:
QbbNetDevice::Receive()
-> Resume(qIndex)
问题就在 Resume():
Ptr lastQp = m_rdmaEQ->GetQp(qIndex);
这里的 qIndex 是 PFC 队列号/优先级号,比如 3,不是 RDMA QP 数组下标。
你这次 gdb 里已经看到:
qIndex = 3
node id = 10
node type = 0
RDMA QP count = 2
也就是只有 2 个 QP,却访问 GetQp(3),直接越界段错误。
为什么 BUFFER_SIZE=9 更容易触发?
PFC 阈值这样算:
(buffer_size - total_hdrm - total_rsrv - shared_used_bytes) >> pfc_a_shift[port]
BUFFER_SIZE 从 32MB 改成 9MB,buffer_size 变小,PFC threshold 明显变低,更容易 pause,也更频繁 resume。于是更容易走到这个错误的 Resume(qIndex)。