Сбой тестового конвейера приложения DPDK в app_ports_check_link

Настройка теста: Linux-Server-1 Port-A <==> Port 1 DPDK-Server-2 Port 2 <==> Port B Linux-Server-2.

Выполненные шаги:

  1. Физические ссылки подключены
  2. Устройства, привязанные к DPDK:
Network devices using DPDK-compatible driver
============================================
0000:03:00.0 '82599ES 10-Gigabit SFI/SFP+ Network Connection 10fb' drv=uio_pci_generic unused=ixgbe,vfio-pci
0000:03:00.1 '82599ES 10-Gigabit SFI/SFP+ Network Connection 10fb' drv=uio_pci_generic unused=ixgbe,vfio-pci

Network devices using kernel driver
===================================
0000:05:00.0 'I210 Gigabit Network Connection 1533' if=enp5s0 drv=igb unused=vfio-pci,uio_pci_generic *Active*
0000:06:00.0 'I210 Gigabit Network Connection 1533' if=enp6s0 drv=igb unused=vfio-pci,uio_pci_generic

Проблема: Порт 2 DPDK-Server возвращается из строя app_ports_check_link

[РЕДАКТИРОВАТЬ] Работая с примером DPDK, я могу получать пакеты, отправленные на порт 1 и порт 2 DPDK.

Журнал для eventdev:

EAL: PCI device 0000:03:00.0 on NUMA socket 0
EAL:   probe driver: 8086:10fb net_ixgbe
EAL: PCI device 0000:03:00.1 on NUMA socket 0
EAL:   probe driver: 8086:10fb net_ixgbe
EAL: PCI device 0000:05:00.0 on NUMA socket 0
EAL:   probe driver: 8086:1533 net_e1000_igb
EAL: PCI device 0000:06:00.0 on NUMA socket 0
EAL:   probe driver: 8086:1533 net_e1000_igb
USER1: Creating the mbuf pool ...
USER1: Initializing NIC port 0 ...
USER1: Initializing NIC port 1 ...
USER1: Port 0 (10 Gbps) UP
USER1: Port 1 (0 Gbps) DOWN
PANIC in app_ports_check_link():
Some NIC ports are DOWN
8: [./build/pipeline(_start+0x2a) [0x558dc37c1d8a]]
7: [/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7) [0x7f318e9f5b97]]
6: [./build/pipeline(main+0x7a) [0x558dc37c1fa4]]
5: [./build/pipeline(_Z8app_initv+0x18) [0x558dc37c2940]]
4: [./build/pipeline(+0x8c909) [0x558dc37c2909]]
3: [./build/pipeline(+0x8c677) [0x558dc37c2677]]
2: [./build/pipeline(__rte_panic+0xc5) [0x558dc37b4a90]]
1: [./build/pipeline(rte_dump_stack+0x2e) [0x558dc385954e]]
fish: “sudo ./build/pipeline” terminated by signal SIGABRT (Abort)

Код

static void
app_ports_check_link(void)
{
    uint32_t all_ports_up, i;

    all_ports_up = 1;

    for (i = 0; i < app.n_ports; i++) {
        struct rte_eth_link link;
        uint16_t port;

        port = app.ports[i];
        memset(&link, 0, sizeof(link));
        rte_eth_link_get_nowait(port, &link);

        RTE_LOG(INFO, USER1, "Port %u (%u Gbps) %s\n",
            port,
            link.link_speed / 1000,
            link.link_status ? "UP" : "DOWN");

        if (link.link_status == ETH_LINK_DOWN)
            all_ports_up = 0;
    }

    if (all_ports_up == 0)
        rte_panic("Some NIC ports are DOWN\n");
}

static void
app_init_ports(void)
{
    uint32_t i;
    struct rte_eth_conf port_conf = app_port_conf_init();
    struct rte_eth_rxconf rx_conf = app_rx_conf_init();
    struct rte_eth_txconf tx_conf = app_tx_conf_init();
    (void)tx_conf;

    /* Init NIC ports, then start the ports */
    for (i = 0; i < app.n_ports; i++) {

        uint16_t port;
        int ret;

        port = app.ports[i];
        RTE_LOG(INFO, USER1, "Initializing NIC port %u ...\n", port);

        /* Init port */
        ret = rte_eth_dev_configure(
            port,
            1,
            1,
            &port_conf);
        if (ret < 0)
            rte_panic("Cannot init NIC port %u (%s)\n",
                    port, rte_strerror(ret));

        rte_eth_promiscuous_enable(port);

        /* Init RX queues */
        ret = rte_eth_rx_queue_setup(
            port,
            0,
            app.port_rx_ring_size,
            rte_eth_dev_socket_id(port),
            &rx_conf,
            app.pool);
        if (ret < 0)
            rte_panic("Cannot init RX for port %u (%d)\n",
                (uint32_t) port, ret);

        /* Init TX queues */
        ret = rte_eth_tx_queue_setup(
            port,
            0,
            app.port_tx_ring_size,
            rte_eth_dev_socket_id(port),
            NULL);
        if (ret < 0)
            rte_panic("Cannot init TX for port %u (%d)\n",
                (uint32_t) port, ret);

        /* Start port */
        ret = rte_eth_dev_start(port);
        if (ret < 0)
            rte_panic("Cannot start port %u (%d)\n", port, ret);
    }

    app_ports_check_link();
}

