Jak działa przyspieszona sieć na maszynach wirtualnych z systemami Linux i FreeBSD

Po utworzeniu maszyny wirtualnej na platformie Azure syntetyczny interfejs sieciowy jest tworzony dla każdej wirtualnej karty sieciowej w konfiguracji. Interfejs syntetyczny jest urządzeniem VMbus i używa sterownika netvsc. Pakiety sieciowe korzystające z tego syntetycznego interfejsu przepływają przez przełącznik wirtualny na hoście platformy Azure i w sieci fizycznej centrum danych.

Jeśli maszyna wirtualna jest skonfigurowana przy użyciu przyspieszonej sieci, zostanie utworzony drugi interfejs sieciowy dla każdej skonfigurowanej wirtualnej karty sieciowej. Drugi interfejs to funkcja wirtualna SR-IOV (VF) oferowana przez kartę sieci fizycznej na hoście platformy Azure. Interfejs VF jest wyświetlany w gościu systemu Linux jako urządzenie PCI. Używa sterownika Mellanox mlx4 lub mlx5 w systemie Linux, ponieważ hosty platformy Azure używają fizycznych kart sieciowych z systemu Mellanox.

Większość pakietów sieciowych przechodzi bezpośrednio między gościem systemu Linux a fizyczną kartą sieciową bez przechodzenia przez przełącznik wirtualny lub inne oprogramowanie, które działa na hoście. Ze względu na bezpośredni dostęp do sprzętu opóźnienie sieci jest mniejsze, a czas procesora CPU jest używany do przetwarzania pakietów sieciowych w porównaniu z interfejsem syntetycznym.

Różne hosty platformy Azure używają różnych modeli fizycznej karty sieciowej Mellanox. System Linux automatycznie określa, czy używać sterownika mlx4, czy mlx5. Infrastruktura platformy Azure kontroluje umieszczanie maszyny wirtualnej na hoście platformy Azure. Bez opcji klienta, aby określić, której fizycznej karty sieciowej używa wdrożenie maszyny wirtualnej, maszyny wirtualne muszą zawierać oba sterowniki. Jeśli maszyna wirtualna została zatrzymana lub cofnięto przydział, a następnie została ponownie uruchomiona, może zostać ponownie wdrożona na sprzęcie z innym modelem fizycznej karty sieciowej Mellanox. W związku z tym może używać innego sterownika Mellanox.

Jeśli obraz maszyny wirtualnej nie zawiera sterownika fizycznej karty sieciowej Mellanox, możliwości sieciowe będą nadal działać z wolniejszymi szybkościami wirtualnej karty sieciowej. Portal, interfejs wiersza polecenia platformy Azure i program Azure PowerShell wyświetla funkcję przyspieszonej sieci zgodnie z włączeniem.

Usługa FreeBSD zapewnia tę samą obsługę przyspieszonej sieci co system Linux, gdy jest ona uruchomiona na platformie Azure. W pozostałej części tego artykułu opisano system Linux i używamy przykładów systemu Linux, ale ta sama funkcja jest dostępna w freeBSD.

Uwaga

Ten artykuł zawiera odwołania do terminu slave (element podrzędny), który nie jest już używany przez firmę Microsoft. Po usunięciu tego terminu z oprogramowania usuniemy go z tego artykułu.

Klejenie

Syntetyczny interfejs sieciowy i interfejs VF są automatycznie sparowane i działają jako pojedynczy interfejs w większości aspektów używanych przez aplikacje. Kierowca netvsc wykonuje wiązanie. W zależności od dystrybucji systemu Linux reguły i skrypty mogą pomóc w nazewnictwie interfejsu VF i konfigurowaniu sieci.

Jeśli maszyna wirtualna jest skonfigurowana z wieloma wirtualnymi kartami sieciowymi, host platformy Azure udostępnia unikatowy numer seryjny dla każdego z nich. Umożliwia to systemowi Linux właściwe parowanie syntetycznych i wirtualnych interfejsów VF dla każdej wirtualnej karty sieciowej.

