Infiniband - linux

De Wiki doc


Infiniband est un bus haut débit permettant le transfert de données entre machines. Il agit au niveau 1 et 2 du modèle OSI et permet une communication à faible latence via le protocole Infiniband ou via l'une des 3 surcouches supportés:

  • IP sur InfiniBand (IPoIB): présente une couche IP au-dessus de l'Infiniband
  • Sockets Direct Protocol (SDP): présente une couche socket au-dessus de l'Infiniband avec transferts zéro-copie par RDMA
  • SCSI RDMA Protocol (SRP): encapsulation de SCSI dans de l'Infiniband

Pour chacune de ces surcouches, il faudra que la couche Infiniband (1 et 2) soit montée correctement pour qu'elle fonctionne. Infiniband est un protocole prévu pour fonctionner avec des commutateurs spécifiques agissant comme des gestionnaires de sous-réseau. Toute connexion entre machine doit en avoir au moins un (si plusieurs, une relation maitre/esclave se définit entre eux). En cas de connexion directe de PC à PC sans commutateur, il faudra utiliser un gestionnaire de sous-réseau virtuel (opensm dans notre cas).

INFORMATION

Cette documentation a été testé sous Debian Buster via deux cartes Infiniband Mellanox ConnectX. Une 1 port et l'autre 2 ports. Leur référence exacte est introuvable (même avec lspci - les deux cartes affichent les mêmes informations alors qu'elles sont différentes) mais je crois que c'est des ConnectX première génération.


Visualisation

Il est possible de visualiser l'état des connexions Infiniband via les commandes contenus dans le paquet opensm.

ibstat
ibstatus
ibhosts et ibnodes
ibnetdiscover

Il est possible de réaliser un PING entre deux machines via les commandes suivantes:

Sur un PC

ibping -S

Sur l'autre

ibping 2

Le numéro correspond à celui de l'interface en partant de 1.

IP sur Infiniband

l'IPoIB (Internet Protocol over Infiniband) est une surcouche permettant l’utilisation des protocoles IPv4 et IPv6 sur un lien Infiniband.

Cette section va être divisé en deux partie étant donnée que le gestionnaire de sous-réseau n'a besoin d'être installé que sur une des deux machines. Nous les nommerons PC-1 et PC-2 (PC-1 étant le gestionnaire de sous-réseau).

Partie PC-1

Activation des modules noyau

modprobe ib_ipoib
modprobe ib_umad

INFORMATION

le module ib_ipoib peut être chargé pour utiliser le mode IPoIB amélioré via le paramètre ipoib_enhanced=1. On chargera alors le module comme suit : modprobe ib_ipoib ipoib_enhanced=1

Les interfaces Infiniband sont désormais visibles via un ip link. Il est à noter que le module ib_umad n'est utile que sur le gestionnaire de sous-réseau (OpenSM).

Des détails sur les interfaces sont visibles via la commande ibstat des pilotes Mellanox OFED disponible via l'archive de leur site ou via le paquet Debian mstflint. Cette commande met simplement en forme les informations contenues dans /sys/class/infiniband/<pilote>/ports/<num_iface>/.

Instalaltion d'OpenSM

apt install opensm

Par défaut, le service ne se lance ni automatiquement, ni au démarrage.

Définir une adresse IP sur l'interface

ip a a 192.168.151.1/24 dev ibp4s0d1

L'allumée administrativement

ip l set ibp4s0d1 up

Démarrer le gestionnaire de sous-réseau

systemctl start opensm

L'interface montera lorsque PC-2 sera prêt.


Amélioration des performances

Il est possible d'augmenter significativement les performances en mettant l'interface en mode "connecté" en lieu et place de "datagram". Ceci a pour effet de débrider la MTU maximale attribuable à cette dernière (passant de 2044 à 65520). Personnellement, je passe de 1,29 Go/s à 2,39 Go/s sur Iperf avec ce mode. Je n'ai trouvé aucun aspect négatif à ce changement (c'est à ce demander pourquoi il n'est pas activé par défaut... d'autant plus que le protocole se démerde pour fonctionner si ce n'est mis que d'un côté).

echo connected > /sys/class/net/ibp4s0d1/mode

Pour repasser en mode datagram:

echo datagram > /sys/class/net/ibp4s0d1/mode

La MTU se change d'elle même.

Automatisation

Il est possible de faire en sorte que ces étapes soient automatiques au démarrage de la machine en activant le service (enable), ajoutant les module à l'image de mémoire initiale (initrd) et en configurant l'adresse IP dans le fichier idoine (/etc/network/interfaces).

Activer le service au démarrage

systemctl enable opensm

Ajouter les modules à l'image de mémoire initiale

echo -e "ip_ipoib\nib_umad" >> /etc/modules
update-initramfs -u

et mettre à jour votre chargeur d'amorçage (GRUB dans l'exemple suivant):

update-grub

Figer la configuration réseau

echo -e "\nauto ibp4s0d1\niface ibp4s0d1 inet static\n\taddress 192.168.151.1/24" >> /etc/network/interfaces

Partie PC-2

Cette partie est similaire à la première, les étapes nécessaires au gestionnaire de sous-réseau en moins.

modprob ip_ipoib
ip a a 192.168.151.1/24 dev ibp1s0
ip l set ibp1s0 up
echo connected > /sys/class/net/ibp4s0d1/mode

Les machines sont opérationnelles.

Sources de la section

Voir aussi:

Sources