Узкое место тут - общая скорость памяти. И ширина, и количество раздельных каналов, и структура внутри канала, и отображение физических адресов в геометрические, и длина цикла памяти. Условный Cavium бросается пакетами по всем сторонам именно из-за большого количества раздельных и коротких каналов памяти, а не занимается пересыланием полной строки кеша при доступе к uint32 (да и не имеет кеша в понятии х86). Забрать хедеры и сами пакеты с кабеля - это просто и не дорого, а вот копаться в том самом хедере и сравнивать его поля со структурами в памяти - это дорого для платформ общего применения. Само ядро даже десятилетней платформы х86 может легко обрабатывать на уровне десятков миллионов пакетов на нетривиальном пути, но мгновенно упирается в память.
DPDK - это все-таки набор драйверов и некоторых отдельных компонентов, такой конструктор, из которого можно сделать аппликацию по своим потребностям. Драйверы там хорошые, но пакетная часть - она довольно ограничена в контексте параллеливания, большинство структур там под локами, и также совсем не дружелюбно к деталям памяти (и тут трудно делать более масштабируемый локинг, так как это сводится к еще большей нагрузке на память). Если задача в обработке 1Г - то это не имеет значения, но если 100Г+ - то будет больно.