Несколько ошибок при попытке использовать DPDK pdump

Цель: Написать приложение на основе DPDK, которое может считывать пакеты UDP через порт Ethernet 100Gbe и записывать полезную нагрузку на диск в зависимости от IP/порта назначения. В лучшем случае каждая ссылка 100gbe будет иметь два разных IP-адреса назначения и 4 уникальных номера порта назначения. Первоначальный проект требует двух уникальных номеров портов.

Аппаратное обеспечение

Текущая тестовая система

На данный момент я тестирую следующее оборудование. Серверное оборудование и диски NVME будут значительно обновлены в ближайшие несколько недель. На данный момент я использую следующее оборудование для разработки доказательства концепции (POC). Сетевая карта останется прежней, если не будет рекомендовано иное.

  • 2 процессора Intel Xeon Gold 6348 с тактовой частотой 2,6 ГГц
    • 28 ядер на сокет
    • Макс. 3,5 ГГц
    • Гиперпоточность отключена
    • Убунту 22.04.1 ЛТС
    • Ядро 5.15.0-53-универсальное
    • Ядра настроены на регулятор производительности
    • 4 x Sabrent 2 ТБ Rocket 4 Plus в конфигурации RAID0
    • 128 ГБ памяти DDR4
    • 10 HugePages по 1 ГБ (можно изменить на то, что требуется)
  • 1 сетевая карта Mellanox ConnectX-5 100 Гбит/с
    • 31:00.0 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5]
    • Версия прошивки: 16.35.1012
  • UDP-источник:
    • 100-гигабитная сетевая карта
    • 9000 пакетов MTU
    • пакеты ipv4-udp
    • В настоящее время только 4 ГБ/с на порт, но со временем будет 10 ГБ/с на порт.

Информация о сетевой карте

Вывод ethtool:

Settings for ens7f0np0:
        Supported ports: [ Backplane ]
        Supported link modes:   1000baseKX/Full
                                10000baseKR/Full
                                40000baseKR4/Full
                                40000baseCR4/Full
                                40000baseSR4/Full
                                40000baseLR4/Full
                                25000baseCR/Full
                                25000baseKR/Full
                                25000baseSR/Full
                                50000baseCR2/Full
                                50000baseKR2/Full
                                100000baseKR4/Full
                                100000baseSR4/Full
                                100000baseCR4/Full
                                100000baseLR4_ER4/Full
        Supported pause frame use: Symmetric
        Supports auto-negotiation: Yes
        Supported FEC modes: None        RS      BASER
        Advertised link modes:  1000baseKX/Full
                                10000baseKR/Full
                                40000baseKR4/Full
                                40000baseCR4/Full
                                40000baseSR4/Full
                                40000baseLR4/Full
                                25000baseCR/Full
                                25000baseKR/Full
                                25000baseSR/Full
                                50000baseCR2/Full
                                50000baseKR2/Full
                                100000baseKR4/Full
                                100000baseSR4/Full
                                100000baseCR4/Full
                                100000baseLR4_ER4/Full
        Advertised pause frame use: Symmetric
        Advertised auto-negotiation: Yes
        Advertised FEC modes: RS
        Speed: 100000Mb/s
        Duplex: Full
        Auto-negotiation: on
        Port: Direct Attach Copper
        PHYAD: 0
        Transceiver: internal
        Supports Wake-on: d
        Wake-on: d
        Current message level: 0x00000004 (4)
                               link
        Link detected: yes

Информация о тестпмд:

[sudo] password for maa: 
EAL: Detected CPU lcores: 56
EAL: Detected NUMA nodes: 2
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available 2048 kB hugepages reported
EAL: VFIO support initialized
EAL: Probe PCI driver: mlx5_pci (15b3:1017) device: 0000:31:00.0 (socket 0)
EAL: Probe PCI driver: mlx5_pci (15b3:1017) device: 0000:31:00.1 (socket 0)
TELEMETRY: No legacy callbacks, legacy socket not created
Interactive-mode selected
testpmd: create a new mbuf pool <mb_pool_0>: n=171456, size=2176, socket=0
testpmd: preferred mempool ops selected: ring_mp_mc
Configuring Port 0 (socket 0)
Port 0: B8:CE:F6:FB:13:30
Configuring Port 1 (socket 0)
Port 1: B8:CE:F6:FB:13:31
Checking link statuses...
Done
testpmd> show port info 0