Interfejsy syntetyczne i VF mają ten sam adres MAC. Razem stanowią one jedną kartę sieciową z punktu widzenia innych jednostek sieciowych, które wymieniają pakiety z wirtualną kartą sieciową na maszynie wirtualnej. Inne jednostki nie podejmują żadnych specjalnych akcji ze względu na istnienie zarówno interfejsu syntetycznego, jak i interfejsu VF.

Oba interfejsy są widoczne za pośrednictwem ifconfig polecenia lub ip addr w systemie Linux. Oto przykładowe ifconfig dane wyjściowe:

U1804:~$ ifconfig
enP53091s1np0: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST>  mtu 1500
ether 00:0d:3a:f5:76:bd  txqueuelen 1000  (Ethernet)
RX packets 365849  bytes 413711297 (413.7 MB)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 9447684  bytes 2206536829 (2.2 GB)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 10.1.19.4  netmask 255.255.255.0  broadcast 10.1.19.255
inet6 fe80::20d:3aff:fef5:76bd  prefixlen 64  scopeid 0x20<link>
ether 00:0d:3a:f5:76:bd  txqueuelen 1000  (Ethernet)
RX packets 8714212  bytes 4954919874 (4.9 GB)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 9103233  bytes 2183731687 (2.1 GB)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Interfejs syntetyczny zawsze ma nazwę w postaci eth\<n\>. W zależności od dystrybucji systemu Linux interfejs VF może mieć nazwę w postaci eth\<n\>. Może też mieć inną nazwę w postaci enP\<n\> z powodu reguły ujmowania, która zmienia nazwę.

Można określić, czy określony interfejs jest interfejsem syntetycznym, czy interfejsem VF przy użyciu wiersza polecenia powłoki, który pokazuje sterownik urządzenia używany przez interfejs:

$ ethtool -i <interface name> | grep driver

Jeśli sterownik to hv_netvsc, jest to interfejs syntetyczny. Interfejs VF ma nazwę sterownika, która zawiera "mlx". Interfejs VF jest również rozpoznawalny, ponieważ jego flags pole zawiera SLAVEwartość . Ta flaga wskazuje, że jest pod kontrolą syntetycznego interfejsu, który ma ten sam adres MAC.

Adresy IP są przypisywane tylko do interfejsu syntetycznego. Dane wyjściowe ifconfig lub ip addr również pokazują to rozróżnienie.

Użycie aplikacji

Aplikacje powinny współdziałać tylko z interfejsem syntetycznym, podobnie jak w każdym innym środowisku sieciowym. Wychodzące pakiety sieciowe są przekazywane ze sterownika netvsc do sterownika VF, a następnie przesyłane za pośrednictwem interfejsu VF.

Pakiety przychodzące są odbierane i przetwarzane w interfejsie VF przed przekazaniem do interfejsu syntetycznego. Wyjątki to przychodzące pakiety TCP SYN i pakiety emisji/multiemisji przetwarzane tylko przez interfejs syntetyczny.

Możesz sprawdzić, czy pakiety przepływają przez interfejs VF z danych wyjściowych ethtool -S eth\<n\>polecenia . Wiersze wyjściowe zawierające vf ruch przez interfejs VF. Na przykład:

U1804:~# ethtool -S eth0 | grep ' vf_'
 vf_rx_packets: 111180
 vf_rx_bytes: 395460237
 vf_tx_packets: 9107646
 vf_tx_bytes: 2184786508
 vf_tx_dropped: 0

Jeśli te liczniki są zwiększane przy kolejnym wykonaniu ethtool polecenia, ruch sieciowy przepływa przez interfejs VF.

Możesz sprawdzić istnienie interfejsu VF jako urządzenia PCI przy użyciu lspci polecenia . Na przykład na maszynie wirtualnej generacji 1 dane wyjściowe mogą być podobne do poniższych danych wyjściowych. (Maszyny wirtualne generacji 2 nie mają starszych urządzeń PCI).

U1804:~# lspci
0000:00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (AGP disabled) (rev 03)
0000:00:07.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 01)
0000:00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
0000:00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 02)
0000:00:08.0 VGA compatible controller: Microsoft Corporation Hyper-V virtual VGA
cf63:00:02.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function] (rev 80)

