最近,我watch -n 1 ipconfig
在我们的一个 Linux 集群计算节点上执行了 48 进程 MPI 运行,该运行分布在多个节点上。奇怪的是,虽然以太网数据包似乎被正确计数(由于 SSH 会话,速度为几 kb/s),但 IB 适配器似乎处于空闲状态(RX/TX 数据包和字节没有变化)。
MPI over IB 肯定在我们的集群上运行(我们做了几次检查,如果没有,人们无论如何都会注意到的),更奇怪的是,如果我从另一个节点 ping InfiniBand-HCA,突然就会对数据包进行计数。
无可否认,我对 IB 的了解非常有限,但我知道 InfiniBand 提高性能的关键方面之一是通过将其直接实现到硬件中来绕过(内核)网络堆栈(或者我是这样认为的 - 如果我错了,请纠正我!)。
我的解释是,由于数据包未到达内核,因此内核无法正确拦截流量,因为相应层中缺少信息 - 这听起来合理吗?但是,我不确定 ICMP 情况下发生了什么。也许通过 IPoIB 发送的数据确实会触发相应的内核例程进行数据包计数,而“IB 原生”协议(动词、RDMA)则不会?
不幸的是我在互联网上找不到有关此事的任何信息。
答案1
您的假设是正确的。在 Infiniband 上运行 MPI 时,您通常希望绕过网络堆栈并使用 RDMA/Verbs 接口来获得最佳性能。通过此接口发送的所有通信都不会在 IPoIB 接口上进行记录,ib0
例如
要监控 Infiniband 卡的流量,您可以查看/sys/class/infiniband/mlx4_0/ports/1/counters/
计数器。不幸的是,这些计数器只是 32 位计数器,在 Infiniband 中很快就会填满,因此您应该安装perfquery
可以使用 64 位计数器收集结构中的性能计数器的程序。
要在节点上本地执行简单查询perfquery
并获取 64 位计数器,您可以发出以下命令。
perfquery -x
您还可以通过添加删除的 Infiniband 设备的 LID 来获取远程机器的性能计数器。
perfquery -x -a 2
-a
LID 2 的所有端口都位于哪里。
请注意,和PortXmitData
是PortRcvData
每条通道的数字,通常必须将它们乘以 4 才能得到实际字节数。您还可以添加一个-r
以将计数器重置为您的perfquery
,这样可以更轻松地计算每秒的数字。