Linux üzerinde Microsoft Azure Ağ Bağdaştırıcısı (MANA) ve DPDK

Microsoft Azure Ağ Bağdaştırıcısı (MANA), daha yüksek aktarım hızı ve güvenilirlik sağlayan Azure sanal makineleri için yeni bir donanımdır. MANA'yı kullanmak için kullanıcıların DPDK başlatma yordamlarını değiştirmesi gerekir. MANA, eski donanıma kıyasla iki değişiklik gerektirir:

MANA DPDK için kurulum yordamı örnek kodda özetlenmiştir..

Giriş

Eski Azure Linux VM'leri, hızlandırılmış ağ için mlx4 veya mlx5 sürücülerine ve buna eşlik eden donanıma dayanır. Azure DPDK kullanıcıları, veri yolu adreslerini DPDK EAL'ye geçirerek dahil etmek veya dışlamak için belirli arabirimleri seçer. HıZLANDıRılmış Ağ arabirimi başına bir veri yolu adresi varsayımı artık doğru olmadığından, MANA DPDK için kurulum yordamı biraz farklılık gösterir. MANA PMD, PCI veri yolu adresi kullanmak yerine MAC adresini kullanarak hangi arabirime bağlanması gerektiğini belirler.

MANA DPDK EAL Bağımsız Değişkenleri

MANA PMD, bağımsız değişken olmadığında --vdev sistemdeki tüm cihazları ve bağlantı noktalarını yoklar; --vdev bağımsız değişken zorunlu değildir. Test ortamlarında genellikle VM'ye SSH bağlantısına hizmet vermek için bir (birincil) arabirimin kullanılabilir durumda bırakılması tercih edilir. DPDK'yi kullanılabilir VF'lerin bir alt kümesiyle kullanmak için, kullanıcıların hem MANA cihazının veri yolu adresini hem de bağımsız değişkendeki --vdev arabirimlerin MAC adresini geçirmesi gerekir. Daha ayrıntılı bilgi için ÖRNEK kod, MANA'da DPDK EAL başlatmasını göstermek için kullanılabilir.

DPDK Ortam Soyutlama Katmanı (EAL) hakkında genel bilgi için:

MANA için DPDK gereksinimleri

MANA donanımında DPDK kullanmak için Linux çekirdeği 6.2 veya üzeri ya da en son Linux çekirdeğinden Ethernet ve InfiniBand sürücülerinin arka penceresi gerekir. Ayrıca DPDK ve kullanıcı alanı sürücülerinin belirli sürümlerini gerektirir.

MANA DPDK için aşağıdaki sürücü kümesi gerekir:

  1. Linux çekirdek Ethernet sürücüsü (5.15 çekirdek ve üzeri)
  2. Linux çekirdek InfiniBand sürücüsü (6.2 çekirdek ve üzeri)
  3. DPDK MANA yoklama modu sürücüsü (DPDK 22.11 ve üzeri)
  4. Libmana kullanıcı alanı sürücüleri (rdma-core v44 ve üzeri)

Desteklenen Market Görüntüleri

MANA ile DPDK için geri aktarılan yamalara sahip görüntülerin tükenmez listesi:

  • Red Hat Enterprise Linux 8.9
  • Red Hat Enterprise Linux 9.4
  • Canonical Ubuntu Server 20.04 (5.15.0-1045-azure)
  • Kurallı Ubuntu Server 22.04 (5.15.0-1045-azure)

Not

MANA DPDK Windows için kullanılamaz; yalnızca Linux VM'lerinde çalışır.

Örnek: MANA olup olmadığını denetleyin

Not

Bu makalede, sistemde lspci komutunu içeren pciutils paketinin yüklü olduğu varsayılır.

# check for pci devices with ID:
#   vendor: Microsoft Corporation (1414)
#   class:  Ethernet Controller (0200)
#   device: Microsft Azure Network Adapter VF (00ba)
if [[ -n `lspci -d 1414:00ba:0200` ]]; then
    echo "MANA device is available."
else
    echo "MANA was not detected."
fi

Örnek: DPDK yüklemesi (Ubuntu 22.04)

Not

Bu makalede, uyumlu çekirdeğin ve rdma-core'un sistemde yüklü olduğu varsayılır.

DEBIAN_FRONTEND=noninteractive sudo apt-get install -q -y build-essential libudev-dev libnl-3-dev libnl-route-3-dev ninja-build libssl-dev libelf-dev python3-pip meson libnuma-dev

pip3 install pyelftools

# Try latest LTS DPDK, example uses DPDK tag v23.07-rc3
git clone https://github.com/DPDK/dpdk.git -b v23.07-rc3 --depth 1
pushd dpdk
meson build
cd build
ninja
sudo ninja install
popd

