كيف تعمل الشبكات المتسارعة في الأجهزة الظاهرية لـ Linux وFreeBSD

عند إنشاء جهاز ظاهري (VM) في Azure، يتم إنشاء واجهة شبكة اصطناعية لكل NIC ظاهري في تكوينه. الواجهة الاصطناعية هي جهاز VMbus وتستخدم برنامج تشغيل netvsc. تتدفق حزم الشبكة التي تستخدم هذه الواجهة الاصطناعية من خلال التبديل الظاهري في مضيف Azure وعلى الشبكة الفعلية لمركز البيانات.

إذا تم تكوين الجهاز الظاهري باستخدام Accelerated Networking، يتم إنشاء واجهة شبكة ثانية لكل NIC ظاهري تم تكوينه. الواجهة الثانية هي وظيفة ظاهرية SR-IOV (VF) تقدمها NIC للشبكة الفعلية في مضيف Azure. تظهر واجهة VF في ضيف Linux كجهاز PCI. ويستخدم برنامج تشغيل Mellanox mlx4 أو mlx5 في Linux، لأن مضيفي Azure يستخدمون بطاقات NIC الفعلية من Mellanox.

تنتقل معظم حزم الشبكة مباشرة بين ضيف Linux وNIC الفعلي دون اجتياز الشبكة الظاهرية أو أي برنامج آخر يعمل على المضيف. بسبب الوصول المباشر إلى الأجهزة، يكون زمن انتقال الشبكة أقل ويتم استخدام وقت أقل لوحدة المعالجة المركزية لمعالجة حزم الشبكة، بالمقارنة مع الواجهة الاصطناعية.

يستخدم مضيفو Azure المختلفون نماذج مختلفة من Mellanox physical NIC. يحدد Linux تلقائيا ما إذا كان سيستخدم برنامج تشغيل mlx4 أو mlx5. تتحكم البنية الأساسية ل Azure في موضع الجهاز الظاهري على مضيف Azure. مع عدم وجود خيار عميل لتحديد بطاقة NIC الفعلية التي يستخدمها توزيع الجهاز الظاهري، يجب أن تتضمن الأجهزة الظاهرية كلا برنامجي التشغيل. إذا تم إيقاف جهاز ظاهري أو إلغاء تخصيصه ثم إعادة تشغيله، فقد يتم إعادة توزيعه على الأجهزة باستخدام نموذج مختلف من Mellanox physical NIC. لذلك، قد يستخدم برنامج تشغيل Mellanox الآخر.

إذا لم تتضمن صورة الجهاز الظاهري برنامج تشغيل ل NIC المادية ل Mellanox، تستمر قدرات الشبكات في العمل بسرعات أبطأ ل NIC الظاهري. يعرض المدخل وAzure CLI وAzure PowerShell ميزة الشبكات المتسارعة كما تم تمكينها.

يوفر FreeBSD نفس الدعم ل Accelerated Networking مثل Linux عند تشغيله في Azure. يصف الجزء المتبقي من هذه المقالة Linux ويستخدم أمثلة Linux، ولكن تتوفر نفس الوظيفة في FreeBSD.

إشعار

تحتوي هذه المقالة على مراجع لمصطلح slave، وهو مصطلح لم تعد Microsoft تستخدمه. عند إزالة هذا المصطلح من البرنامج، بالتالي سنزيله من هذه المقالة.

الترابط

يتم إقران واجهة الشبكة الاصطناعية وواجهة VF تلقائيا وتعمل كواجهة واحدة في معظم الجوانب المستخدمة من قبل التطبيقات. يقوم برنامج تشغيل netvsc بالارتباط. اعتمادا على توزيع Linux، قد تساعد قواعد udev والبرامج النصية في تسمية واجهة VF وتكوين الشبكة.

إذا تم تكوين الجهاز الظاهري باستخدام بطاقات واجهة الشبكة (NIC) الظاهرية المتعددة، فإن مضيف Azure يوفر رقمًا تسلسليًا فريدًا لكل منها. يسمح ل Linux بالقيام بالاقتران المناسب لواجهات التركيبية و VF لكل NIC ظاهري.

الواجهات الاصطناعية و VF لها نفس عنوان MAC. معا، فإنها تشكل NIC واحدا من وجهة نظر كيانات الشبكة الأخرى التي تتبادل الحزم مع NIC الظاهري في الجهاز الظاهري. لا تتخذ الكيانات الأخرى أي إجراء خاص بسبب وجود كل من الواجهة الاصطناعية وواجهة VF.

كلتا الواجهتين مرئيتان عبر ifconfig الأمر أو ip addr في Linux. فيما يلي مثال ifconfig على الإخراج:

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

