Bagikan melalui


Cara Kerja Jaringan yang Dipercepat di VM Linux dan FreeBSD

Saat komputer virtual (VM) dibuat di Azure, antarmuka jaringan sintetis dibuat untuk setiap NIC virtual dalam konfigurasinya. Antarmuka sintetis adalah perangkat VMbus dan menggunakan driver netvsc. Paket jaringan yang menggunakan alur antarmuka sintetis ini melalui sakelar virtual di host Azure dan ke jaringan fisik pusat data.

Jika VM dikonfigurasi dengan Accelerated Networking, antarmuka jaringan kedua dibuat untuk setiap NIC virtual yang dikonfigurasi. Antarmuka kedua adalah fungsi virtual SR-IOV (VF) yang ditawarkan oleh NIC jaringan fisik di host Azure. Antarmuka VF muncul di tamu Linux sebagai perangkat PCI. Ini menggunakan driver Mellanox mlx4 atau mlx5 di Linux, karena host Azure menggunakan NIC fisik dari Mellanox.

Sebagian besar paket jaringan langsung berjalan antara tamu Linux dan NIC fisik tanpa melintasi sakelar virtual atau perangkat lunak lain yang berjalan pada host. Karena akses langsung ke perangkat keras, latensi jaringan lebih rendah dan lebih sedikit waktu CPU digunakan untuk memproses paket jaringan, jika dibandingkan dengan antarmuka sintetis.

Host Azure yang berbeda menggunakan model NIC fisik Mellanox yang berbeda. Linux secara otomatis menentukan apakah akan menggunakan driver mlx4 atau mlx5. Infrastruktur Azure mengontrol penempatan VM pada host Azure. Tanpa opsi pelanggan untuk menentukan NIC fisik mana yang digunakan penyebaran VM, VM harus menyertakan kedua driver. Jika VM dihentikan atau dibatalkan alokasinya lalu dihidupkan ulang, VM mungkin disebarkan ulang pada perangkat keras dengan model NIC fisik Mellanox yang berbeda. Oleh karena itu, mungkin menggunakan driver Mellanox lainnya.

Jika gambar VM tidak menyertakan driver untuk NIC fisik Mellanox, kemampuan jaringan terus bekerja pada kecepatan NIC virtual yang lebih lambat. Portal, Azure CLI, dan Azure PowerShell menampilkan fitur Jaringan Dipercepat sebagai diaktifkan.

FreeBSD menyediakan dukungan yang sama untuk Accelerated Networking sebagai Linux saat berjalan di Azure. Sisa artikel ini menjelaskan Linux dan menggunakan contoh Linux, tetapi fungsi yang sama tersedia di FreeBSD.

Catatan

Artikel ini berisi referensi ke istilah slave, istilah yang tidak lagi digunakan Microsoft. Ketika istilah ini dihapus dari perangkat lunak, kami akan menghapusnya dari artikel ini.

Ikatan

Antarmuka jaringan sintetis dan antarmuka VF secara otomatis dipasangkan dan bertindak sebagai antarmuka tunggal di sebagian besar aspek yang digunakan oleh aplikasi. Driver netvsc melakukan ikatan. Bergantung pada distribusi Linux, aturan dan skrip udev mungkin membantu dalam penamaan antarmuka VF dan dalam mengonfigurasi jaringan.

Jika VM dikonfigurasi dengan beberapa NIC virtual, host Azure menyediakan nomor seri unik untuk masing-masing. Ini memungkinkan Linux untuk melakukan pemasangan antarmuka sintetis dan VF yang tepat untuk setiap NIC virtual.

Antarmuka sintetis dan VF memiliki alamat MAC yang sama. Bersama-sama, mereka merupakan satu NIC dari sudut sikap entitas jaringan lain yang bertukar paket dengan NIC virtual di VM. Entitas lain tidak mengambil tindakan khusus karena keberadaan antarmuka sintetis dan VF.

Kedua antarmuka terlihat melalui ifconfig perintah atau ip addr di Linux. Berikut adalah contoh ifconfig output:

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

Antarmuka sintetis selalu memiliki nama dalam bentuk eth\<n\>. Tergantung pada distribusi Linux, antarmuka VF mungkin memiliki nama dalam formulir eth\<n\>. Atau mungkin memiliki nama yang berbeda dalam bentuk enP\<n\> karena aturan udev yang mengganti nama.

