مشاركة عبر


تحسين سرعة نقل الشبكة للأجهزة الظاهرية لـ Azure

تحتوي أجهزة Azure الظاهرية (VMs) على إعدادات شبكة افتراضية يمكن تحسينها بشكل أكبر لمعدل نقل الشبكة. توضح هذه المقالة كيفية تحسين معدل نقل الشبكة لأجهزة Windows وLinux الظاهرية، بما في ذلك التوزيعات الرئيسية مثل Ubuntu وRed Hat.

أجهزة Windows الظاهرية

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

بالنسبة لجميع أجهزة Windows الظاهرية الأخرى، يمكن أن يصل استخدام تغيير حجم جانب التلقي (RSS) إلى معدل نقل أقصى أعلى من الجهاز الظاهري بدون RSS. قد يتم تعطيل RSS بشكل افتراضي في Windows VM. للتحقق مما إذا كان RSS ممكنا وتمكينه، اتبع الخطوات التالية:

  1. تحقق مما إذا تم تمكين RSS لمحول شبكة باستخدام الأمر Get-NetAdapterRss PowerShell. في المثال التالي، لم يتم تمكين الإخراج الذي تم إرجاعه من Get-NetAdapterRss RSS.

    Name                    : Ethernet
    InterfaceDescription    : Microsoft Hyper-V Network Adapter
    Enabled                 : False
    
  2. لتمكين RSS، أدخل الأمر التالي:

    Get-NetAdapter | % {Enable-NetAdapterRss -Name $_.Name}
    

    لا يحتوي هذا الأمر على إخراج. يغير الأمر إعدادات بطاقة واجهة الشبكة (NIC). يتسبب في فقدان الاتصال المؤقت لمدة دقيقة واحدة تقريبا. يظهر مربع حوار إعادة الاتصال أثناء فقدان الاتصال. عادة ما يُستعاد الاتصال بعد المحاولة الثالثة.

  3. تأكد من تمكين RSS في الجهاز الظاهري عن طريق إدخال الأمر Get-NetAdapterRss مرة أخرى. إذا نجح الأمر، فسيظهر إخراج المثال التالي:

    Name                    : Ethernet
    InterfaceDescription    : Microsoft Hyper-V Network Adapter
    Enabled                 : True
    

أجهزة Linux الظاهرية

يتم تمكين RSS دائما بشكل افتراضي في جهاز Linux الظاهري (VM) في Azure. تتضمن إصدارات Linux kernels منذ أكتوبر 2017 خيارات تحسين الشبكة الجديدة التي تُمكن جهاز Linux الظاهري من تحقيق معدل نقل أعلى للشبكة.

تمكين Azure Accelerated Networking لتحقيق الإنتاجية المثلى

يوفر Azure شبكة متسارعة يمكنها تحسين أداء الشبكة وزمن الانتقال والتشويه. هناك حاليا اثنين من التقنيات المختلفة التي تستخدم اعتمادا على حجم الجهاز الظاهري، ميلانوكس الذي هو متاح على نطاق واسع و MANA التي تم تطويرها من قبل Microsoft.

Azure Tuned Kernels

تحتوي بعض التوزيعات مثل Ubuntu (Canonical) وSUSE على نواة ضبط Azure.

استخدم الأمر التالي للتأكد من أنك تستخدم نواة Azure، والتي تحتوي عادة على azure السلسلة في التسمية.

uname -r

#sample output on Azure kernel on a Ubuntu Linux VM
6.8.0-1017-azure

توزيعات Linux الأخرى

معظم التوزيعات الحديثة لها تحسينات كبيرة مع نواة أحدث. تحقق من إصدار kernel الحالي للتأكد من أنك تقوم بتشغيل نواة أحدث من 4.19، والتي تتضمن بعض التحسينات الرائعة في الشبكات، على سبيل المثال دعم BBR Congestion-Based التحكم في الازدحام.

تحقيق سرعات نقل متسقة في أجهزة Linux الظاهرية في Azure

غالبا ما تواجه أجهزة Linux الظاهرية مشكلات في أداء الشبكة، خاصة عند نقل الملفات الكبيرة (1 غيغابايت إلى 50 غيغابايت) بين المناطق، مثل غرب أوروبا وغرب الولايات المتحدة. تحدث هذه المشكلات بسبب إصدارات kernel الأقدم بالإضافة إلى تكوينات النواة الافتراضية وإعدادات المخزن المؤقت للشبكة الافتراضية وخوارزميات التحكم في الازدحام الافتراضية، ما يؤدي إلى تأخير الحزم ومعدل النقل المحدود واستخدام الموارد غير الفعال.

للحصول على أداء متسق للشبكة، ضع في اعتبارك تنفيذ التحسينات التالية التي أثبتت فعاليتها في العديد من الحالات على Azure:

  • إعدادات المخزن المؤقت للشبكة: اضبط معلمات النواة لزيادة مخازن الذاكرة المؤقتة للقراءة والكتابة. أضف هذه التكوينات إلى /etc/sysctl.d/99-azure-network-buffers.conf:
