Benutzer-Werkzeuge

Webseiten-Werkzeuge


infrastruktur:rz:infiniband

InfiniBand

InfiniBand (IB) ist eine Schnittstelle zur seriellen Datenübertragung, die auf hohe Geschwindigkeit, niedrige Latenz und kurze Verbindungswege ausgerichtet ist. Siehe hierzu die deutsche und englische Seite der Wikipedia sowie https://furneaux.ca/wiki/Infiniband und https://wiki.archlinux.org/index.php/InfiniBand

Aktuell (2020) gibt es 7 Generationen von InfiniBand, die sich in Geschwindigkeit und Kodierung unterscheiden, aber grundsätzlich abwärtskompatibel sind:

Generation 1 2 3 4 5 6 7
Einführung 2001/2003 2005 2007 2011 2011 2014 2017
Abkürzung SDR DDR QDR FDR10 FDR EDR HDR
Signalisierungsrate (Gbaud/s) 2.5 5 10 10.3125 14.0625 25.78125 50
effektiver Durchsatz (Gb/s) pro Link 2 4 8 10 13.64 25 50
effektiver Durchsatz (Gb/s) mit 4 Links 8 16 32 40 54.54 100 200

In der Praxis verwendet man nur Verbindungen mit einem Vielfachen von 4 Links. Es gibt verschiedene Steckverbinder, bei älteren Generationen CX4 alias SFF-8470, bei neueren QSFP(+) alias SFF-8436.

InfiniBand ist auf Hardwareebene immer eine Punkt-zu-Punkt-Verbindung. Der Server hat einen sogenannten Host Channel Adapter (HCA), andere Geräte (z.B. Switches) einen Target Channel Adapter (TCA). Mehr als zwei Hosts können verbunden werden, indem man einen InfiniBand-Switch verwendet oder die HCAs, die meist zwei Ports besitzen, als Daisy Chain von Host zu Host verbindet, dann muss auf diesen jedoch Routing aktiviert sein.

Das Infiniband-Protokoll unterstützt unter anderem RDMA (Remote Direct Memory Access) für schnelle, nicht rechenintensive Datenverbindungen und die Kapselung anderer Protokolle wie IP (IP over Infiniband, IPoIB), FibreChannel (FCoIB) oder iSCSI (iSER), siehe hierzu auch das Linux-iSCSI-Wiki , außerdem unterstützt z.B. NFS RDMA direkt, d.h., man kann bei einer Infiniband-Verbindung den TCP/IP-Overhead sparen.

Im shack geistern einige Infiniband-Karten „Mellanox Technologies MT25208 InfiniHost III Ex (Tavor compatibility mode) (rev a0)“ herum, sie untersützen nur SDR, haben zwei x4 Ports mit CX4-Anschlüssen und PCIe 1.0 oder in einem Fall PCI-X. Des weiteren haben wir einen 24 CX4-Port Infiniband-Switch von Topspin mit Cisco-TCAs. Außerdem hat das BladeCenter einen InfiniBand-Switch eingebaut, an dem jeweils die Blades hängen und außen zwei 4x CX4 und zwei 12x CX4 Ports vorhanden sind. Außerdem haben wir diverse 4x CX4 ↔ 4x CX4 Kabel und zwei 12x CX4 ↔ jew. drei 4x CX4 Kabel. Die Stecker dieser Kabel haben in der Buchse einrastende Klipse auf jeder Seite, um einen zu entfernen, muss man mit der einen Hand den Stecker festhalten und leicht weg von der Buchse ziehen, mit der anderen die Lasche hinten am Stecker ziehen, auf jeden Fall mit Gefühl und Geduld vorgehen.