W tym przykładzie ostatni wiersz danych wyjściowych identyfikuje VF z fizycznej karty sieciowej Mellanox Połączenie X-4.

Polecenie ethtool -l or ethtool -L (aby pobrać i ustawić liczbę kolejek transmisji i odbierania) jest wyjątkiem od wskazówek dotyczących interakcji z interfejsem eth<n> . Tego polecenia można użyć bezpośrednio względem interfejsu VF, aby kontrolować liczbę kolejek dla interfejsu VF. Liczba kolejek dla interfejsu VF jest niezależna od liczby kolejek dla interfejsu syntetycznego.

Interpretowanie komunikatów uruchamiania

Podczas uruchamiania system Linux wyświetla wiele komunikatów związanych z inicjowaniem i konfiguracją interfejsu VF. Zawiera również informacje o wiązaniu z interfejsem syntetycznym. Zrozumienie tych komunikatów może być przydatne podczas identyfikowania wszelkich problemów w procesie.

Oto przykładowe dane wyjściowe polecenia dmesg , przycięte do tylko wierszy, które są istotne dla interfejsu programu VF. W zależności od wersji jądra systemu Linux i dystrybucji na maszynie wirtualnej komunikaty mogą się nieznacznie różnić, ale ogólny przepływ jest taki sam.

[    2.327663] hv_vmbus: registering driver hv_netvsc
[    3.918902] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF slot 1 added

Sterownik netvsc dla eth0 został zarejestrowany.

[    6.944883] hv_vmbus: registering driver hv_pci

Wirtualny sterownik PCI magistrali wirtualnej został zarejestrowany. Ten sterownik zapewnia podstawowe usługi PCI na maszynie wirtualnej z systemem Linux na platformie Azure. Należy zarejestrować go przed wykryciem i skonfigurowaniem interfejsu VF.

[    6.945132] hv_pci e9ac9b28-cf63-4466-9ae3-4b849c3ee03b: PCI VMBus probing: Using version 0x10002
[    6.947953] hv_pci e9ac9b28-cf63-4466-9ae3-4b849c3ee03b: PCI host bridge to bus cf63:00
[    6.947955] pci_bus cf63:00: root bus resource [mem 0xfe0000000-0xfe00fffff window]
[    6.948805] pci cf63:00:02.0: [15b3:1016] type 00 class 0x020000
[    6.957487] pci cf63:00:02.0: reg 0x10: [mem 0xfe0000000-0xfe00fffff 64bit pref]
[    7.035464] pci cf63:00:02.0: enabling Extended Tags
[    7.040811] pci cf63:00:02.0: 0.000 Gb/s available PCIe bandwidth, limited by Unknown x0 link at cf63:00:02.0 (capable of 63.008 Gb/s with 8.0 GT/s PCIe x8 link)
[    7.041264] pci cf63:00:02.0: BAR 0: assigned [mem 0xfe0000000-0xfe00fffff 64bit pref]

Wykryto urządzenie PCI z wyświetlonym identyfikatorem GUID (przypisanym przez hosta platformy Azure). Jest on przypisany identyfikator domeny PCI (0xcf63 w tym przypadku) na podstawie identyfikatora GUID. Identyfikator domeny PCI musi być unikatowy dla wszystkich urządzeń PCI dostępnych na maszynie wirtualnej. To wymaganie unikatowości obejmuje inne interfejsy VF mellanox, procesory GPU, urządzenia NVMe i inne urządzenia, które mogą znajdować się na maszynie wirtualnej.

[    7.128515] mlx5_core cf63:00:02.0: firmware version: 14.25.8362
[    7.139925] mlx5_core cf63:00:02.0: handle_hca_cap:524:(pid 12): log_max_qp value in current profile is 18, changing it to HCA capability limit (12)
[    7.342391] mlx5_core cf63:00:02.0: MLX5E: StrdRq(0) RqSz(1024) StrdSz(256) RxCqeCmprss(0)