net.ipv4.tcp_mem = 4096 87380 67108864
net.ipv4.udp_mem = 4096 87380 33554432
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.core.rmem_default = 33554432
net.core.wmem_default = 33554432
net.ipv4.udp_wmem_min = 16384
net.ipv4.udp_rmem_min = 16384
net.core.wmem_max = 134217728
net.core.rmem_max = 134217728
net.core.busy_poll = 50
net.core.busy_read = 50
  • Congestion-Based التحكم في الازدحام للنواة 4.19 وما فوق: يمكن أن يؤدي تمكين التحكم في ازدحام النطاق الترددي ووقت نشر الإرسال ذهابا وإيابا (BBR) غالبا إلى إنتاجية أفضل. أضف هذا التكوين إلى /etc/sysctl.d/99-azure-congestion-control.conf:
net.ipv4.tcp_congestion_control = bbr 
  • معلمات TCP الإضافية التي عادة ما تساعد في تحقيق تناسق أفضل ومعدل النقل: أضف هذه التكوينات إلى /etc/sysctl.d/99-azure-network-extras.conf:
# For deployments where the Linux VM is BEHIND an Azure Load Balancer, timestamps MUST be set to 0
net.ipv4.tcp_timestamps = 1

# Reuse does require tcp_timestamps to be enabled. If tcp_timestamps are disabled because of load balancers, you should set reuse to 2.
net.ipv4.tcp_tw_reuse = 1

# Allowed local port range. This will increase the number of locally available ports (source ports)
net.ipv4.ip_local_port_range = 1024 65535

# Maximum number of packets taken from all interfaces in one polling cycle (NAPI poll). In one polling cycle interfaces which are # registered to polling are probed in a round-robin manner.
net.core.netdev_budget = 1000

# For high-performance environments, it's recommended to increase from the default 20KB to 65KB, in some extreme cases, for environments that support 100G+ networking, you can 
# increase it to 1048576
net.core.optmem_max = 65535

# F-RTO is not recommended on wired networks. 
net.ipv4.tcp_frto = 0

# Increase the number of incoming connections / number of connections backlog
net.core.somaxconn = 32768
net.core.netdev_max_backlog = 32768
net.core.dev_weight = 64
  • ضابط قائمة الانتظار (qdisc): يتم تحسين معالجة الحزم في Azure عن طريق تعيين qdisc الافتراضي إلى fq. أضف هذا التكوين إلى /etc/sysctl.d/99-azure-qdisc.conf:
net.core.default_qdisc = fq 
  • تحسين المخازن المؤقتة لحلقة NIC ل TX/RX: إنشاء قاعدة udev للتأكد /etc/udev/rules.d/99-azure-ring-buffer.rules من تطبيقها على واجهات الشبكة:
# Setup Accelerated Interface ring buffers (Mellanox / Mana) 
SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION=="add",  RUN+="/usr/sbin/ethtool -G $env{INTERFACE} rx 1024 tx 1024"

# Setup Synthetic interface ring buffers (hv_netvsc)
SUBSYSTEM=="net", DRIVERS=="hv_netvsc*", ACTION=="add",  RUN+="/usr/sbin/ethtool -G $env{INTERFACE} rx 1024 tx 1024"
  • إنشاء قاعدة udev للتأكد /etc/udev/rules.d/99-azure-qdisc.rules من تطبيق qdisc على واجهات الشبكة:
ACTION=="add|change", SUBSYSTEM=="net", KERNEL=="enP*", PROGRAM="/sbin/tc qdisc replace dev \$env{INTERFACE} root noqueue" 
ACTION=="add|change", SUBSYSTEM=="net", KERNEL=="eth*", PROGRAM="/sbin/tc qdisc replace dev \$env{INTERFACE} root fq“ 
  • جدولة طلب المقاطعة (IRQ): اعتمادا على حمل العمل الخاص بك، قد ترغب في تقييد خدمة irqbalance من جدولة IRQs على عقد معينة. عند استخدام IRQBalance، يمكنك التحديث /etc/default/irqbalance لتحديد وحدات المعالجة المركزية التي يجب ألا يكون لها IRQs مجدولة ستحتاج إلى تحديد القناع الذي سيستبعد وحدات المعالجة المركزية التي تحتاج إلى الاستبعاد.

مزيد من المعلومات حول كيفية حساب القناع المتوفر هنا.

يفترض المثال أدناه أنك تريد استبعاد وحدات المعالجة المركزية 8-15

IRQBALANCE_BANNED_CPULIST=0000ff00
  • قواعد UDEV: أضف قواعد لتحسين طول قائمة الانتظار وإدارة علامات الجهاز بكفاءة. إنشاء القاعدة التالية في /etc/udev/rules.d/99-azure-txqueue-len.rules:
SUBSYSTEM=="net", ACTION=="add|change", KERNEL=="eth*", ATTR{tx_queue_len}="10000“ 

بالنسبة للحزم المتأخرة مرتين

عندما يتعلق الأمر بشبكات أداء Linux نستخدم SR-IOV مع برامج تشغيل Mellanox (mlx4 أو mlx5)، شيء خاص ب Azure هو أن هذا ينشئ واجهتين اصطناعية وواجهة ظاهرية. اعرف المزيد.

ملاحظات إضافية

يمكن لمسؤولي النظام تنفيذ هذه الحلول عن طريق تحرير ملفات التكوين مثل /etc/sysctl.d/و /etc/modules-load.d/و./etc/udev/rules.d/ تأكد من مراجعة تحديثات برنامج تشغيل kernel وتكوينات النظام للتراجعات المحتملة.

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