********************* Infos for port 0  *********************
MAC address: B8:CE:F6:FB:13:30
Device name: 31:00.0
Driver name: mlx5_pci
Firmware-version: 16.35.1012
Devargs: 
Connect to socket: 0
memory allocation on the socket: 0
Link status: up
Link speed: 100 Gbps
Link duplex: full-duplex
Autoneg status: On
MTU: 1500
Promiscuous mode: enabled
Allmulticast mode: disabled
Maximum number of MAC addresses: 128
Maximum number of MAC addresses of hash filtering: 0
VLAN offload: 
  strip off, filter off, extend off, qinq strip off
Hash key size in bytes: 40
Redirection table size: 1
Supported RSS offload flow types:
  ipv4
  ipv4-frag
  ipv4-tcp
  ipv4-udp
  ipv4-other
  ipv6
  ipv6-frag
  ipv6-tcp
  ipv6-udp
  ipv6-other
  ipv6-ex
  ipv6-tcp-ex
  ipv6-udp-ex
  l4-dst-only
  l4-src-only
  l3-dst-only
  l3-src-only
Minimum size of RX buffer: 32
Maximum configurable length of RX packet: 65536
Maximum configurable size of LRO aggregated packet: 65280
Current number of RX queues: 1
Max possible RX queues: 1024
Max possible number of RXDs per queue: 65535
Min possible number of RXDs per queue: 0
RXDs number alignment: 1
Current number of TX queues: 1
Max possible TX queues: 1024
Max possible number of TXDs per queue: 65535
Min possible number of TXDs per queue: 0
TXDs number alignment: 1
Max segment number per packet: 40
Max segment number per MTU/TSO: 40
Device capabilities: 0x14( RXQ_SHARE FLOW_SHARED_OBJECT_KEEP )
Switch name: 31:00.0
Switch domain Id: 0
Switch Port Id: 65535
Switch Rx domain: 0

Возможности разгрузки RX:

testpmd> show port 0 rx_offload capabilities
Rx Offloading Capabilities of port 0 :
  Per Queue : VLAN_STRIP IPV4_CKSUM UDP_CKSUM TCP_CKSUM TCP_LRO SCATTER TIMESTAMP KEEP_CRC RSS_HASH BUFFER_SPLIT
  Per Port  : VLAN_FILTER

Физический макет

На данный момент я только пытаюсь заставить работать один поток на одном порту. Мой план состоит в том, чтобы каждая очередь была привязана к lcore, и у каждого lcore был свой собственный поток для удаления заголовков, а затем поток для записи на диск. Предположим, что оборудование находится на том же узле NUMA. В настоящее время TX не требуется.

Требования

  • В итоге 10 Гб/с на диск с одного порта 100 Гб/с (в настоящее время пытаемся получить 4 Гб/с)
    • Предположим, что у меня будет процессор, PCI-линии и конфигурация NVME, которые могут это поддерживать, пока меня беспокоит только сторона DPDK.
    • Каждый отдельный поток будет ~ 5 ГБ / с, в настоящее время они составляют ~ 2 ГБ / с, и я просто пытаюсь заставить это работать на данный момент.
    • Заголовки каждого потока удаляются.
    • Полезная нагрузка каждого потока записывается на диск в виде одного непрерывного файла (формат .dat).
    • Каждый поток имеет уникальный номер порта.
    • Если FCS плохой, отбросьте пакет и замените его пустыми данными (все нули).

Что я пробовал:

У меня такая же проблема, как и у постера в этом вопросе: DPDK pdump не удалось добавить устройство в горячем режиме Я попытался исправить там, и у меня все еще есть проблемы.