Anda dapat menentukan apakah antarmuka tertentu adalah antarmuka sintetis atau antarmuka VF dengan menggunakan baris perintah shell yang menunjukkan driver perangkat yang digunakan antarmuka:

$ ethtool -i <interface name> | grep driver

Jika driver adalah hv_netvsc, itu adalah antarmuka sintetis. Antarmuka VF memiliki nama driver yang berisi "mlx." Antarmuka VF juga dapat diidentifikasi karena bidangnya flags mencakup SLAVE. Bendera ini menunjukkan bahwa ia berada di bawah kendali antarmuka sintetis yang memiliki alamat MAC yang sama.

Alamat IP hanya ditetapkan ke antarmuka sintetis. Output ifconfig dari atau ip addr juga menunjukkan perbedaan ini.

Penggunaan aplikasi

Aplikasi harus berinteraksi hanya dengan antarmuka sintetis, seperti di lingkungan jaringan lainnya. Paket jaringan keluar diteruskan dari driver netvsc ke driver VF dan kemudian ditransmisikan melalui antarmuka VF.

Paket yang masuk diterima dan diproses pada antarmuka VF sebelum diteruskan ke antarmuka sintetis. Pengecualian adalah paket SYN TCP masuk dan paket siaran/multicast yang diproses oleh antarmuka sintetis saja.

Anda dapat memverifikasi bahwa paket mengalir melalui antarmuka VF dari output ethtool -S eth\<n\>. Baris output yang berisi vf menunjukkan lalu lintas melalui antarmuka VF. Contohnya:

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

Jika penghitung ini bertahap pada eksekusi ethtool perintah berturut-turut, lalu lintas jaringan mengalir melalui antarmuka VF.

Anda dapat memverifikasi keberadaan antarmuka VF sebagai perangkat PCI dengan menggunakan lspci perintah . Misalnya, pada VM Generasi 1, Anda mungkin mendapatkan output yang mirip dengan output berikut. (VM Generasi 2 tidak memiliki perangkat PCI warisan.)

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)

Dalam contoh ini, garis output terakhir mengidentifikasi VF dari Mellanox ConnectX-4 NIC fisik.

ethtool -l Perintah atau ethtool -L (untuk mendapatkan dan mengatur jumlah antrean pengiriman dan penerimaan) adalah pengecualian untuk panduan untuk berinteraksi dengan eth<n> antarmuka. Anda dapat menggunakan perintah ini secara langsung terhadap antarmuka VF untuk mengontrol jumlah antrean untuk antarmuka VF. Jumlah antrian untuk antarmuka VF tidak tergantung pada jumlah antrian untuk antarmuka sintetis.

Menginterpretasikan pesan startup

Selama startup, Linux menunjukkan banyak pesan yang terkait dengan inisialisasi dan konfigurasi antarmuka VF. Ini juga menunjukkan informasi tentang ikatan dengan antarmuka sintetis. Memahami pesan-pesan ini dapat membantu dalam mengidentifikasi masalah dalam prosesnya.

Berikut adalah contoh output dari dmesg perintah, dipangkas menjadi hanya baris yang relevan dengan antarmuka VF. Tergantung pada versi kernel Linux dan distribusi di VM Anda, pesan mungkin sedikit berbeda, tetapi alur keseluruhannya sama.

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

Driver netvsc untuk eth0 telah didaftarkan.

[    6.944883] hv_vmbus: registering driver hv_pci

Driver PCI virtual VMbus telah terdaftar. Driver ini menyediakan layanan PCI inti di VM Linux di Azure. Anda harus mendaftarkannya sebelum antarmuka VF dapat dideteksi dan dikonfigurasi.

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

Perangkat PCI dengan GUID yang terdaftar (ditetapkan oleh host Azure) telah terdeteksi. Ini ditetapkan ID domain PCI (0xcf63 dalam hal ini) berdasarkan GUID. ID domain PCI harus unik di semua perangkat PCI yang tersedia di VM. Persyaratan keunikan ini mencakup antarmuka Mellanox VF lainnya, GPU, perangkat NVMe, dan perangkat lain yang mungkin ada di VM.

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

