我有一个分布式程序,它与运行在高性能HPC集群上的ZeroMQ通信。
ZeroMQ使用TCP套接字,因此在HPC集群上,通信将使用管理网络,因此我引入了由代码读取的环境变量,以强制在特定的网络接口上进行通信。对于Infiniband (IB),通常是ib0。但是在某些情况下,另一个IB接口用于并行文件系统,或者在Cray系统上是ipogif,在一些非高性能HPC系统上,它可以是eth1、eno1、p4p2、em2、enp96s0f0或其他什么.
问题是,我需要询问集群管理员要使用的网络接口的名称,而使用MPI的代码不需要使用,因为MPI“知道”使用哪个网络。
在linux集群上发现高性能网络接口的最可移植的方法是什么?(如果没有简单的方法,我不介意为此编写一个小型MPI程序)
发布于 2020-02-27 01:16:47
没有简单的办法,我怀疑有一个完整的解决办法。例如,Open提供了一组级别较高的网络通信模块,并试图实例化所有模块,最后选择排名最高的模块。其思想是,等级以某种方式反映底层网络的速度,如果不存在给定的网络类型,其模块将无法实例化,因此,面对同时具有以太网和InfiniBand的系统,它将选择InfiniBand作为其模块具有更高的优先级。这就是为什么更大的Open作业启动速度相对较慢,而且绝对不是明智之举的原因--在某些情况下,必须进行干预并手动选择正确的模块,特别是如果节点具有多个InfiniBand HCA的网络接口,而且并非所有这些接口都提供节点到节点的连接。这通常是由系统管理员或供应商在系统范围内配置的,也是MPI“只起作用”的原因(提示:在不太少的情况下,MPI实际上不起作用)。
您可以复制Open所采用的方法,并为您的程序开发一组检测模块。对于TCP,在不同的节点上生成两个或多个副本,列出它们的活动网络接口和相应的IP地址,匹配网络地址并在一个节点上的所有接口上绑定,然后尝试从另一个节点连接到它。成功连接后,运行类似TCP版本的NetPIPE来测量网络速度和延迟,并选择最快的网络。一旦您从初始的小节点集合中获得这些信息,很可能在所有其他节点上也使用相同的接口,因为大多数HPC系统在节点的网络配置方面都是尽可能同构的。
如果安装了可工作的MPI实现,则可以使用它启动测试程序。还可以在MPI库中启用调试日志记录并解析输出,但这将要求目标系统具有日志解析器支持的MPI实现。而且,大多数MPI库都使用本机InfiniBand或任何高速网络API,也不会告诉您哪个是IP over-任何接口,因为它们根本不使用它(除非系统管理员另有配置)。
发布于 2020-02-24 17:40:41
Q:在linux集群上发现高性能网络接口的名称的最便携的方法是什么?
这似乎处于灰色地带--试图解决站点特定硬件(技术)接口命名与其non__-technical,管理维护薄弱、首选使用方式之间的多方面问题。
作为-国家:
ZeroMQ可以(根据RFC 37/ZMTP v3.0+)指定<hardware(interface)>:<port>/<service>详细信息:
zmq_bind (server_socket, "tcp://eth0:6000/system/name-service/test");和:zmq_connect (client_socket, "tcp://192.168.55.212:6000/system/name-service/test");
然而,据我所知,在HPC站点及其硬件配置的整体环境中,无法逆转这种接口的主要用途。
在我看来,您的想法是先通过MPI工具对管理映射进行预测试,然后让ZeroMQ部署使用这些外部检测的配置细节(如果确实是自动检测的,正如您在上面假设的那样),以便进行适当的(首选)接口使用。
安全的方法是:
问HPC -基础设施支持团队(谁负责了解以上所有知识,并经过培训以帮助科学团队以最高效的方式使用HPC)将是我首选的方法。
免责声明:
抱歉,如果这无助于你阅读和自动检测所有需要的配置细节(我想,一个通用的黑匣子-HPC-生态系统检测和自动配置策略很难成为一条琐碎的信息,不是吗?)
https://stackoverflow.com/questions/60378543
复制相似问题