[РЕДАКТИРОВАТЬ] Обновление 2020/7/1

запустил $RTE_SDK/examples/skeleton/build/basicfwd -l 1, получил следующее:

EAL: Detected 24 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: No free hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: PCI device 0000:03:00.0 on NUMA socket 0
EAL:   probe driver: 8086:10fb net_ixgbe
EAL: PCI device 0000:03:00.1 on NUMA socket 0
EAL:   probe driver: 8086:10fb net_ixgbe
EAL: PCI device 0000:05:00.0 on NUMA socket 0
EAL:   probe driver: 8086:1533 net_e1000_igb
EAL: PCI device 0000:06:00.0 on NUMA socket 0
EAL:   probe driver: 8086:1533 net_e1000_igb
Port 0 MAC: 9c 69 b4 60 90 26
Port 1 MAC: 9c 69 b4 60 90 27

Core 1 forwarding packets. [Ctrl+C to quit]
recv pkts num: 1, port: 0
================= Ether header ===============
srcmac: 9C:69:B4:60:90:17
dstmac: 33:33:00:00:00:16
ethertype: 34525
This packet is IPv6
================= Ether header ===============
srcmac: 9C:69:B4:60:90:17
dstmac: 33:33:00:00:00:16
ethertype: 34525
This packet is IPv6
send 1 pkts, port: 1
recv pkts num: 1, port: 1
================= Ether header ===============
srcmac: 9C:69:B4:60:90:1C
dstmac: 33:33:00:00:00:16
ethertype: 34525
This packet is IPv6
================= Ether header ===============
srcmac: 9C:69:B4:60:90:1C
dstmac: 33:33:00:00:00:16
ethertype: 34525
This packet is IPv6
send 1 pkts, port: 0
recv pkts num: 1, port: 1
================= Ether header ===============
srcmac: 9C:69:B4:60:90:1C
dstmac: 33:33:00:00:00:16
ethertype: 34525
This packet is IPv6
================= Ether header ===============
srcmac: 9C:69:B4:60:90:1C
dstmac: 33:33:00:00:00:16
ethertype: 34525
This packet is IPv6
send 1 pkts, port: 0
...

Вроде с двумя портами проблем нет. Странный!

[РЕДАКТИРОВАТЬ] Обновление 2020/7/2

После замены rte_eth_link_get_nowait на rte_eth_link_get программа может нормально работать.

Следуя предложению @Vipin Varghese, я проверил настройки портов с помощью ethtool DEVNAME и ethtool -a DEVNAME:

  1. DPDK-сервер порт-1:
Settings for ens1f1:
        Supported ports: [ FIBRE ]
        Supported link modes:   10000baseT/Full
        Supported pause frame use: Symmetric
        Supports auto-negotiation: No
        Supported FEC modes: Not reported
        Advertised link modes:  10000baseT/Full
        Advertised pause frame use: Symmetric
        Advertised auto-negotiation: No
        Advertised FEC modes: Not reported
        Speed: 10000Mb/s
        Duplex: Full
        Port: FIBRE
        PHYAD: 0
        Transceiver: internal
        Auto-negotiation: off
        Supports Wake-on: d
        Wake-on: d
        Current message level: 0x00000007 (7)
                               drv probe link
        Link detected: yes
  1. другие
Settings for ens1f0:
        Supported ports: [ FIBRE ]
        Supported link modes:   1000baseT/Full
                                10000baseT/Full
        Supported pause frame use: Symmetric
        Supports auto-negotiation: Yes
        Supported FEC modes: Not reported
        Advertised link modes:  1000baseT/Full
                                10000baseT/Full
        Advertised pause frame use: Symmetric
        Advertised auto-negotiation: Yes
        Advertised FEC modes: Not reported
        Speed: 10000Mb/s
        Duplex: Full
        Port: FIBRE
        PHYAD: 0
        Transceiver: internal
        Auto-negotiation: on
        Supports Wake-on: d
        Wake-on: d
        Current message level: 0x00000007 (7)
                               drv probe link
        Link detected: yes
  1. все порты имеют одинаковые параметры паузы
Autonegotiate:  off
RX:             on
TX:             on

Но я очень запутался:

  1. В чем разница между текущими настройками и параметрами паузы? Как видите, в текущих настройках автосогласование включено, но в параметрах паузы автосогласование выключено.
  2. В чем разница между rte_eth_link_get_nowait и rte_eth_link_get? DPDK doc. Почему autoneg может заставить их вести себя иначе?