الواجهة الاصطناعية لها دائما اسم في النموذج eth\<n\>. اعتمادا على توزيع Linux، قد يكون لواجهة VF اسم في النموذج eth\<n\>. أو قد يكون لها اسم مختلف في شكل enP\<n\> بسبب قاعدة udev التي تقوم بإعادة التسمية.

يمكنك تحديد ما إذا كانت واجهة معينة هي الواجهة الاصطناعية أو واجهة VF باستخدام سطر أوامر shell الذي يعرض برنامج تشغيل الجهاز الذي تستخدمه الواجهة:

$ ethtool -i <interface name> | grep driver

إذا كان برنامج التشغيل هو hv_netvsc، فهي الواجهة الاصطناعية. تحتوي واجهة VF على اسم برنامج تشغيل يحتوي على "mlx". واجهة VF قابلة للتعريف أيضا لأن حقلها flags يتضمن SLAVE. تشير هذه العلامة إلى أنها تحت سيطرة الواجهة الاصطناعية التي لها نفس عنوان MAC.

يتم تعيين عناوين IP فقط إلى الواجهة الاصطناعية. ifconfig إخراج أو ip addr يظهر أيضا هذا التمييز.

استخدام التطبيق

يجب أن تتفاعل التطبيقات فقط مع الواجهة الاصطناعية، تمامًا كما هو الحال في أي بيئة شبكات أخرى. يتم تمرير حزم الشبكة الصادرة من برنامج تشغيل netvsc إلى برنامج تشغيل VF، ثم يتم إرسالها عبر واجهة VF.

يتم استلام الحزم الواردة ومعالجتها على واجهة VF قبل تمريرها إلى الواجهة الاصطناعية. الاستثناءات هي حزم TCP SYN الواردة وحزم البث/الإرسال المتعددة التي تعالجها الواجهة الاصطناعية فقط.

يمكنك التحقق من أن الحزم تتدفق عبر واجهة VF من إخراج ethtool -S eth\<n\>. تعرض خطوط الإخراج التي تحتوي على vf حركة المرور عبر واجهة VF. على سبيل المثال:

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

إذا كانت هذه العدادات تزيد على التنفيذ المتتالي ethtool للأمر، فإن حركة مرور الشبكة تتدفق عبر واجهة VF.

يمكنك التحقق من وجود واجهة VF كجهاز PCI باستخدام lspci الأمر . على سبيل المثال، على الجهاز الظاهري من الجيل 1، قد تحصل على إخراج مشابه للإخراج التالي. (لا تحتوي الأجهزة الظاهرية من الجيل 2 على أجهزة 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)

في هذا المثال، يحدد السطر الأخير من الإخراج VF من بطاقة واجهة الشبكة (NIC) المادية Mellanox ConnectX-4.

يعد ethtool -l الأمر أو ethtool -L (للحصول على عدد قوائم انتظار الإرسال والتلقي وتعيينه) استثناء للإرشادات للتفاعل مع الواجهة eth<n> . يمكنك استخدام هذا الأمر مباشرة مقابل واجهة VF للتحكم في عدد قوائم الانتظار لواجهة VF. عدد قوائم الانتظار لواجهة VF يستقل عن عدد قوائم الانتظار للواجهة الاصطناعية.

تفسير رسائل بدء التشغيل

أثناء بدء التشغيل، يعرض Linux العديد من الرسائل المتعلقة بتهيئة وتكوين واجهة VF. كما يظهر معلومات حول الترابط مع الواجهة الاصطناعية. يمكن أن يكون فهم هذه الرسائل مفيدًا في تحديد أي مشاكل في هذه العملية.

فيما يلي مثال على الإخراج من dmesg الأمر، تم اقتطاعه إلى الأسطر ذات الصلة بواجهة VF فقط. اعتمادا على إصدار Linux kernel وتوزيعه في الجهاز الظاهري الخاص بك، قد تختلف الرسائل قليلا، ولكن التدفق الكلي هو نفسه.

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

تم تسجيل برنامج تشغيل netvsc ل eth0 .

[    6.944883] hv_vmbus: registering driver hv_pci

تم تسجيل برنامج تشغيل PCI لـ VMbus الظاهري. يوفر برنامج التشغيل هذا خدمات PCI الأساسية في Linux VM في Azure. يجب عليك تسجيله قبل أن يتم الكشف عن واجهة 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]

تم اكتشاف جهاز PCI الذي يحتوي على المعرف الفريد العمومي المدرج (المعين من قِبل مضيف Azure). يتم تعيين معرف مجال PCI (0xcf63 في هذه الحالة) استنادًا إلى المعرف الفريد العمومي. يجب أن يكون معرف مجال PCI فريدًا عبر جميع أجهزة PCI المتوفرة في الجهاز الظاهري. يشمل شرط التفرد هذا واجهات Mellanox VF الأخرى ووحدات معالجة الرسومات وأجهزة NVMe والأجهزة الأخرى التي قد تكون موجودة في الجهاز الظاهري.