Я просто попытался получить файл pcap, прикрепив pdump к скелетному коду.

/* SPDX-License-Identifier: BSD-3-Clause
 * Copyright(c) 2010-2015 Intel Corporation
 */

#include <stdint.h>
#include <inttypes.h>
#include <rte_eal.h>
#include <rte_ethdev.h>
#include <rte_cycles.h>
#include <rte_lcore.h>
#include <rte_mbuf.h>
#include <rte_pdump.h>

#define RX_RING_SIZE 1024
#define TX_RING_SIZE 1024

#define NUM_MBUFS 8191
#define MBUF_CACHE_SIZE 250
#define BURST_SIZE 32

/* basicfwd.c: Basic DPDK skeleton forwarding example. */

/*
 * Initializes a given port using global settings and with the RX buffers
 * coming from the mbuf_pool passed as a parameter.
 */

/* Main functional part of port initialization. 8< */
static inline int
port_init(uint16_t port, struct rte_mempool *mbuf_pool)
{
    struct rte_eth_conf port_conf;
    const uint16_t rx_rings = 1, tx_rings = 1;
    uint16_t nb_rxd = RX_RING_SIZE;
    uint16_t nb_txd = TX_RING_SIZE;
    int retval;
    uint16_t q;
    struct rte_eth_dev_info dev_info;
    struct rte_eth_txconf txconf;

    if (!rte_eth_dev_is_valid_port(port))
        return -1;

    memset(&port_conf, 0, sizeof(struct rte_eth_conf));

    retval = rte_eth_dev_info_get(port, &dev_info);
    if (retval != 0) {
        printf("Error during getting device (port %u) info: %s\n",
                port, strerror(-retval));
        return retval;
    }

    if (dev_info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE)
        port_conf.txmode.offloads |=
            RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE;

    /* Configure the Ethernet device. */
    retval = rte_eth_dev_configure(port, rx_rings, tx_rings, &port_conf);
    if (retval != 0)
        return retval;

    retval = rte_eth_dev_adjust_nb_rx_tx_desc(port, &nb_rxd, &nb_txd);
    if (retval != 0)
        return retval;

    /* Allocate and set up 1 RX queue per Ethernet port. */
    for (q = 0; q < rx_rings; q++) {
        retval = rte_eth_rx_queue_setup(port, q, nb_rxd,
                rte_eth_dev_socket_id(port), NULL, mbuf_pool);
        if (retval < 0)
            return retval;
    }

    txconf = dev_info.default_txconf;
    txconf.offloads = port_conf.txmode.offloads;
    /* Allocate and set up 1 TX queue per Ethernet port. */
    for (q = 0; q < tx_rings; q++) {
        retval = rte_eth_tx_queue_setup(port, q, nb_txd,
                rte_eth_dev_socket_id(port), &txconf);
        if (retval < 0)
            return retval;
    }

    /* Starting Ethernet port. 8< */
    retval = rte_eth_dev_start(port);
    /* >8 End of starting of ethernet port. */
    if (retval < 0)
        return retval;

    /* Display the port MAC address. */
    struct rte_ether_addr addr;
    retval = rte_eth_macaddr_get(port, &addr);
    if (retval != 0)
        return retval;

    printf("Port %u MAC: %02" PRIx8 " %02" PRIx8 " %02" PRIx8
               " %02" PRIx8 " %02" PRIx8 " %02" PRIx8 "\n",
            port, RTE_ETHER_ADDR_BYTES(&addr));

    /* Enable RX in promiscuous mode for the Ethernet device. */
    retval = rte_eth_promiscuous_enable(port);
    /* End of setting RX port in promiscuous mode. */
    if (retval != 0)
        return retval;

    return 0;
}
/* >8 End of main functional part of port initialization. */

/*
 * The lcore main. This is the main thread that does the work, reading from
 * an input port and writing to an output port.
 */

 /* Basic forwarding application lcore. 8< */
