Hızlandırılmış Ağ'ın Linux ve FreeBSD VM'lerinde çalışması

Azure'da bir sanal makine (VM) oluşturulduğunda, yapılandırmasındaki her sanal NIC için yapay bir ağ arabirimi oluşturulur. Yapay arabirim bir VMbus cihazıdır ve netvsc sürücüsünü kullanır. Bu yapay arabirimi kullanan ağ paketleri, Azure konağındaki sanal anahtar üzerinden ve veri merkezinin fiziksel ağına akar.

VM Hızlandırılmış Ağ ile yapılandırılmışsa, yapılandırılan her sanal NIC için ikinci bir ağ arabirimi oluşturulur. İkinci arabirim, Azure konağında fiziksel ağın NIC'sinin sunduğu bir SR-IOV sanal işlevidir (VF). VF arabirimi, Linux konuğunda PCI cihazı olarak gösterilir. Azure konakları Mellanox'un fiziksel NIC'lerini kullandığından, Linux'ta Mellanox mlx4 veya mlx5 sürücüsünü kullanır.

Çoğu ağ paketi, sanal anahtardan veya konakta çalışan diğer yazılımdan geçmeden doğrudan Linux konuğu ile fiziksel NIC arasında gider. Donanıma doğrudan erişim nedeniyle ağ gecikme süresi daha düşüktür ve yapay arabirimle karşılaştırıldığında ağ paketlerini işlemek için daha az CPU süresi kullanılır.

Farklı Azure konakları mellanox fiziksel NIC'nin farklı modellerini kullanır. Linux, mlx4 veya mlx5 sürücüsünün kullanılıp kullanılmayacağını otomatik olarak belirler. Azure altyapısı, VM'nin Azure konağına yerleştirilmesini denetler. Bir VM dağıtımının hangi fiziksel NIC'yi kullandığını belirtmek için müşteri seçeneği olmadığında, VM'lerin her iki sürücüyü de içermesi gerekir. Vm durdurulursa veya serbest bırakılırsa ve sonra yeniden başlatılırsa, farklı bir Mellanox fiziksel NIC modeline sahip donanımda yeniden dağıtılabilir. Bu nedenle, diğer Mellanox sürücüsünü kullanabilir.

Bir VM görüntüsü Mellanox fiziksel NIC için bir sürücü içermiyorsa, ağ özellikleri sanal NIC'nin daha düşük hızlarında çalışmaya devam eder. Portal, Azure CLI ve Azure PowerShell, Hızlandırılmış Ağ özelliğini etkin olarak görüntüler.

FreeBSD, Azure'da çalışırken Linux ile Hızlandırılmış Ağ için aynı desteği sağlar. Bu makalenin geri kalanında Linux açıklanır ve Linux örnekleri kullanılır, ancak aynı işlevsellik FreeBSD'de de kullanılabilir.

Dekont

Bu makalede, Microsoft'un artık kullanmadığı köle terimi geçmektedir. Bu terim yazılımdan kaldırıldığında, bu makaleden kaldıracağız.

Yapıştırma

Yapay ağ arabirimi ve VF arabirimi, uygulamalar tarafından kullanılan çoğu açıdan otomatik olarak eşleştirilir ve tek bir arabirim işlevi görür. Netvsc sürücüsü bağlanmayı yapar. Linux dağıtımına bağlı olarak, udev kuralları ve betikleri VF arabirimini adlandırmaya ve ağı yapılandırmaya yardımcı olabilir.

VM birden çok sanal NIC ile yapılandırılmışsa, Azure konağı her biri için benzersiz bir seri numarası sağlar. Linux'un her sanal NIC için yapay ve VF arabirimlerinin düzgün bir şekilde eşlemesini sağlar.

Yapay ve VF arabirimleri aynı MAC adresine sahiptir. Birlikte, vm'deki sanal NIC ile paket alışverişinde bulunan diğer ağ varlıkları açısından tek bir NIC oluştururlar. Diğer varlıklar, hem yapay arabirimin hem de VF arabiriminin varlığı nedeniyle özel bir işlem gerçekleştirmez.

Her iki arabirim de Linux'ta ifconfig veya ip addr komutuyla görünür. Aşağıda örnek ifconfig bir çıkış verilmişti:

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

Yapay arabirimin her zaman biçiminde eth\<n\>bir adı vardır. Linux dağıtımına bağlı olarak, VF arabiriminin biçiminde eth\<n\>bir adı olabilir. Veya yeniden adlandırmayı kullanan bir udev kuralı nedeniyle biçiminde enP\<n\> farklı bir ada sahip olabilir.