[    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 الذي يستخدم برنامج تشغيل mlx5. يبدأ برنامج تشغيل mlx5 تهيئة الجهاز.

[    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 VF مطابقا. يتعرف برنامج تشغيل mlx5 على أنه تم ربطه بالواجهة الاصطناعية.

[    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 في البداية بواجهة eth1VF . إعادة تسمية قاعدة udev لتجنب الارتباك مع الأسماء المعطاة للواجهات الاصطناعية.

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

تعد واجهة Mellanox VF الآن قيد التشغيل ونشطة.

[    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

تشير هذه الرسائل إلى أن مسار البيانات للزوج المرتبط قد تم تبديله لاستخدام واجهة VF. بعد حوالي 1.6 ثانية، فإنه يتحول مرة أخرى إلى الواجهة الاصطناعية. قد تحدث مفاتيح التبديل هذه مرتين أو ثلاث مرات أثناء عملية بدء التشغيل وهي سلوك عادي أثناء تهيئة التكوين.

[    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

تشير الرسالة النهائية إلى أن مسار البيانات قد تحول إلى استخدام واجهة VF. ويتوقع ذلك أثناء التشغيل العادي للجهاز الظاهري.

خدمة مضيف Azure

أثناء خدمة مضيف Azure، قد تتم إزالة جميع واجهات VF مؤقتا من الجهاز الظاهري. عند اكتمال الخدمة، تتم إضافة واجهات VF مرة أخرى إلى الجهاز الظاهري. تستمر العملية العادية. بينما يعمل الجهاز الظاهري بدون واجهات VF، تستمر نسبة استخدام الشبكة في التدفق عبر الواجهة الاصطناعية دون أي انقطاع في التطبيقات.

في هذا السياق، قد تتضمن خدمة مضيف Azure تحديث مكونات البنية الأساسية لشبكة Azure أو ترقية برنامج Hypervisor لمضيف Azure بشكل كامل. تحدث أحداث الخدمة هذه على فترات زمنية تعتمد على الاحتياجات التشغيلية للبنية الأساسية ل Azure. تحدث هذه الأحداث عادة عدة مرات على مدار السنة.

يضمن التبديل التلقائي بين واجهة VF والواجهة الاصطناعية أن أحداث الخدمة لا تزعج أحمال العمل إذا كانت التطبيقات تتفاعل فقط مع الواجهة الاصطناعية. قد تكون زمن الانتقال وتحميل وحدة المعالجة المركزية أعلى خلال هذه الفترات بسبب استخدام الواجهة الاصطناعية. عادة ما تكون مدة مثل هذه الفترات حوالي 30 ثانية ولكن في بعض الأحيان قد تصل إلى بضع دقائق.

تظهر إزالة واجهة VF وقراءتها أثناء حدث الخدمة في dmesg الإخراج في الجهاز الظاهري. فيما يلي الإخراج النموذجي:

[   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

تم تحويل مسار البيانات بعيدًا عن واجهة VF، وتم إلغاء تسجيل واجهة VF. في هذه المرحلة، أزال Linux كل المعرفة بواجهة VF، ويعمل كما لو لم يتم تمكين الشبكة المتسارعة.

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

عند إعادة إضافة واجهة VF بعد اكتمال الخدمة، يتم الكشف عن جهاز PCI جديد مع GUID المحدد. تم تعيين نفس معرف مجال PCI (0xcf63) كما كان من قبل. التعامل مع واجهة VF المقروءة مثل المعالجة أثناء بدء التشغيل الأولي.

[   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 بتهيئة واجهة VF، وتعمل الواجهة الآن. الإخراج مشابه للإخراج أثناء بدء التشغيل الأولي.

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

تم تحويل مسار البيانات مرة أخرى إلى واجهة VF.

تعطيل الشبكات المسرعة أو تمكينها في جهاز ظاهري غير مRunning

يمكنك تعطيل أو تمكين الشبكات المسرعة على NIC ظاهري في جهاز ظاهري غير مRunning باستخدام Azure CLI. على سبيل المثال:

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

يؤدي تعطيل الشبكات المسرعة التي تم تمكينها في الجهاز الظاهري الضيف dmesg إلى إخراج. ويحدث نفس الشيء عند إزالة واجهة VF لخدمة مضيف Azure. يؤدي تمكين الشبكات المتسارعة إلى إنتاج نفس dmesg الإخراج كما هو الحال عند إعادة إضافة واجهة VF بعد خدمة مضيف Azure.

يمكنك استخدام أوامر Azure CLI هذه لمحاكاة خدمة مضيف Azure. يمكنك بعد ذلك التحقق من أن تطبيقاتك لا تعتمد بشكل غير صحيح على التفاعل المباشر مع واجهة VF.

الخطوات التالية