#c #dpdk
Вопрос:
Я пытаюсь фрагментировать пакет IPv4, используя приведенную ниже логику:
~after pkts ingress~
struct rte_port_ring_writer *p = port_out->h_port;
pool_direct = rte_mempool_lookup("MEMPOOL0");
pool_indirect = rte_mempool_lookup("MEMPOOL1");
printf("before frag mempool size d %d in %dn",rte_mempool_avail_count(pool_direct),rte_mempool_avail_count(pool_indirect));
struct rte_mbuf *frag_pkts[MAX_FRAG_SIZE];
int out_pkts = rte_ipv4_fragment_packet (m, frag_pkts, n_frags, ip_mtu,pool_direct, pool_indirect);
printf("after frag mempool size d %d in %dn",rte_mempool_avail_count(pool_direct),rte_mempool_avail_count(pool_indirect));
if(out_pkts > 0)
port_out->ops.f_tx_bulk(port_out->h_port,frag_pkts,RTE_LEN2MASK(out_pkts, uint64_t));
else
printf("frag failedn");
rte_pktmbuf_free>(m); //free parent pkt
Теперь проблема здесь в том, что косвенный mempool исчерпывается. В результате после нескольких пакетов фрагментация завершается сбоем из-за-ENOMEM. Я совершенно не могу понять, почему PMD не освобождает и не возвращает объект mempool обратно в MEMPOOL1. Маловероятно, что это связано с тем, что порты NIC ограничены MEMPOOL0, а фрагменты pkt из MEMPOOL1 удаляются.
Пожалуйста, найдите в журнале ниже приведенный выше фрагмент, в котором печатаются доступные слоты в прямых (d) и косвенных (in) пулах памяти:
перед фраг mempool размер D 2060457 в 2095988
после фраг mempool размер D 2060344 в 2095952
до фраг mempool размер D 2060361 в 2095945
после фраг mempool размер D 2060215 в 2095913
.
.
.
перед фраг mempool размер D 2045013 в 0
после фраг mempool размер D 2045013 в 0
перед фраг mempool размер D 2045013 в 0
после фраг mempool размер D 2045013 в 0
перед фраг mempool размер D 2045013 в 0
Я вижу, как прямой mempool уменьшается и увеличивается по мере поступления и удаления/выхода пакетов, как и ожидалось. Я также могу подтвердить, что получил начальный пакет фрагментированных пакетов, равный размеру MEMPOOL1. Мы высоко ценим любой вклад в понимание причины проблемы.
P. S: У нас была та же проблема в dpdk17.11. Нам пришлось преломить rte_ipv4_fragment_packet (), чтобы не использовать косвенную цепочку фрагментов вместо того, чтобы просто генерировать их.
Изменить:
Версия DPDK — 20.11
Env — linux — centos 7
PMD — i40e — использование связи в режиме 4
Размер Пкт — 128
МТУ — 70
Пулы памяти создаются с помощью rte_pktmbuf_pool_create(), таким образом, без флага SC/SP (по умолчанию MC/MP). Также всегда n_frags
Спасибо и с уважением,
Вишал Мохан
Комментарии:
1. пожалуйста, обновите вопрос следующей информацией
1) DPDK version 2) Linux or BSD or Windows 3) NIC PMD in use 4) Proc-info memopool result 5) please update the packet size of original packet m 5) is n_frags == MAX_FRAG_SIZE 6) ip_mtu value 7) what are parameter values used for creating direct and indirect mempool
. @VishalMohan с нетерпением ждем обновления2. Кроме того, в DPDK есть пример
ip_fragmentation
, в котором используется тот же API. Пожалуйста, подтвердите, что вы можете воспроизвести ту же ошибку. @VishalMohan с нетерпением ждем обновления3. Привет @VipinVarghese, спасибо за ответ. Я обновил необходимую информацию в ОП. Также проверим пример ip_frag, приведенный DPDK. Имеет ли вообще какое-либо значение использование связи ? Pmd связи AFAIK отвечает только за выбор порта связи, и все равно PMD сетевой карты отвечает за выход и управление памятью mbuf. Пожалуйста, исправьте меня, если это понимание неправильно
4. существует пробел в понимании, я полагаю, что у вас есть мой идентификатор skype, пожалуйста, свяжитесь по skype для дальнейшего обсуждения
5. Привет @VishalMohan, жду синхронизации с вашего конца.
Ответ №1:
DPDK API rte_ipv4_fragment_packet используется как testpmd
в примере, так и в примере DPDK ip_fragementation
. Они также включены в набор тестов DPDK, который также запускается для каждого выпуска.
На основе внутреннего тестирования и надлежащего использования API, например Ip_fragementation
, проблема не может быть воспроизведена. Следовательно, утечка буферов пула памяти API весьма маловероятна, если не считать какого-то специального углового случая (который еще предстоит найти).
Основываясь на анализе фрагмента кода, причиной исчерпания mempool может быть следующее
- не удается освободить прямой буфер после фрагментации
- не удается освободить один или несколько фрагментов из косвенного буфера при сбое tx_burst.
[РЕДАКТИРОВАТЬ-1] основываясь на обновлении электронной почты и комментариях, действительно нет проблем с API DPDK rte_ipv4_fragment_packet. Проблема связана с логикой приложения, с новым поведением, как
- DPDK СВЯЗЬ PMD приводит к исчерпанию mempool с текущим фрагментом кода
- DPDK BOND PMD не имеет проблем с DPDK пример с rte_ipv4_fragment_packet
- DPDK i40e PMD имеет проблему с текущим фрагментом кода
- DPDK i40e PMD не имеет проблем с примером dpdk rte_ipv4_fragment_packet
Следовательно, проблема связана с примером фрагмента кода и его использованием, а не с API DPDK.
Комментарии:
1. Спасибо за поддержку Випин. Да, с примерами все хорошо. Но не при использовании вместе с нашим приложением. Наверняка memleak отсутствует, потому что после фрагментации мы отправляем пакет на порт связи (при условии, что pmd освободит mbuf). Мы пересмотрим логику приложения и обновим его, если таковые имеются.