Örnek: Testpmd kurulumu ve netvsc testi

DPDK'yi MANA ile çalıştırmak için aşağıdaki örnek kodu not edin. MANA ile maksimum performans için Azure'da doğrudan vf 'netvsc' yapılandırması önerilir.

Not

DPDK için 2 MB veya 1 GB büyük sayfaların etkinleştirilmesi gerekir. Örnek, 2 hızlandırılmış ağ NIC'lerinin eklendiği bir Azure VM olduğunu varsayar.

# Enable 2MB hugepages.
echo 1024 | tee /sys/devices/system/node/node*/hugepages/hugepages-2048kB/nr_hugepages

# Assuming use of eth1 for DPDK in this demo
PRIMARY="eth1"

# $ ip -br link show master eth1 
# > enP30832p0s0     UP             f0:0d:3a:ec:b4:0a <... # truncated
# grab interface name for device bound to primary
SECONDARY="`ip -br link show master $PRIMARY | awk '{ print $1 }'`"
# Get mac address for MANA interface (should match primary)
MANA_MAC="`ip -br link show master $PRIMARY | awk '{ print $3 }'`"


# $ ethtool -i enP30832p0s0 | grep bus-info
# > bus-info: 7870:00:00.0
# get MANA device bus info to pass to DPDK
BUS_INFO="`ethtool -i $SECONDARY | grep bus-info | awk '{ print $2 }'`"

# Set MANA interfaces DOWN before starting DPDK
ip link set $PRIMARY down
ip link set $SECONDARY down


## Move synthetic channel to user mode and allow it to be used by NETVSC PMD in DPDK
DEV_UUID=$(basename $(readlink /sys/class/net/$PRIMARY/device))
NET_UUID="f8615163-df3e-46c5-913f-f2d2f965ed0e"
modprobe uio_hv_generic
echo $NET_UUID > /sys/bus/vmbus/drivers/uio_hv_generic/new_id
echo $DEV_UUID > /sys/bus/vmbus/drivers/hv_netvsc/unbind
echo $DEV_UUID > /sys/bus/vmbus/drivers/uio_hv_generic/bind

# MANA single queue test
dpdk-testpmd -l 1-3 --vdev="$BUS_INFO,mac=$MANA_MAC" -- --forward-mode=txonly --auto-start --txd=128 --rxd=128 --stats 2

# MANA multiple queue test (example assumes > 9 cores)
dpdk-testpmd -l 1-6 --vdev="$BUS_INFO,mac=$MANA_MAC" -- --forward-mode=txonly --auto-start --nb-cores=4  --txd=128 --rxd=128 --txq=8 --rxq=8 --stats 2

Sorun giderme

Arabirim ayarlanmadı.

MANA bağlı cihazın AŞAĞI olarak ayarlanmaması, düşük veya sıfır paket aktarım hızına neden olabilir. Cihazın serbest bırakılmaması, iletim kuyruklarıyla ilgili EAL hata iletisine neden olabilir.

mana_start_tx_queues(): Failed to create qp queue index 0
mana_dev_start(): failed to start tx queues -19

Büyük sayfaların etkinleştirilmemesi.

Çok büyük sayfaları etkinleştirmeyi ve bilgilerin meminfo'da görünür olmasını sağlamayı deneyin.

EAL: No free 2048 kB hugepages reported on node 0
EAL: FATAL: Cannot get hugepage information.
EAL: Cannot get hugepage information.
EAL: Error - exiting with code: 1
Cause: Cannot init EAL: Permission denied

Kullanımı ile düşük aktarım hızı --vdev="net_vdev_netvsc0,iface=eth1"

Azure'da net_failsafe yüksek performans için veya net_vdev_netvsc yoklama modu sürücülerinin yük devretme yapılandırması önerilmez. DPDK sürüm 20.11 veya üzeri olan netvsc yapılandırması daha iyi sonuçlar verebilir. En iyi performans için Linux çekirdeği, rdma-core ve DPDK paketlerinizin DPDK ve MANA için listelenen gereksinimleri karşıladığından emin olun.

rdma-core için sürüm uyuşmazlığı

rdma-core ve linux çekirdeğindeki uyuşmazlıklar her zaman oluşabilir; genellikle bir kullanıcı kaynaktan rdma-core, DPDK ve linux çekirdeğinin bir bileşimini oluştururken oluşur. Bu tür bir sürüm uyuşmazlığı, MANA sanal işlevinin (VF) başarısız yoklamasına neden olabilir.