Wykryto VF mellanox używający sterownika mlx5. Sterownik mlx5 rozpoczyna inicjowanie urządzenia.

[    7.465085] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF registering: eth1
[    7.465119] mlx5_core cf63:00:02.0 eth1: joined to eth0

Odpowiadający interfejs syntetyczny używający sterownika netvsc wykrył pasujący interfejs VF. Sterownik mlx5 rozpoznaje, że został związany z interfejsem syntetycznym.

[    7.466064] mlx5_core cf63:00:02.0 eth1: Disabling LRO, not supported in legacy RQ
[    7.480575] mlx5_core cf63:00:02.0 eth1: Disabling LRO, not supported in legacy RQ
[    7.480651] mlx5_core cf63:00:02.0 enP53091s1np0: renamed from eth1

Jądro systemu Linux początkowo nosiło nazwę interfejsu eth1VF. Zmieniono nazwę reguły udev, aby uniknąć pomyłek z nazwami nadanymi interfejsom syntetycznym.

[    8.087962] mlx5_core cf63:00:02.0 enP53091s1np0: Link up

Interfejs VF mellanox jest teraz aktywny i działa.

[    8.090127] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched to VF: enP53091s1np0
[    9.654979] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched from VF: enP53091s1np0

Te komunikaty wskazują, że ścieżka danych dla pary bonded została przełączona w celu korzystania z interfejsu VF. Około 1,6 sekundy później przełącza się z powrotem do interfejsu syntetycznego. Takie przełączniki mogą wystąpić dwa lub trzy razy w procesie uruchamiania i są normalnym zachowaniem podczas inicjowania konfiguracji.

[    9.909128] mlx5_core cf63:00:02.0 enP53091s1np0: Link up
[    9.910595] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched to VF: enP53091s1np0
[   11.411194] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched from VF: enP53091s1np0
[   11.532147] mlx5_core cf63:00:02.0 enP53091s1np0: Disabling LRO, not supported in legacy RQ
[   11.731892] mlx5_core cf63:00:02.0 enP53091s1np0: Link up
[   11.733216] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched to VF: enP53091s1np0

Końcowy komunikat wskazuje, że ścieżka danych została przełączona na użycie interfejsu VF. Oczekuje się, że podczas normalnego działania maszyny wirtualnej.

Obsługa hosta platformy Azure

Podczas obsługi hosta platformy Azure wszystkie interfejsy VF mogą zostać tymczasowo usunięte z maszyny wirtualnej. Po zakończeniu obsługi interfejsy VF są dodawane z powrotem do maszyny wirtualnej. Normalna operacja jest kontynuowana. Podczas gdy maszyna wirtualna działa bez interfejsów VF, ruch sieciowy nadal przepływa przez interfejs syntetyczny bez żadnych zakłóceń w aplikacjach.

W tym kontekście obsługa hosta platformy Azure może obejmować aktualizowanie składników infrastruktury sieciowej platformy Azure lub pełne uaktualnianie oprogramowania funkcji hypervisor hosta platformy Azure. Takie zdarzenia obsługi występują w interwałach czasu, które zależą od potrzeb operacyjnych infrastruktury platformy Azure. Te zdarzenia zwykle zdarzają się kilka razy w ciągu roku.

Automatyczne przełączanie między interfejsem VF a interfejsem syntetycznym zapewnia, że zdarzenia obsługi nie zakłócają obciążeń, jeśli aplikacje współdziałają tylko z interfejsem syntetycznym. Opóźnienia i obciążenie procesora CPU mogą być wyższe w tych okresach ze względu na użycie interfejsu syntetycznego. Czas trwania takich okresów wynosi zwykle około 30 sekund, ale czasami może to potrwać nawet kilka minut.

Usunięcie i odczytanie interfejsu VF podczas zdarzenia obsługi jest widoczne w dmesg danych wyjściowych maszyny wirtualnej. Oto typowe dane wyjściowe:

[   8160.911509] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched from VF: enP53091s1np0
[   8160.912120] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF unregistering: enP53091s1np0
[   8162.020138] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF slot 1 removed

