Меня интересует тот факт, что архитектура PCI является иерархической. Следовательно, даже если у меня есть два слота PCIx4, возможно, я не смогу полностью использовать его, потому что слоты будут подключаться к одному узлу, пропускная способность которого может быть недостаточной для обработки 2x PCIex4.
Предыстория моего вопроса: я пытаюсь использовать восемь интерфейсов PCIe 1GBit. У меня есть две карты с двумя портами и одна карта с четырьмя портами. Я могу получить максимум на 4-х сетевых интерфейсах. После активации 5-го порта производительность немного падает на каждых пяти интерфейсах. То же самое после активации интерфейса 6, 7 и 8.
Главный вопрос: Как получить структуру PCIe на машине, «нарисовать» ее, увидеть ее узлы и соединения и определить самый слабый узел в этом дереве?
Каждая линия PCIe (v1) должна удобно обрабатывать 2 канала 1 Гбит / с.
На данный момент DDR2 может комфортно обрабатывать скорость передачи данных 10 Гбит / с.
В общем, компоновка PCIe машины продиктована набором микросхем, и если вы найдете схему от Intel или кого-либо еще, вы сможете определить, где находятся узкие места.
Например:
Если вы используете Unix-подобную операционную систему, пробные сообщения во время загрузки часто перечисляют все на шине PCI и дают вам представление о том, как это устроено. Системы Linux имеют lspci
команда, которая будет делать то же самое.
Если вам нужна большая пропускная способность на шине, вы можете изучить возможность получения сервера Supermicro с UIO слоты. Используя AOC-UG-14 позволит вам отключить хотя бы одну карту Gigabit Ethernet с 4 портами от шины PCI. Хосты 2U могут иметь два слота UIO, плюс, я полагаю, три дополнительных слота PCI, что вполне может позволить вам построить машину с 12 портами GigE, работающими с полной производительностью.
Здесь задействована не только архитектура PCI, но и ваша системная шина, пропускная способность памяти и внутренняя пропускная способность на всех наборах микросхем. Обратите внимание на комментарий Wazoox - даже относительно недавние платформы Xeon плохо работали на высоких скоростях линии.
Из прочтения ваших других комментариев я понимаю, что вы выполняете генерацию пакетов программно и распространяете это через свои гиганты. Если вы не разбираетесь в том, как вы генерируете данные, вы вполне можете переполнить пропускную способность своей памяти. DDR2 будет обрабатывать 10 ГБ, бит, если вы делаете несколько копий в памяти при генерации пакетов, вы фактически делаете намного больше внутреннего трафика.
Кроме того, если все 8 ядер привязаны, то вы не успеваете ни за одним из них. Будь то загрузка прерывания или плохие пути кода в процессе генерации пакетов, что-то мешает вам. Я предлагаю сначала решить эту проблему. Профилируйте свой код и выясните, есть ли что-то очевидное, отнимающее у вас большую часть времени.
Если это не поможет и в зависимости от ваших требований к использованию, вы можете рассмотреть некоторые реальные карты сетевой обработки / захвата / передачи, такие как Endaceкарты DAG (я бы предложил DAG 7.5 G2 / G4 для PCI-e). Они не управляются прерываниями, поэтому нет дополнительной нагрузки на обработку из-за прерываний. Это не сетевые карты как таковые, поэтому вам придется создать весь пакет и полезную нагрузку, а также обработать уровень 2, но это не так дорого.
Отказ от ответственности: я работаю в Endace.