static __rte_noreturn void
lcore_main(void)
{
    uint16_t port;
    int total = 0;

    /*
     * Check that the port is on the same NUMA node as the polling thread
     * for best performance.
     */
    RTE_ETH_FOREACH_DEV(port)
        if (rte_eth_dev_socket_id(port) >= 0 &&
                rte_eth_dev_socket_id(port) !=
                        (int)rte_socket_id())
            printf("WARNING, port %u is on remote NUMA node to "
                    "polling thread.\n\tPerformance will "
                    "not be optimal.\n", port);

    printf("\nCore %u forwarding packets. [Ctrl+C to quit]\n",
            rte_lcore_id());

    /* Main work of application loop. 8< */
    for (;;) {
        /*
         * Receive packets on a port and forward them on the paired
         * port. The mapping is 0 -> 1, 1 -> 0, 2 -> 3, 3 -> 2, etc.
         */
        RTE_ETH_FOREACH_DEV(port) {

            /* Get burst of RX packets, from first port of pair. */
            struct rte_mbuf *bufs[BURST_SIZE];
            const uint16_t nb_rx = rte_eth_rx_burst(port, 0,
                    bufs, BURST_SIZE);

            if (unlikely(nb_rx == 0))
                continue;

        
            total += nb_rx;
            
            //rte_pktmbuf_free(bufs);
            //printf("\nTotal: %d",total);
        }
    
    }
    
    /* >8 End of loop. */
}
/* >8 End Basic forwarding application lcore. */

/*
 * The main function, which does initialization and calls the per-lcore
 * functions.
 */
int
main(int argc, char *argv[])
{
    struct rte_mempool *mbuf_pool;
    unsigned nb_ports;
    uint16_t portid;

    /* Initializion the Environment Abstraction Layer (EAL). 8< */
    int ret = rte_eal_init(argc, argv);
    rte_pdump_init();
    if (ret < 0)
        rte_exit(EXIT_FAILURE, "Error with EAL initialization\n");
    /* >8 End of initialization the Environment Abstraction Layer (EAL). */

    argc -= ret;
    argv += ret;

    /* Check that there is an even number of ports to send/receive on. */
    nb_ports = rte_eth_dev_count_avail();
    // if (nb_ports < 2 || (nb_ports & 1))
    //  rte_exit(EXIT_FAILURE, "Error: number of ports must be even\n");

    /* Creates a new mempool in memory to hold the mbufs. */

    /* Allocates mempool to hold the mbufs. 8< */
    mbuf_pool = rte_pktmbuf_pool_create("MBUF_POOL", NUM_MBUFS * nb_ports,
        MBUF_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id());
    /* >8 End of allocating mempool to hold mbuf. */

    if (mbuf_pool == NULL)
        rte_exit(EXIT_FAILURE, "Cannot create mbuf pool\n");

    /* Initializing all ports. 8< */
    RTE_ETH_FOREACH_DEV(portid)
        if (port_init(portid, mbuf_pool) != 0)
            rte_exit(EXIT_FAILURE, "Cannot init port %"PRIu16 "\n",
                    portid);
    /* >8 End of initializing all ports. */

    if (rte_lcore_count() > 1)
        printf("\nWARNING: Too many lcores enabled. Only 1 used.\n");

    /* Call lcore_main on the main core only. Called on single lcore. 8< */
    lcore_main();
    /* >8 End of called on single lcore. */

    /* clean up the EAL */
    rte_eal_cleanup();
    rte_pdump_uninit();

    return 0;
}

Команда для запуска этого примера, который я использую: sudo ./dpdk-skeleton -l 1,2,3,4 -n 4 -a 0000:31:00.0

Выполняется команда:

EAL: Detected CPU lcores: 56
EAL: Detected NUMA nodes: 2
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available 2048 kB hugepages reported
EAL: VFIO support initialized
EAL: Probe PCI driver: mlx5_pci (15b3:1017) device: 0000:31:00.0 (socket 0)
TELEMETRY: No legacy callbacks, legacy socket not created
Port 0 MAC: b8 ce f6 fb 13 30

WARNING: Too many lcores enabled. Only 1 used.

