Назад | Перейти на главную страницу

ifconfig явно показывает неправильные значения RX / TX для InfiniBand HCA

Недавно я выполнил 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 что упрощает расчет посекундных цифр.