Mellanox VF yang menggunakan driver mlx5 telah terdeteksi. Driver mlx5 memulai inisialisasi perangkat.

[    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

Antarmuka sintetis terkait yang menggunakan driver netvsc telah mendeteksi VF yang cocok. Driver MLX5 mengenali bahwa ia telah terikat dengan antarmuka sintetis.

[    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

Kernel Linux awalnya bernama antarmuka eth1VF . Aturan udev mengganti namanya untuk menghindari kebingungan dengan nama yang diberikan ke antarmuka sintetis.

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

Antarmuka Mellanox VF sekarang siap dan aktif.

[    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

Pesan-pesan ini menunjukkan bahwa jalur data untuk pasangan terikat telah beralih menggunakan antarmuka VF. Sekitar 1,6 detik kemudian, ia beralih kembali ke antarmuka sintetis. Sakelar tersebut mungkin terjadi dua atau tiga kali selama proses startup dan merupakan perilaku normal saat konfigurasi diinisialisasi.

[    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

Pesan terakhir menunjukkan bahwa jalur data telah beralih menggunakan antarmuka VF. Ini diharapkan selama operasi normal VM.

Layanan host Azure

Selama layanan host Azure, semua antarmuka VF mungkin dihapus sementara dari VM. Ketika layanan selesai, antarmuka VF ditambahkan kembali ke VM. Operasi normal berlanjut. Sementara VM beroperasi tanpa antarmuka VF, lalu lintas jaringan terus mengalir melalui antarmuka sintetis tanpa gangguan pada aplikasi.

Dalam konteks ini, layanan host Azure mungkin termasuk memperbarui komponen infrastruktur jaringan Azure atau sepenuhnya meningkatkan perangkat lunak hypervisor host Azure. Peristiwa layanan semacam itu terjadi pada interval waktu yang bergantung pada kebutuhan operasional infrastruktur Azure. Peristiwa ini biasanya terjadi beberapa kali selama setahun.

Peralihan otomatis antara antarmuka VF dan antarmuka sintetis memastikan bahwa peristiwa layanan tidak mengganggu beban kerja jika aplikasi hanya berinteraksi dengan antarmuka sintetis. Latensi dan beban CPU mungkin lebih tinggi selama periode ini karena penggunaan antarmuka sintetis. Durasi periode tersebut biasanya sekitar 30 detik tetapi terkadang mungkin selama beberapa menit.

Penghapusan dan pembacaan antarmuka VF selama peristiwa layanan terlihat dalam dmesg output di VM. Berikut adalah output khas:

[   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

Jalur data telah dialihkan dari antarmuka VF, dan antarmuka VF tidak terdaftar. Pada titik ini, Linux telah menghapus semua pengetahuan tentang antarmuka VF dan beroperasi seolah-olah Jaringan yang Dipercepat tidak diaktifkan.

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

Ketika antarmuka VF dibaca setelah layanan selesai, perangkat PCI baru dengan GUID yang ditentukan terdeteksi. Ini diberi ID domain PCI yang sama (0xcf63) seperti sebelumnya. Penanganan antarmuka VF yang dibaca seperti penanganan selama startup awal.

[   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

Driver mlx5 menginisialisasi antarmuka VF, dan antarmuka sekarang berfungsi. Outputnya mirip dengan output selama startup awal.

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

Jalur data telah dialihkan kembali ke antarmuka VF.

Menonaktifkan atau mengaktifkan Jaringan Terakselerasi dalam VM yang tidak menyeluruh

Anda dapat menonaktifkan atau mengaktifkan Jaringan Terakselerasi pada NIC virtual di VM yang tidak berjalan dengan menggunakan Azure CLI. Contohnya:

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

Menonaktifkan Jaringan Dipercepat yang diaktifkan di VM tamu menghasilkan dmesg output. Ini sama seperti ketika antarmuka VF dihapus untuk servis host Azure. Mengaktifkan Jaringan Terakselerasi menghasilkan output yang sama dmesg seperti ketika antarmuka VF dibaca setelah layanan host Azure.

Anda dapat menggunakan perintah Azure CLI ini untuk mensimulasikan layanan host Azure. Anda kemudian dapat memverifikasi bahwa aplikasi Anda tidak salah bergantung pada interaksi langsung dengan antarmuka VF.

Langkah berikutnya