Arabirimin kullandığı cihaz sürücüsünü gösteren kabuk komut satırını kullanarak belirli bir arabirimin yapay arabirim mi yoksa VF arabirimi mi olduğunu belirleyebilirsiniz:

$ ethtool -i <interface name> | grep driver

Sürücü ise hv_netvsc, yapay arabirimdir. VF arabiriminde "mlx" içeren bir sürücü adı vardır. VF arabirimi de alanı içerdiğinden flagsSLAVEtanımlanabilir. Bu bayrak, aynı MAC adresine sahip yapay arabirimin denetimi altında olduğunu gösterir.

IP adresleri yalnızca yapay arabirime atanır. veya ip addr çıktısı ifconfig da bu ayrımı gösterir.

Uygulama kullanımı

Uygulamalar, diğer ağ ortamlarında olduğu gibi yalnızca yapay arabirimle etkileşim kurmalıdır. Giden ağ paketleri netvsc sürücüsünden VF sürücüsüne geçirilir ve ardından VF arabirimi aracılığıyla iletilir.

Gelen paketler yapay arabirime geçirilmeden önce VF arabiriminde alınır ve işlenir. Özel durumlar, yalnızca yapay arabirim tarafından işlenen gelen TCP SYN paketleri ve yayın/çok noktaya yayın paketleridir.

Çıktısından ethtool -S eth\<n\>paketlerin VF arabirimi üzerinden aktığını doğrulayabilirsiniz. İçeren vf çıkış satırları, VF arabirimi üzerindeki trafiği gösterir. Örneğin:

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

Bu sayaçlar komutun ardışık yürütülmesinde ethtool artırılıyorsa, ağ trafiği VF arabirimi üzerinden akıyor demektir.

komutunu kullanarak lspci VF arabiriminin PCI cihazı olarak varlığını doğrulayabilirsiniz. Örneğin, 1. Nesil VM'de aşağıdaki çıkışa benzer bir çıkış alabilirsiniz. (2. nesil VM'lerde eski PCI cihazları yoktur.)

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)

Bu örnekte, çıkışın son satırı Mellanox Bağlan X-4 fiziksel NIC'sinden bir VF tanımlar.

ethtool -l veya ethtool -L komutu (iletim ve alma kuyruklarının sayısını almak ve ayarlamak için) arabirimle eth<n> etkileşime geçmek için rehberliğe özel bir durumdur. Bu komutu doğrudan VF arabiriminde kullanarak VF arabiriminin kuyruk sayısını denetleyebilirsiniz. VF arabirimi için kuyruk sayısı, yapay arabirim için kuyruk sayısından bağımsızdır.

Başlangıç iletilerini yorumlama

Başlatma sırasında Linux, VF arabiriminin başlatılması ve yapılandırılması ile ilgili birçok ileti gösterir. Ayrıca sentetik arayüz ile bağlanma hakkında bilgi gösterir. Bu iletileri anlamak, süreçteki sorunları tanımlamada yararlı olabilir.

Aşağıda komutundan yalnızca VF arabirimiyle dmesg ilgili satırlara kırpılmış örnek çıktı verilmiştir. VM'nizdeki Linux çekirdek sürümüne ve dağıtımına bağlı olarak, iletiler biraz farklılık gösterebilir, ancak genel akış aynıdır.

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

için eth0 netvsc sürücüsü kaydedildi.

[    6.944883] hv_vmbus: registering driver hv_pci

VMbus sanal PCI sürücüsü kaydedildi. Bu sürücü, Azure'daki bir Linux VM'sinde temel PCI hizmetleri sağlar. VF arabiriminin algılanıp yapılandırılabilmesi için önce bunu kaydetmeniz gerekir.

[    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]

Listelenen GUID'ye (Azure konağı tarafından atanan) sahip PCI cihazı algılandı. GUID temelinde bir PCI etki alanı kimliği (bu örnekte 0xcf63) atanır. PCI etki alanı kimliği, VM'de bulunan tüm PCI cihazlarında benzersiz olmalıdır. Bu benzersizlik gereksinimi diğer Mellanox VF arabirimlerini, GPU'ları, NVMe cihazlarını ve VM'de mevcut olabilecek diğer cihazları içerir.

[    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)

mlx5 sürücüsünü kullanan bir Mellanox VF algılandı. mlx5 sürücüsü cihazın başlatılmasına başlar.