Core 1 forwarding packets. [Ctrl+C to quit]

Я не совсем уверен, какими должны быть некоторые значения командной строки (например, -n), поэтому я просто догадываюсь на данный момент.

Для pdump я использую эту команду sudo ./dpdk-pdump -l 3,4,5 -a 0000:31:00.0 -- --multi --pdump 'port=0,queue=0,rx-dev=/mnt/md0/rx-1.pcap'

Опять же, я не уверен в некоторых из этих значений, поэтому делаю наилучшее предположение.

Проблема Теперь, когда основное приложение запущено, я пытаюсь запустить pdump в первый раз:

EAL: Detected CPU lcores: 56
EAL: Detected NUMA nodes: 2
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket_57567_26f06531cb8cd
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Probe PCI driver: mlx5_pci (15b3:1017) device: 0000:31:00.0 (socket 0)
Segmentation fault

Второй раз:

EAL: Detected CPU lcores: 56
EAL: Detected NUMA nodes: 2
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket_57601_26f14f88bf7bb
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Probe PCI driver: mlx5_pci (15b3:1017) device: 0000:31:00.0 (socket 0)
EAL: Failed to hotplug add device
EAL: Error - exiting with code: 1
Cause: vdev creation failed:create_mp_ring_vdev:767

И, наконец, третий раз вроде запускается, но с незнакомым MAC-адресом:

EAL: Detected CPU lcores: 56
EAL: Detected NUMA nodes: 2
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket_57679_26f28a2a6e9f1
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Probe PCI driver: mlx5_pci (15b3:1017) device: 0000:31:00.0 (socket 0)
Port 1 MAC: 02 70 63 61 70 01
 core (4); port 0 device ((null)) queue 0

Однако я ничего не получаю, а файл pcap пуст (и да, я отправляю пакеты):

Signal 2 received, preparing to exit...
##### PDUMP DEBUG STATS #####
 -packets dequeued:                     0
 -packets transmitted to vdev:          0
 -packets freed:                        0

Кроме того, при втором запуске эти сообщения начинают появляться в основном приложении:

EAL: Failed to send hotplug request to secondary
6: [./dpdk-skeleton(_start+0x25) [0x55f70a909045]]
5: [/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x80) [0x7fb90e478e40]]
4: [/lib/x86_64-linux-gnu/libc.so.6(+0x29d90) [0x7fb90e478d90]]
3: [./dpdk-skeleton(main+0x1ad) [0x55f70a20a8ad]]
2: [./dpdk-skeleton(+0x1fdde7) [0x55f70a014de7]]
1: [./dpdk-skeleton(rte_dump_stack+0x32) [0x55f70aa973d2]]
lcore 1 called rx_pkt_burst for not ready port 1
6: [./dpdk-skeleton(_start+0x25) [0x55f70a909045]]
5: [/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x80) [0x7fb90e478e40]]
4: [/lib/x86_64-linux-gnu/libc.so.6(+0x29d90) [0x7fb90e478d90]]
3: [./dpdk-skeleton(main+0x1ad) [0x55f70a20a8ad]]
2: [./dpdk-skeleton(+0x1fdde7) [0x55f70a014de7]]
1: [./dpdk-skeleton(rte_dump_stack+0x32) [0x55f70aa973d2]]
lcore 1 called rx_pkt_burst for not ready port 1
6: [./dpdk-skeleton(_start+0x25) [0x55f70a909045]]
5: [/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x80) [0x7fb90e478e40]]
4: [/lib/x86_64-linux-gnu/libc.so.6(+0x29d90) [0x7fb90e478d90]]
3: [./dpdk-skeleton(main+0x1ad) [0x55f70a20a8ad]]
2: [./dpdk-skeleton(+0x1fdde7) [0x55f70a014de7]]
1: [./dpdk-skeleton(rte_dump_stack+0x32) [0x55f70aa973d2]]

Мои вопросы

