Вы в основном обнаруживаете, что ядро неэффективно при разветвлении многоадресных пакетов. В худшем случае код предназначен для каждого входящего пакета, выделяющего два новых буфера, объект SKB и полезную нагрузку пакета, и дважды копирует буфер NIC.
Выберите наилучший сценарий, для каждого входящего пакета выделяется новый SKB, но полезная нагрузка пакета распределяется между двумя сокетами с подсчетом ссылок. Теперь представьте, что происходит, когда два приложения, каждое на своем ядре и на отдельных сокетах. Каждая ссылка на полезную нагрузку пакета приводит к остановке шины памяти, в то время как оба основных кэша должны сбрасываться и перезагружаться, и, кроме того, каждому приложению приходится переключать контекст ядра назад и вперед для передачи полезной нагрузки сокета. Результат - ужасная производительность.
Вы не первый, кто сталкивается с такой проблемой, и многие поставщики создали ее решения. Основная задача состоит в том, чтобы ограничить поступающие данные одним потоком на одном ядре на одном сокете, а затем распределить данные по всем другим заинтересованным потокам, предпочтительно с использованием кода пользовательского пространства, основанного на разделяемой памяти и структурах данных без блокировки.
Примерами являются Rendezvous TIBCO и Ultra Messaging 29 West, показывающие шину IPC 660 нс:
http://www.globenewswire.com/newsroom/news.html?d=194703