Ścieżka danych została wyłączona z interfejsu VF, a interfejs VF został wyrejestrowany. W tym momencie system Linux usunął całą wiedzę na temat interfejsu VF i działa tak, jakby przyspieszona sieć nie została włączona.

[   8225.557263] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF slot 1 added
[   8225.557867] hv_pci e9ac9b28-cf63-4466-9ae3-4b849c3ee03b: PCI VMBus probing: Using version 0x10002
[   8225.566794] hv_pci e9ac9b28-cf63-4466-9ae3-4b849c3ee03b: PCI host bridge to bus cf63:00
[   8225.566797] pci_bus cf63:00: root bus resource [mem 0xfe0000000-0xfe00fffff window]
[   8225.571556] pci cf63:00:02.0: [15b3:1016] type 00 class 0x020000
[   8225.584903] pci cf63:00:02.0: reg 0x10: [mem 0xfe0000000-0xfe00fffff 64bit pref]
[   8225.662860] pci cf63:00:02.0: enabling Extended Tags
[   8225.667831] pci cf63:00:02.0: 0.000 Gb/s available PCIe bandwidth, limited by Unknown x0 link at cf63:00:02.0 (capable of 63.008 Gb/s with 8.0 GT/s PCIe x8 link)
[   8225.667978] pci cf63:00:02.0: BAR 0: assigned [mem 0xfe0000000-0xfe00fffff 64bit pref]

Po zakończeniu obsługi interfejsU VF zostanie wykryte nowe urządzenie PCI z określonym identyfikatorem GUID. Przypisano mu ten sam identyfikator domeny PCI (0xcf63), jak poprzednio. Obsługa odczytanego interfejsu VF przypomina obsługę podczas początkowego uruchamiania.

[   8225.679672] mlx5_core cf63:00:02.0: firmware version: 14.25.8362
[   8225.888476] mlx5_core cf63:00:02.0: MLX5E: StrdRq(0) RqSz(1024) StrdSz(256) RxCqeCmprss(0)
[   8226.021016] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF registering: eth1
[   8226.021058] mlx5_core cf63:00:02.0 eth1: joined to eth0
[   8226.021968] mlx5_core cf63:00:02.0 eth1: Disabling LRO, not supported in legacy RQ
[   8226.026631] mlx5_core cf63:00:02.0 eth1: Disabling LRO, not supported in legacy RQ
[   8226.026699] mlx5_core cf63:00:02.0 enP53091s1np0: renamed from eth1
[   8226.265256] mlx5_core cf63:00:02.0 enP53091s1np0: Link up

Sterownik mlx5 inicjuje interfejs VF, a interfejs jest teraz funkcjonalny. Dane wyjściowe są podobne do danych wyjściowych podczas początkowego uruchamiania.

[   8226.267380] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched to VF: enP53091s1np0

Ścieżka danych została przełączona z powrotem do interfejsu VF.

Wyłączanie lub włączanie przyspieszonej sieci na maszynie wirtualnej bez uruchamiania

Przy użyciu interfejsu wiersza polecenia platformy Azure można wyłączyć lub włączyć przyspieszoną sieć na wirtualnej karcie sieciowej na maszynie wirtualnej bez uruchamiania. Na przykład:

$ az network nic update --name u1804895 --resource-group testrg --accelerated-network false

Wyłączenie przyspieszonej sieci włączonej na maszynie wirtualnej gościa powoduje wygenerowanie dmesg danych wyjściowych. Jest to takie samo, jak w przypadku usunięcia interfejsu VF na potrzeby obsługi hosta platformy Azure. Włączenie przyspieszonej sieci generuje te same dmesg dane wyjściowe co w przypadku odczytu interfejsu VF po obsłudze hosta platformy Azure.

Za pomocą tych poleceń interfejsu wiersza polecenia platformy Azure można symulować obsługę hosta platformy Azure. Następnie możesz sprawdzić, czy aplikacje nie zależą niepoprawnie od bezpośredniej interakcji z interfejsem VF.

Następne kroki