Я займусь записью в файл и т.д. позже. Я просто пытаюсь правильно передать данные в DPDK и в правильную очередь на данный момент.

  1. Я предполагаю, что мне нужно использовать RSS или rte_flow для направления каждого потока в свою собственную очередь на основе IP/порта. Как мне это сделать? Я впервые занимаюсь каким-либо продвинутым сетевым программированием, поэтому я не знаком с этими концепциями, но, исходя из моих исследований, они кажутся мне нужными.
  2. В чем разница между RSS и rte_flow/offloading? Это одно и то же?
  3. Есть ли примеры, похожие на то, что я пытаюсь сделать?
  4. Выполнимо ли то, что я пытаюсь сделать?

Вы спрашиваете несколько вещей в одном вопросе. Так что просьба еще раз внести ясность. Пожалуйста, ответьте на следующее для ясности, прошивка nic, скорость, количество включенных очередей. RSS включен? причина запроса, который вы пытаетесь получить из queue 0 с включенным мульти-pdump. Вы побеждаете цель. Так что либо включите первичный сервер с 1 очередью и захватом с 1 очередью, либо включите ядра с захватом нескольких очередей для нескольких очередей.

Vipin Varghese 22.11.2022 04:45

@VipinVarghese Я не могу понять, как включить очереди или RSS. Прошивка NIC — это последняя прошивка Mellanox для карты. Скорость 100000 Мбит/с. Я просто спрашиваю, как мне нужно настроить все, чтобы заставить это работать. Я обновлю свой вопрос с более подробной информацией.

adastra 22.11.2022 15:56

Тогда ваш вопрос и утверждение неверны, согласно вашему комментарию, проблема описана для основного процесса, а вы говорите о процессе DPDK pdump (вторичном), не перехватывающем пакеты. Это дает неправильное представление, пожалуйста, перефразируйте и исправьте свое истинное намерение.

Vipin Varghese 22.11.2022 15:59

@VipinVarghese Почему мой вопрос и утверждение неверны? Я просто спрашиваю, почему это не работает? Я изменил пример скелета, чтобы присоединить вторичный процесс (pdump), и ничего не перехватывается. Почему? Спасибо. Я добавил дополнительную информацию к вопросу.

adastra 22.11.2022 16:11

@adstra ваш вопрос Multiple errors when trying to use DPDK pdump, настоящее намерение primary is not workign with RSS основано на комментарии, рад быстрому обсуждению и указанию на правильные ответы

Vipin Varghese 22.11.2022 16:31

@VipinVarghese Буду признателен за обсуждение, чтобы исправить мои недоразумения.

adastra 22.11.2022 17:04

Пожалуйста, поделитесь приглашением на встречу - Google Meet или Zoom

Vipin Varghese 23.11.2022 07:00

@VipinVarghese уходит в отпуск до следующей недели. Давай тогда договоримся о встрече.

adastra 23.11.2022 13:51

@VipinVarghese после более подробного изучения вопроса я обновил указанные выше проблемы. Как я могу отправить вам ссылку на встречу? Эл. адрес?

adastra 29.11.2022 17:35

Пишите мне по электронной почте: tru3anomaly@proton.me

adastra 29.11.2022 21:09

@VipinVarghese Я хотел бы закрыть это, вы все еще можете помочь? Спасибо.

adastra 05.12.2022 15:54

Рад видеть вас обратно после перерыва. рассмотрит то же самое и обновит ответ слишком рано.

Vipin Varghese 05.12.2022 16:28

Ожидание вашей ссылки на приглашение на собрание для отладки в реальном времени при сбое, о котором вы упомянули

Vipin Varghese 06.12.2022 13:44

Ответ на ваш вопрос был опубликован, повторите то же самое и проголосуйте за него, чтобы помочь другим найти правильный ответ. Обратите внимание, что я поделился более двух раз для оперативной отладки и для вашей ошибки с несколькими сегментами.

Vipin Varghese 07.12.2022 01:52

@VipinVarghese спасибо за ваш ответ. Я действительно думаю, что живая отладка больше не нужна после прочтения вашего ответа, я вижу, что многопроцессорная модель не подходит для моего приложения.

