Недавно я выполнил watch -n 1 ipconfig
на одном из наших вычислительных узлов кластера Linux, когда он выполнял 48-процессный запуск MPI, распределенный по нескольким узлам. Как ни странно, хотя кажется, что пакеты Ethernet подсчитываются правильно (несколько кб / с из-за сеанса SSH), похоже, что адаптер IB остается в режиме ожидания (без изменений в пакетах и байтах RX / TX).
MPI over IB определенно работает в нашем кластере (мы провели несколько проверок, и в любом случае люди бы заметили, если бы нет), и, что еще более странно, если я пингую InfiniBand-HCA с другого узла, внезапно подсчитываются пакеты.
По общему признанию, мои знания о IB довольно ограничены, но я знаю, что один из ключевых аспектов повышения производительности с InfiniBand связан с обходом сетевого стека (ядра) путем его реализации непосредственно в аппаратном обеспечении (по крайней мере, я так думал - пожалуйста, поправьте меня если я не прав!).
Мое объяснение заключается в том, что ядро не может должным образом перехватывать трафик из-за отсутствия информации на соответствующем уровне, поскольку пакеты не достигают ядра - это звучит разумно? Однако я не уверен, что тогда происходит в случае с ICMP. Может быть, данные, отправленные через IPoIB, запускают соответствующие процедуры ядра для подсчета пакетов, в то время как «родные для IB» протоколы (глаголы, RDMA) - нет?
К сожалению, мне не удалось найти в Интернете никакой информации по этому поводу.
Вы правы в своих предположениях. При запуске MPI через Infiniband обычно требуется обойти сетевой стек и использовать интерфейс RDMA / Verbs для обеспечения полной производительности. Все сообщения, отправленные через этот интерфейс, не будут учитываться на интерфейсе IPoIB. ib0
например
Чтобы отслеживать трафик, который делает карта Infiniband, вы можете увидеть в /sys/class/infiniband/mlx4_0/ports/1/counters/
для счетчиков. К сожалению, это только 32-битные счетчики, которые очень быстро заполняются в Infiniband, поэтому вам следовало установить perfquery
который может собирать счетчики производительности в вашей структуре с помощью 64-битных счетчиков.
Чтобы сделать простой запрос с perfquery
локально на узле и получить 64-битные счетчики, вы можете выполнить следующую команду.
perfquery -x
Вы также можете получить счетчики производительности удаленного компьютера, добавив LID удаляемого устройства Infiniband.
perfquery -x -a 2
куда -a
говорит все порты LID 2.
Обратите внимание, что PortXmitData
и PortRcvData
являются номерами дорожек, и вы должны умножить их на 4, чтобы получить фактические байты. Вы также можете добавить -r
сбросить счетчики на ваш perfquery
что упрощает расчет посекундных цифр.