EAL: Probe PCI driver: net_mana (1414:ba) device: 7870:00:00.0 (socket 0)
mana_arg_parse_callback(): key=mac value=00:0d:3a:76:3b:d0 index=0
mana_init_once(): MP INIT PRIMARY
mana_pci_probe_mac(): Probe device name mana_0 dev_name uverbs0 ibdev_path /sys/class/infiniband/mana_0
mana_probe_port(): device located port 2 address 00:0D:3A:76:3B:D0
mana_probe_port(): ibv_alloc_parent_domain failed port 2
mana_pci_probe_mac(): Probe on IB port 2 failed -12
EAL: Requested device 7870:00:00.0 cannot be used
EAL: Bus (pci) probe failed.
hn_vf_attach(): Couldn't find port for VF
hn_vf_add(): RNDIS reports VF but device not found, retrying

Bu, büyük olasılıkla rdma-core'un daha yeni bir sürümüne sahip mana_ib için geri aktarılan düzeltme eklerine sahip bir çekirdek kullanılmasından kaynaklanır. Kök neden, çekirdek RDMA sürücüleri ve kullanıcı alanı rdma-core kitaplıkları arasındaki etkileşimdir.

RDMA için Linux çekirdek uapi'sinde RDMA sağlayıcı kimliklerinin listesi bulunur; çekirdeğin geri aktarılan sürümlerinde bu kimlik değeri rdma-core kitaplıklarındaki sürümden farklı olabilir.

{! NOT} Örnek kod parçacıkları Ubuntu 5.150-1045 linux-azure ve rdma-core v46.0'dan alınıyor

// Linux kernel header
// include/uapi/rdma/ib_user_ioctl_verbs.h
enum rdma_driver_id {
	RDMA_DRIVER_UNKNOWN,
	RDMA_DRIVER_MLX5,
	RDMA_DRIVER_MLX4,
	RDMA_DRIVER_CXGB3,
	RDMA_DRIVER_CXGB4,
	RDMA_DRIVER_MTHCA,
	RDMA_DRIVER_BNXT_RE,
	RDMA_DRIVER_OCRDMA,
	RDMA_DRIVER_NES,
	RDMA_DRIVER_I40IW,
	RDMA_DRIVER_IRDMA = RDMA_DRIVER_I40IW,
	RDMA_DRIVER_VMW_PVRDMA,
	RDMA_DRIVER_QEDR,
	RDMA_DRIVER_HNS,
	RDMA_DRIVER_USNIC,
	RDMA_DRIVER_RXE,
	RDMA_DRIVER_HFI1,
	RDMA_DRIVER_QIB,
	RDMA_DRIVER_EFA,
	RDMA_DRIVER_SIW,
	RDMA_DRIVER_MANA, //<- MANA added as last member of enum after backporting
};

// Example mismatched rdma-core ioctl verbs header
// on github: kernel-headers/rdma/ib_user_ioctl_verbs.h
// or in release tar.gz: include/rdma/ib_user_ioctl_verbs.h
enum rdma_driver_id {
	RDMA_DRIVER_UNKNOWN,
	RDMA_DRIVER_MLX5,
	RDMA_DRIVER_MLX4,
	RDMA_DRIVER_CXGB3,
	RDMA_DRIVER_CXGB4,
	RDMA_DRIVER_MTHCA,
	RDMA_DRIVER_BNXT_RE,
	RDMA_DRIVER_OCRDMA,
	RDMA_DRIVER_NES,
	RDMA_DRIVER_I40IW,
	RDMA_DRIVER_IRDMA = RDMA_DRIVER_I40IW,
	RDMA_DRIVER_VMW_PVRDMA,
	RDMA_DRIVER_QEDR,
	RDMA_DRIVER_HNS,
	RDMA_DRIVER_USNIC,
	RDMA_DRIVER_RXE,
	RDMA_DRIVER_HFI1,
	RDMA_DRIVER_QIB,
	RDMA_DRIVER_EFA,
	RDMA_DRIVER_SIW,
	RDMA_DRIVER_ERDMA,  // <- This upstream has two additional providers
	RDMA_DRIVER_MANA,   // <- So MANA's ID in the enum does not match
};

Bu uyuşmazlık, MANA sağlayıcı kodunun yüklenememesine neden olur. MANA sağlayıcısı yerine ERDMA sağlayıcısının yüklendiğini onaylamak için yürütmesini dpdk-testpmd izlemek için kullanıngdb. MANA driver_id hem çekirdek hem de rdma-core için tutarlı olmalıdır. Bu kimlikler eşleştiğinde MANA PMD doğru şekilde yüklenir.