мы можем использовать очередь DPDK только без использования других функций dpdk в приложении c ++ - PullRequest
0 голосов
/ 11 марта 2020

У меня есть приложение c ++ (Linux), которое использует нашу собственную реализацию Queue. Здесь поток «Thread1» читает из интерфейса NI C и записывает в очередь, а другой поток «Thread2» в очередь из очереди. Это было реализовано с помощью механизма блокировки. Чтобы ускорить постановку / снятие очереди, я хотел реализовать только очередь DPDK в своем приложении. Я выполнил ПО C и обнаружил, что производительность улучшается.

Проблема, с которой я сталкиваюсь, заключается в том, что как только я инициализирую свой код с помощью "rte_eal_init", все ядра ЦП попадают под контроль потоков DPDK. (если я передаю 1 ядро, используя аргумент командной строки, то беру только это ядро). Я хочу избежать взятия ядер DPDK. Я просто хочу использовать очередь DPDK как любую другую библиотеку.

Другая проблема заключается в том, что если я не использую API DPDK для вращения потоков, то все потоки появляются после того, как "rte_eal_init" появляется на главном ЦП. (cpu0). Я ожидаю, что планировщик будет свободно планировать потоки в любом из ядер.

Может кто-нибудь дать какую-либо идею, если это возможно, или есть какой-то другой способ сделать это.

1 Ответ

0 голосов
/ 13 марта 2020

Dpdk rte_eal_init не потребляет 100% основного процессора. Это просто функция конфигурации для инициализации компонентов dpdk. Это rx_burst при запуске в режиме опроса (непрерывно l oop), который вызывает 100% использование.

Если цель состоит в том, чтобы использовать кольцевые буферы dpdk и библиотеки, вы можете сделать то же самое 1. Вместо непрерывного опроса либо основной, либо рабочий поток, попробуйте использовать режим прерывания. 2. Также можно использовать AF_XDP SOCK для выборки пакетов с помощью select.

После того, как вы получили пакет, в соответствии с вашим требованием вы помещаете в промежуточный кольцевой буфер. Используя второй поток, вы тоже deque от ринга. Это приведет к опросу потока от 2 до go.

Что касается состояний ожидания, запуска и остановки потоков, пожалуйста, go через l2fwd, skelton. В списке API-интерфейсов dpdk есть api, например, remote_launch wait, который делает то же самое.

...