Самый быстрый способ создания пакетов UDP - PullRequest
1 голос
/ 28 июля 2010

Мы создаем тестовый жгут для отправки двоичных сообщений на многоадресную передачу UDP.

Прототип использует витую реакторную петлю для выталкивания сообщений, которая достигает примерно того уровня трафика, который нам необходим - около 120000 сообщений в секунду.

У нас есть 16 ядер на нашей тестовой машине, и, очевидно, я бы хотел распределить это по этим ядрам, чтобы действительно заставить жгут летать.

Есть ли у кого-нибудь идеи о том, как мы могли бы спроектировать приложение (используя подход цикла событий или подход стиля CSP), чтобы увеличить этот вывод.

Кроме того, большую часть времени в прототипе тратится на запись в UDP - как IO, я не должен удивляться, но я что-то упускаю?

Любые идеи приветствуются.

Ответы [ 2 ]

1 голос
/ 28 июля 2010

Очевидный ответ, когда возникает вопрос об использовании нескольких ядер в приложении Python, заключается в использовании нескольких процессов.В Twisted вы можете использовать reactor.spawnProcess для запуска дочернего процесса.Вы также можете просто запустить 16 экземпляров своего приложения другим способом (например, сценарием оболочки).Это требует, чтобы ваше приложение могло работать с несколькими экземплярами, работающими одновременно.То, как вы можете разделить работу так, чтобы каждый процесс мог взять на себя часть ее, зависит от характера работы.

Я ожидаю, что одна ссылка GigE будет насыщена задолго до того, как все 16 ядер будут заполненыНаклон хотя.Убедитесь, что вы сосредоточены на узком месте в системе.Как сказал Стиво, вам может понадобиться несколько сетевых карт в машине.

1 голос
/ 28 июля 2010

Несколько сетевых карт, аппаратное обеспечение или интерфейс ядра - это предел. Я могу достичь только 69 000 пакетов в секунду с помощью адаптера Gigabit Ethernet BroadX Corporation NetXtreme BCM5704S. Попробуйте четырехъядерный гигабитный серверный адаптер Intel со всеми четырьмя сетевыми картами в одной подсети.

...