[    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

netvsc sürücüsünü kullanan ilgili yapay arabirim, eşleşen bir VF algılamıştır. mlx5 sürücüsü, sentetik arabirimle bağlandığını fark eder.

[    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

Linux çekirdeği başlangıçta VF arabirimi eth1olarak adlandırılır. Bir udev kuralı, yapay arabirimlere verilen adlarla karışıklığı önlemek için kuralı yeniden adlandırdı.

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

Mellanox VF arabirimi artık çalışır durumda.

[    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

Bu iletiler, bağlı çift için veri yolunun VF arabirimini kullanmaya geçtiğini gösterir. Yaklaşık 1,6 saniye sonra yapay arabirime geri döner. Bu tür anahtarlar başlatma işlemi sırasında iki veya üç kez gerçekleşebilir ve yapılandırma başlatıldığında normal davranıştır.

[    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

Son ileti, veri yolunun VF arabirimini kullanmaya geçtiğini gösterir. Vm'nin normal çalışma sırasında olması beklenir.

Azure ana bilgisayar hizmeti

Azure ana bilgisayar hizmeti sırasında tüm VF arabirimleri vm'den geçici olarak kaldırılabilir. Hizmet tamamlandığında, VF arabirimleri VM'ye geri eklenir. Normal işlem devam eder. SANAL makine VF arabirimleri olmadan çalışırken, ağ trafiği uygulamalarda herhangi bir kesinti olmadan yapay arabirim üzerinden akmaya devam eder.

Bu bağlamda Azure ana bilgisayar hizmeti, Azure ağ altyapısının bileşenlerini güncelleştirmeyi veya Azure ana bilgisayar hiper yöneticisi yazılımını tam olarak yükseltmeyi içerebilir. Bu tür hizmet olayları, Azure altyapısının operasyonel gereksinimlerine bağlı olan zaman aralıklarında gerçekleşir. Bu olaylar genellikle bir yıl boyunca birkaç kez gerçekleşir.

VF arabirimi ile yapay arabirim arasında otomatik geçiş, uygulamalar yalnızca yapay arabirimle etkileşime geçtiğinde hizmet olaylarının iş yüklerini rahatsız etmemesini sağlar. Yapay arabirimin kullanılması nedeniyle bu dönemlerde gecikme süreleri ve CPU yükü daha yüksek olabilir. Bu tür sürelerin süresi genellikle yaklaşık 30 saniyedir, ancak bazen birkaç dakika kadar sürebilir.

Bir bakım olayı sırasında VF arabiriminin kaldırılması ve okunması VM'deki çıktıda dmesg görünür. İşte tipik çıkış:

[   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

Veri yolu VF arabiriminden uzaklaştırıldı ve VF arabiriminin kaydı kaldırıldı. Bu noktada Linux, VF arabirimiyle ilgili tüm bilgileri kaldırmıştır ve Hızlandırılmış Ağ etkinleştirilmemiş gibi çalışır.

[   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]

Hizmet tamamlandıktan sonra VF arabirimi okunduğunda, belirtilen GUID'ye sahip yeni bir PCI cihazı algılanır. Daha önce olduğu gibi aynı PCI etki alanı kimliğine (0xcf63) atanır. Okunan VF arabiriminin işlenmesi, ilk başlatma sırasındaki işlemeye benzer.

[   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

mlx5 sürücüsü VF arabirimini başlatır ve arabirim artık işlevseldir. Çıkış, ilk başlatma sırasındaki çıkışa benzer.

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

Veri yolu VF arabirimine geri döndürülmüştür.

Çalıştırılmayan bir VM'de Hızlandırılmış Ağ'ı devre dışı bırakma veya etkinleştirme

Azure CLI kullanarak çalıştırılmayan bir VM'deki sanal NIC'de Hızlandırılmış Ağ'ı devre dışı bırakabilir veya etkinleştirebilirsiniz. Örneğin:

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

Konuk VM'de etkinleştirilen Hızlandırılmış Ağ'ın devre dışı bırakılması bir dmesg çıkış oluşturur. Bu, Azure ana bilgisayar bakımı için VF arabiriminin kaldırıldığı durumla aynıdır. Hızlandırılmış Ağ'ın etkinleştirilmesi, Azure ana bilgisayar bakımı sonrasında VF arabiriminin okunduğu durumla aynı dmesg çıkışı oluşturur.

Azure ana bilgisayar hizmeti simülasyonu yapmak için bu Azure CLI komutlarını kullanabilirsiniz. Daha sonra uygulamalarınızın yanlışlıkla VF arabirimiyle doğrudan etkileşime bağımlı olmadığını doğrulayabilirsiniz.

Sonraki adımlar

  • PowerShell'de Hızlandırılmış Ağ ile VM oluşturmayı öğrenin.
  • Azure CLI kullanarak Hızlandırılmış Ağ ile VM oluşturmayı öğrenin.
  • Azure yakınlık yerleştirme grubuyla gecikme süresini geliştirin.