Один и тот же драйвер для нескольких сетевых карт - узкое место в производительности? - PullRequest
3 голосов
/ 18 июня 2009

Я использую драйвер e1000e для нескольких сетевых карт Intel (Intel EXPI9402PT, на базе чипа 82571EB). Проблема в том, что когда я пытаюсь использовать максимальную скорость (1 ГБ) на нескольких интерфейсах, скорость на каждом интерфейсе начинает падать.

У меня есть собственный драйвер в пространстве ядра, предназначенный только для отправки данных пакетов. Он просто распределяет пакеты по:

skb = dev_alloc_skb(packet->len);

и они отправляют их по:

result = dev->hard_start_xmit(skb,dev);

Каждый интерфейс имеет свой собственный экземпляр драйвера.

Для одного интерфейса я получаю: 120435948 байт / сек.

Для двух интерфейсов я получаю: 61080233 байт / с и 60515294 байт / с.

Для трех интерфейсов я получаю: 28564020 байт / с, 27111184 байт / с, 27118907 байт / с.

В чем может быть причина? Функция hard_start_xmit реентерабельна?

Ответы [ 2 ]

3 голосов
/ 18 июня 2009

Скорее всего, это связано с отсутствием пропускной способности вашей материнской платы.

Если вы пытаетесь передавать информацию со скоростью 3 Гбит / с по шине медленнее, чем 3 Гбит / с, у вас будут проблемы. На каком автобусе эти карты?

Там может быть исправление, но я думаю, что это физическое ограничение платы, а не обязательно ваш драйвер.

0 голосов
/ 19 июня 2009

Когда я складываю числа для двух интерфейсов, чистый результат немного больше, чем результат для одного интерфейса. Для меня это означает, что система работает несколько эффективнее при использовании обоих интерфейсов. Одной из возможных причин может быть лучшее использование процессора или, возможно, использование шины. Но обратите внимание, что результат лишь немного лучше и, вероятно, указывает на то, что ресурс, вызывающий горлышко бутылки, ограничен 121 МБ / с. Когда нагрузка (3 активных интерфейса) превышает этот предел, производительность резко падает до 82 МБ / с.

Трудно определить точную причину без каких-либо дополнительных измерений, но мои предположения были бы

  1. ЦП ограничен: добавление нескольких ЦП в систему исключит это как проблему.
  2. Ограничение памяти: помните, что даже если устройство находится в слоте x4 или x8, соединение с основной памятью (т. Е. Где находится SKB) может не выдержать эту нагрузку.
  3. Прерывание ограничено: количество пакетов в секунду может быть достаточно высоким, чтобы переключение между контекстами прерывания ухудшало производительность. Это менее вероятно, поскольку большинство драйверов хорошо справляются с объединением прерываний, но, если возможно, переключите драйвер в режим опроса, чтобы исключить это.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...