Da wir diese Technik eh rumliegen haben und schon diese älteste Generation im Prinzip wie 10G-Ethernet ist (It's free real estate!), soll erprobt werden, diese Infrastruktur zur schnellen und flexiblen Anbindung von Storage an die VM-Hosts ibuprofen und phenylbutazon oder die filebitch zu realisieren.

Infiniband benötigt einen sogenannten Subnet-Manager, der als Dienst auf einem der Hosts läuft und die Verbindungen im Netzwerk scannt und automatisch konfiguriert. Der EInfachkeit halber soll nur ein Subnet-Manager verwendet werden.

Derzeit (12.01.2020) ist folgende Konfiguration vorgesehen:

  • Anbindung von phenylbutazon, ibuprofen, sufentanil, propofol mit einem 4x-Link an den Switch
  • Nutzung von 10.42.69.0/24 als exklusives Subnetz für IPoIB
  • Auf sufentanil wird per NFSv4 das Dateisystem auf dem RAID (f2fs) auf dem Infiniband-Interface freigegeben
  • Auf ibuprofen läuft opensm als Subnet-Manager
  • Dieses binden die anderen zum testen als /media/inf ein

Belegung InfiniBand-Switch (Ansicht von hinten)

HCA Bladecenter Slot 3 Port 16 Bladecenter Slot 3 Port 17 Bladecenter Slot 3 Port 18 Bladecenter Slot 4 Port 16 Bladecenter Slot 4 Port 17 Bladecenter Slot 4 Port 18 filebitch Port 1 propofol Port 1 ibuprofen Port 1 buprenorphin Port 1 sufentanil Port 1 phenylbutazon Port 1
Port 1 2 3 4 5 6 7 8 9 10 11 12
Port 13 14 15 16 17 18 19 20 21 22 23 24
HCA

Weitere Ideen:

  • BeeGFS (kann auch InfiniBand-RDMA benutzen) als Cluster-Dateisystem testen mit sufentanil als Host
  • Das BladeCenter zum Spaß mit anbinden und darauf auf einem oder mehreren Blades ein halbwegs aktuelles Linux installieren

Einrichtung unter Debian 8/9

siehe hierzu das Debian-Wiki und https://www.triebwerk23.de/joomla/index.php/netzwerk/infiniband/infiniband-unter-debian

Als root oder jew. mit sudo:

  1. stretch-backports zu /etc/apt/sources.list hinzufügen
  2. apt-get update &&
    apt-get -t stretch-backports install rdma-core \
    libibverbs1 librdmacm1 libibmad5 libibumad3 \
    librdmacm1 ibverbs-providers rdmacm-utils \
    infiniband-diags libfabric1 ibverbs-utils
  3. Auf dem Host, der den Subnet-Manager ausführen soll außerdem:
    apt-get -t stretch-backports install opensm

Außerdem müssen folgende Module vorhanden und der /etc/modules hinzugefügt werden:

#InfiniBand foo
rdma_ucm
ib_uverbs
ib_iser
rdma_cm
ib_umad
ib_ipoib
ib_cm
ib_core
ib_srp
ib_sdp
#Driver for our Mellanox IB card
ib_mthca
#NFS with IB rdma
svcrdma
xprtrdma

Test

Sind die Pakete installiert und die Module geladen, kann man die Funktion überprüfen.
(Alle Beispiele auf ibuprofen)

ibstat zur Information über den HCA:

CA 'mthca0'
	CA type: MT25208 (MT23108 compat mode)
	Number of ports: 2
	Firmware version: 4.5.0
	Hardware version: a0
	Node GUID: 0x0005ad0000034910
	System image GUID: 0x0005ad0000034913
	Port 1:
		State: Active
		Physical state: LinkUp
		Rate: 10
		Base lid: 4
		LMC: 0
		SM lid: 1
		Capability mask: 0x00510a68
		Port GUID: 0x0005ad0000034911
		Link layer: InfiniBand
	Port 2:
		State: Down
		Physical state: Polling
		Rate: 10
		Base lid: 3
		LMC: 0
		SM lid: 1
		Capability mask: 0x00510a68
		Port GUID: 0x0005ad0000034912
		Link layer: InfiniBand

ibnodes zur Auflistung der Nodes im Netzwerk:

Ca	: 0x0005ad000003776c ports 2 "sufentanil mthca0"
Ca	: 0x0005ad0000034910 ports 2 "ibuprofen mthca0"
Switch	: 0x0005ad0000023ea6 ports 24 "Cisco Switch" enhanced port 0 lid 2 lmc 0

iblinkinfo zur Anzeige der physischen Verbindungen:

CA: sufentanil mthca0:
      0x0005ad000003776d      1    1[  ] ==( 4X           2.5 Gbps Active/  LinkUp)==>       2   11[  ] "Cisco Switch" ( )
Switch: 0x0005ad0000023ea6 Cisco Switch:
           2    1[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2    2[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2    3[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2    4[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2    5[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2    6[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2    7[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2    8[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2    9[  ] ==( 4X           2.5 Gbps Active/  LinkUp)==>       4    1[  ] "ibuprofen mthca0" ( )
           2   10[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2   11[  ] ==( 4X           2.5 Gbps Active/  LinkUp)==>       1    1[  ] "sufentanil mthca0" ( )
           2   12[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2   13[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2   14[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2   15[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2   16[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2   17[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2   18[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2   19[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2   20[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2   21[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2   22[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2   23[  ] ==(                Down/ Polling)==>             [  ] "" ( )
           2   24[  ] ==(                Down/ Polling)==>             [  ] "" ( )
CA: ibuprofen mthca0:
      0x0005ad0000034911      4    1[  ] ==( 4X           2.5 Gbps Active/  LinkUp)==>       2    9[  ] "Cisco Switch" ( )

Zum Test einer Verbindung bringt man auf dem Ziel-HCA mit ibstat die gewünschte GUID des verbundenen Ports in Erfahrung, in diesem Fall auf sufentanil Port 1
ibstat mthca0 1 | grep GUID | awk '{print $NF}':

0x0005ad000003776d

Nun kann startet man den Infiniband-Ping-Server mit ibping -S und führt auf dem anderen HCA den ping aus: ibping -c 4 -G 0x0005ad000003776d

Pong from sufentanil.(none) (Lid 1): time 0.302 ms
Pong from sufentanil.(none) (Lid 1): time 0.374 ms
Pong from sufentanil.(none) (Lid 1): time 0.379 ms
Pong from sufentanil.(none) (Lid 1): time 0.849 ms

--- sufentanil.(none) (Lid 1) ibping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 4002 ms
rtt min/avg/max = 0.302/0.476/0.849 ms

Einrichtung IPoIB

siehe hierzu auch https://furneaux.ca/wiki/IPoIB Das IPv4-Subnetz lautet 10.42.69.0/24, die IPs werden fest nach Portnummer am zentralen Topsin-IB-Switch vergeben, da die Blades im Bladecenter nicht direkt, sondern über einen eigenen Switch mit mehreren Links mit dem zentralen Switch verbunden sind, werden ihre IPs 10.42.69.32+Nummer des Blade-Slots vergeben. Für jeden Port eines HCAs taucht unter Linux ein neues Netzwerkinterface mit dem Namen ib* (Debian ⇐9) oder ibs*<d*> (Debian >=10) auf diesem auf, Beispiel (noch unkonfiguriert) ibuprofen:
ip link | grep ib

37: ib0: <BROADCAST,MULTICAST> mtu 2044 qdisc noop state DOWN mode DEFAULT group default qlen 256
    link/infiniband 80:00:00:84:fe:80:00:00:00:00:00:00:00:05:ad:00:00:03:49:11 brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff
38: ib1: <BROADCAST,MULTICAST> mtu 2044 qdisc noop state DOWN mode DEFAULT group default qlen 256
    link/infiniband 80:00:00:85:fe:80:00:00:00:00:00:00:00:05:ad:00:00:03:49:12 brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff

Nun muss folgendes zur /etc/network/interfaces hinzugefügt werden:

auto ib0
iface ib0 inet static
        address 10.42.69.9
        netmask 255.255.255.0
        broadcast 10.42.69.255
        post-up echo connected > /sys/class/net/ib0/mode
        post-up /sbin/ip link set dev $IFACE mtu 65520
        post-up /sbin/ip link set dev $IFACE txqueuelen 10000

Nun wird der Port mit ifup ib0 aktiviert und man kann sofort andere Hosts pingen:
ping -c 4 10.42.69.11

PING 10.42.69.11 (10.42.69.11) 56(84) bytes of data.
64 bytes from 10.42.69.11: icmp_seq=1 ttl=64 time=0.244 ms
64 bytes from 10.42.69.11: icmp_seq=2 ttl=64 time=0.553 ms
64 bytes from 10.42.69.11: icmp_seq=3 ttl=64 time=0.319 ms
64 bytes from 10.42.69.11: icmp_seq=4 ttl=64 time=0.331 ms

--- 10.42.69.11 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3067ms
rtt min/avg/max/mdev = 0.244/0.361/0.553/0.117 ms

Achtung! ibping pingt auf Ebene des InfiniBand-Protkolls, ping auf der darin gekapselten IP-Ebene.

Nun kann man noch testen, ob die Hosts sich unter Nutzung der libibverbs erreichen können, dafür startet man auf dem Ziel-HCA (im Beispiel sufentanil) ibv_rc_pingpong aus und auf dem anderen HCA ibv_rc_pingpong 10.42.69.11:

  local address:  LID 0x0004, QPN 0x0a0086, PSN 0xb25cf5, GID ::
  remote address: LID 0x0001, QPN 0x050088, PSN 0x110899, GID ::
8192000 bytes in 0.04 seconds = 1747.77 Mbit/sec
1000 iters in 0.04 seconds = 37.50 usec/iter

Zum abschließenden Test der TCP/IP-Performance startet installiert man auf beiden Hosts iperf3 und startet es im Servermode auf dem Ziel mit iperf3 -s, auf dem anderen HCA mit iperf3 -c 10.42.69.11:

Connecting to host 10.42.69.11, port 5201
[  4] local 10.42.69.9 port 51744 connected to 10.42.69.11 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec   768 MBytes  6.43 Gbits/sec    0   3.12 MBytes       
[  4]   1.00-2.00   sec   769 MBytes  6.46 Gbits/sec    0   3.12 MBytes       
[  4]   2.00-3.00   sec   762 MBytes  6.39 Gbits/sec    0   3.12 MBytes       
[  4]   3.00-4.00   sec   762 MBytes  6.39 Gbits/sec    0   3.12 MBytes       
[  4]   4.00-5.00   sec   762 MBytes  6.39 Gbits/sec    0   3.12 MBytes       
[  4]   5.00-6.00   sec   766 MBytes  6.43 Gbits/sec    0   3.12 MBytes       
[  4]   6.00-7.00   sec   772 MBytes  6.48 Gbits/sec    0   3.12 MBytes       
[  4]   7.00-8.00   sec   760 MBytes  6.37 Gbits/sec    0   3.12 MBytes       
[  4]   8.00-9.00   sec   766 MBytes  6.43 Gbits/sec    0   3.12 MBytes       
[  4]   9.00-10.00  sec   758 MBytes  6.36 Gbits/sec    0   3.12 MBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  7.47 GBytes  6.41 Gbits/sec    0             sender
[  4]   0.00-10.00  sec  7.47 GBytes  6.41 Gbits/sec                  receiver

iperf Done.

Nicht ganz 10G Ethernet, aber allemal besser als 1G Ethernet und obendrein frei Haus!:-)

Einrichtung NFSv4

siehe hierzu https://furneaux.ca/wiki/NFS_over_InfiniBand und https://www.kernel.org/doc/Documentation/filesystems/nfs/nfs-rdma.txt Da die derzeit verwendeten HCAs einige dafür benötigte RDMA-Befehle nicht unterstützen, ist NFSoRDMA derzeit deaktiviert auf allen Teilnehmern. Zunächst muss auf dem Server (im Beispiel sufentanil) zur /etc/rc.local folgendes hinzugefügt werden:

#NFS port for IB rdma
echo rdma 20049 > /proc/fs/nfsd/portlist

Zusätzlich müssen natürlich die NFS-exports in /etc/exports konfiguriert werden:

#Infiniband NFSv4 exports
/srv/nfs        10.42.69.1/24(rw,async,fsid=0,crossmnt,insecure,no_subtree_check)
/srv/nfs/test   10.42.69.1/24(rw,async,insecure,no_subtree_check)

Nun kann der export auf dem Client (im Beispiel ibuprofen) zur /etc/fstab hinzugefügt werden:

#NFS with IB rdma
10.42.69.11:/srv/nfs/test       /media/inf      nfs4    _netdev,auto,proto=rdma,port=20049,hard,intr,rsize=65536,wsize=65536,noatime    0       0

und mit mount /media/inf eingehangen werden (der Mountpoint muss natürlich angelegt sein).

infrastruktur/rz/infiniband.txt · Zuletzt geändert: 2020-01-23 19:03 von neos