person HypoGump    schedule 29.06.2020    source источник
comment
если вы привяжете порты 0000:03:00.0 и 0000:03:00.1 обратно к драйверу Linux, они увеличивают порты server3? Если нет, я прошу вас проверить состояние портов server3 в dmesg. прошу обновить.   -  person Vipin Varghese    schedule 29.06.2020
comment
Обновление: топология подключения - ens1f0 (server1) ‹-› ens1f1, ens1f0 (server2) ‹-› ens1f1 (server3). В моем последнем тесте, когда все сетевые карты привязаны к драйверу Linux, четыре сетевых карты могут пройти тест. После привязки сетевых адаптеров server2 к DPDK сетевые адаптеры server1 / 3 могут пройти тест, но программа по-прежнему сообщает об ошибке неработающего порта 1.   -  person HypoGump    schedule 29.06.2020
comment
Запускаете ли вы какое-либо приложение DPDK при тестировании с ethtool -t на server1 и серверах? DPDK требует, чтобы rte_eth_dev_start был вызван, чтобы активировать связанный интерфейс DPDK. Порты не будут активированы простым связыванием с драйвером DPDK. Быстрый тест - запустить DPDK/examples/skeleton до $RTE_SDK/examples/skeleton/build/basicfwd -l 1 . жду ваших обновлений   -  person Vipin Varghese    schedule 29.06.2020
comment
жду твоего обновления   -  person Vipin Varghese    schedule 30.06.2020
comment
Извините, что ответил вам так поздно. Я обновил результат теста как ваш совет и код.   -  person HypoGump    schedule 01.07.2020
comment
Когда я тестирую с ethtool -t, ни на одном сервере не работает приложение DPDK.   -  person HypoGump    schedule 01.07.2020
comment
похоже, что rte_eth_link_get - это API, который должен быть вызван, обновлен в ответ. Жду ответа, чтобы присоединиться к dpdk-debug или skype.   -  person Vipin Varghese    schedule 01.07.2020


Ответы (1)


Объяснение:

  1. Запуск ethtool -while application is down is not a trusted way. Depending upon DPDK version rte_eth_dev_closeorrte_cleanup` не привел бы сетевой адаптер в правильное состояние.
  2. Но при запуске приложения, если порт DPDK-1 выходит из строя, это может быть причиной

а. Порт сервера 3 может автоматически согласовывать с портом 1 DPDK, что приводит к rte_eth_link_get_nowait для сообщения как down. (правый API - вызвать rte_eth_link_get). б. Порт Server-3 может быть настроен вручную в недуплексном режиме и в режиме, отличном от 10G.

правильный способ отладки - это

  • верните порт DPDK в ядро, как было предложено в комментариях.
  • перекрестная проверка автоотрицания и скорости.
  • настроить на server-1 и server-3 с no auto-neg, 10G, full-duplex
  • привяжите порт 0 и порт 1 сервера 2 к DPDK.
  • по возможности запустите тестовый конвейер DPDK с белым списком.
  • запустите ethtool -t для порта B на сервере 3, чтобы также пересечь результаты.

примечание: это поможет вам определить, является ли это драйвером / прошивкой портов 3-го сервера, который по-другому действует с автоматическим отрицанием, поскольку порты отправляют и получают пакеты успешно с example/skeleton с командой $RTE_SDK/examples/skeleton/build/basicfwd -l 1

[РЕДАКТИРОВАТЬ-1] на основе обновления из комментария похоже, что rte_eth_link_get_nowait - это быстрый подход, правильный вариант следует использовать с rte_eth_link_get. Запрошена онлайн-отладка с автором

[EDIT-2] на основе комментария rte_eth_link_get выполнил желаемую работу. Насколько я помню, rte_eth_link_get ждите фактического считывания из регистров физического устройства, в то время как rte_eth_link_get_nowait вызывается без ожидания. следовательно, для rte_eth_link_get подставляются правильные значения.

person Vipin Varghese    schedule 01.07.2020
comment
Но в моем коде app_init_ports будет вызывать rte_eth_dev_start на портах, и сообщение об ошибке не выводится, а затем происходит паника в app_ports_check_link. - person HypoGump; 01.07.2020
comment
пожалуйста, поделитесь своим app_ports_check_link кодом, поскольку он не является отдельным кодом DPDK, поскольку он другой - person Vipin Varghese; 01.07.2020
comment
вы можете войти https://chat.stackoverflow.com/rooms/215826/dpdk-debug похоже мы общаемся 2 разные вещи или скайп? Я предположил, что It seems that there is no problem with the two ports. вы утверждаете, что он работает с basicfwd. Если бы он присутствовал только в приложении, это было бы проблемой - person Vipin Varghese; 01.07.2020
comment
Еще раз спасибо! Замена rte_eth_link_get_nowait на rte_eth_link_get действительно помогает, теперь программа может нормально работать. Не могли бы вы подробно объяснить причину? Я обновляю настройки сетевой карты в Обновление 2020/7/2 - person HypoGump; 02.07.2020
comment
Пожалуйста, проголосуйте за и примите ответ, чтобы закрыть вопрос - person Vipin Varghese; 04.07.2020