最近,我在我们的一个Linux集群计算节点上执行了一个watch -n 1 ipconfig ,同时它正在运行一个48进程的MPI运行,分散在多个节点上。 奇怪的是,虽然以太网数据包似乎被正确计数(由于SSH会话几个kb / s),但它看起来像IB适配器保持空闲(RX / TX数据包和字节没有变化)。
IB上的MPI肯定是在我们的集群上工作的(我们做了几次检查,反正人们会注意到,如果没有的话),更奇怪的是,如果我从另一个节点ping InfiniBand-HCA,突然包被计数。
不可否认,我对IB的知识是相当有限的,但是我知道InfiniBand性能改善的一个关键方面是由于直接将硬件实现到硬件(或者所以我认为 – 请纠正我如果我错了!)。
我的解释是,由于数据包没有到达内核,内核不能正确地截获stream量,因为数据包没有到达内核 – 这听起来合理吗? 但是,我不确定在ICMP情况下发生了什么。 也许通过IPoIB发送的数据不会触发相应的内核例程进行数据包计数,而“IB-native”协议(动词,RDMA)不会呢?
不幸的是,我无法在互联网上find有关此事的任何信息。
你的假设是正确的。 在Infiniband上运行MPI时,通常要绕过networking堆栈,并使用RDMA / Verbs接口来获得完整的性能。 所有通过这个接口发送的通信都不会被logging在IPoIB接口ib0
要监视Infiniband卡正在执行的stream量,可以在/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 ,这使得它更容易计算每秒的数字。