adastra 07.12.2022 16:40
[JS за 1 час] - 9. Асинхронный
[JS за 1 час] - 9. Асинхронный
JavaScript является однопоточным, то есть он может обрабатывать только одну задачу за раз. Для обработки длительных задач, таких как сетевые запросы,...
Топ-10 компаний-разработчиков PHP
Топ-10 компаний-разработчиков PHP
Если вы ищете надежных разработчиков PHP рядом с вами, вот список лучших компаний по разработке PHP.
Скраппинг поиска Apple App Store с помощью Python
Скраппинг поиска Apple App Store с помощью Python
📌Примечание: В этой статье я покажу вам, как скрапировать поиск Apple App Store и получить точно такой же результат, как на Apple iMac, потому что...
Редкие достижения на Github ✨
Редкие достижения на Github ✨
Редкая коллекция доступна в профиле на GitHub ✨
Подъем в javascript
Подъем в javascript
Hoisting - это поведение в JavaScript, при котором переменные и объявления функций автоматически "перемещаются" в верхнюю часть соответствующих...
Улучшение генерации файлов Angular
Улучшение генерации файлов Angular
Angular - это фреймворк. Вы можете создать практически любое приложение без использования сторонних библиотек.
0
15
127
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первая часть вопроса: Если целью является захват пакетов с линейной скоростью и запись дескриптора и мет-данных в NVME, то, пожалуйста, не используйте модель testpmd-pdump. это не будет масштабироваться для вашего варианта использования.

Чтобы уточнить вышесказанное

  1. DPDK позволяет многопроцессорную модель - один первичный и несколько вторичных для совместного использования одних и тех же огромных страниц, аппаратных ресурсов и сетевой карты.
  2. DPDK testpmd и dpdk pdump — яркий пример использования первичной вторичной модели.
  3. НО библиотека PDUMP на сегодняшний день использует огромный общий доступ к страницам для клонирования-копирования пакета, полученного от PRIMARY (testpmd), для отправки его через буфер RING во SECODNARY (PDUMP), а затем для записи в файл с использованием PCAP.
  4. Приложение PDUMP расширено для поддержки нескольких очередей на нескольких процессорах, но одно из них по-прежнему будет иметь неотъемлемые накладные расходы на копирование пакетов и отправку через кольцевой буфер.

Следовательно, для упомянутого выше варианта использования лучше всего использовать первичное пользовательское приложение для приема пакетов по нескольким очередям (4 потока - затем 4 очереди) для UDP. Получите как можно больше помощи от HW (MLX NIC CX05) для фильтрации пакетов с использованием rte_flow. на основе бифуркации потока и типа для классификации пакетов, чтобы минимизировать нагрузку на ЦП при синтаксическом анализе.

Вторая часть вопроса:

  1. вы используете DPDK Skeleton в качестве основного
  2. для порта настроена только очередь 1RX-TX.
  3. из-за встроенной конструкции CX-5 максимальная скорость, которую может выполнить 1 очередь, составляет от 35 до 40 млн пакетов в секунду с 1 очередью с правильными настройками.
  4. для порта 100 Гбит/с с 1 очередью вы можете достичь скорости линии для простой переадресации для размера полезной нагрузки от 512 байт
  5. Из фрагмента кода я обнаружил, что rte_pdump_init вызывается, но возвращается без проверки (пожалуйста, исправьте).
  6. Я считаю, что MLX CX-5 работает с PDUMP с правильной прошивкой, поэтому, пожалуйста, проверьте то же самое (информация запрашивается в комментариях).

Но рекомендуется не использовать PDUMP в качестве вторичного из-за накладных расходов на MP_HANDLE. Вместо этого напрямую используйте paylaod в первичном или вторичном.

Примечание:

  1. как уже упоминалось, есть 3 или 4 сценария, сжатых в один вопрос, и требуется отладка в реальном времени для их сортировки 1 на 1.
  2. пожалуйста, не объединяйте несколько вопросов и сценариев в 1 вопрос

Другие вопросы по теме