Как быстро прочитать данные, поступающие через сетевой адаптер 10GbE? - PullRequest
4 голосов
/ 12 февраля 2010

У меня есть две коробки Debian, соединенные кабелем CX4, проходящим между двумя картами 10 GbE. Один будет генерировать данные очень быстро (между 4 Гбит / с и 16 Гбит / с), а другой должен иметь возможность захватить все это и сохранить его в ОЗУ для последующего анализа. Я новичок в этом виде низкоуровневого кодирования и с радостью приму любые идеи о том, какой широкий подход использовать (нужен ли мне DMA? RDMA?), Или советы и рекомендации, которые могут быть применены. Спасибо!

Ответы [ 7 ]

4 голосов
/ 12 февраля 2010

Единственные устройства, которые я слышал о доступных для обычных ПК, которые будут обрабатывать загрузку 10GbE в пользовательское пространство для любого вида постобработки, - это те, что изготовлены Napatech - вам придется использовать их пользовательский API.

И вам лучше поставить такую ​​карту на довольно взрослый сервер с шиной, поддерживающей такую ​​скорость (я бы, конечно, держался подальше от любых чипсетов nvidia для такой коробки).

2 голосов
/ 14 февраля 2010

Прежде чем планировать какое-либо специальное программирование, вы должны провести некоторое тестирование, чтобы увидеть, сколько вы можете обработать с помощью ванильной системы. Настройте фиктивный файл данных и процесс отправки на компьютере-производителе и простой приемщик / анализатор на компьютере-потребителе и проведите кучу профилирования - где вы столкнетесь с проблемами с данными? Можете ли вы использовать более качественное оборудование, или вы можете настроить свою обработку так, чтобы она была быстрее?

Убедитесь, что вы начинаете с платформы HW, которая может поддерживать ожидаемые скорости передачи данных? Если вы работаете с чем-то вроде сетевой платы Intel 82598EB, убедитесь, что она подключена к слоту PCIe 2.0, предпочтительно к слоту x16, чтобы обеспечить полную пропускную способность от сетевой карты до чипсета.

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

Является ли обработка вашего набора данных распараллеливаемой? Если у вас есть одна задача, выгружающая данные в память, можете ли вы настроить еще несколько задач для одновременной обработки фрагментов данных? Это позволит использовать многоядерные процессоры.

Наконец, если ничего из этого недостаточно, используйте собранные данные профилирования / синхронизации, чтобы найти части системы, которые можно настроить для повышения производительности. Не просто предполагайте, что вы знаете, где вам нужно настроить: подкрепите его реальными данными - вы можете быть удивлены.

2 голосов
/ 12 февраля 2010

Если вы хотите постоянно обрабатывать 1 ГБ трафика в секунду, вам требуется очень широкая шина и очень высокая скорость обработки, и мой опыт исходит от NIDS . Вам необходимо специализированное оборудование для непрерывной обработки NIDS 100 МБ (1 ГБ Ethernet) данных (10 ГБ - это другая вселенная). Рам не поможет вам, потому что вы можете заполнить ГБ за 5-10 секунд, а 1 ГБ содержит много запросов.

Если вы пытаетесь выполнить какую-либо форму бизнеса или веб-обработку с 10 гигабайтами, вам, вероятно, нужно установить распределитель нагрузки, который будет поддерживать до 10 ГБ трафика впереди.

p.s., Я должен уточнить, что NIDS - это трафик 1: 1, обрабатываемый на машине, которая видит трафик - т.е. в худшем случае вы обрабатываете каждый байт на одной машине; тогда как бизнес / веб-обработка - это 1: многие: много машин и порядок байтов для обработки.

- редактировать -

Теперь, когда вы упомянули, что существует разрыв между доставкой данных (ни один стандартный 10Gb ник не может идти в ногу с 10Gb в любом случае), нам нужно знать, что представляет собой обработка, прежде чем мы сможем сделать предложение.

- редактировать 2 -

Berkeley DB (база данных с простой моделью данных) ведет себя как корпоративная база данных (с точки зрения скорости транзакций), когда вы используете несколько потоков. Если вы хотите записывать на диск с высокой скоростью, вам, вероятно, следует изучить это решение. Вы, вероятно, хотите, чтобы настройка raid увеличивала пропускную способность - raid 0 + 1 лучше всего подходит с точки зрения пропускной способности ввода-вывода и защиты.

1 голос
/ 12 февраля 2010

Поскольку у вас есть некоторые аспекты, которые упрощают ситуацию (устойчивая точка-точка между только двумя компьютерами, без обработки), я бы на самом деле попытался сделать тривиальный или очевидный метод единого потока TCP между системами и записи данных с использованием write() на диск. Затем измерьте производительность и профиль, чтобы определить узкие места.

Для начала прочитайте о проблеме C10K (10000 одновременных подключений), которая предназначена для большинства высокопроизводительных серверов. Это должно дать вам сильный фон проблем высокой производительности сервера. Конечно, вам не нужно беспокоиться о select / poll / epoll для установления новых соединений, что является основным упрощением.

1 голос
/ 12 февраля 2010

Ну, тебе понадобятся деньги. Одним из способов может быть покупка коммутатора распределения нагрузки для разделения входящих данных на два компьютера и последующей обработки в одной базе данных.

0 голосов
/ 14 декабря 2011

То, что кажется забытым: если сетевые адаптеры имеют 10 ГБ и вы беспокоитесь о приемнике, вы можете (относительно) спокойно: даже если источник способен генерировать данные с такой скоростью, у него будут те же проблемы с получением данные на линию 10 ГБ, поскольку получатель получает их из линии в ОЗУ.

И если сетевые адаптеры имеют размер 10 ГБ, это означает, что биты синхронизируются с такой скоростью, но ничего не сказано о времени между отдельными пакетами, и мы пока не говорим о протоколах.

Я полагаю, что этот вопрос устарел для ОП, но если у вас есть такое назначение, начните с регулярно программируемого решения, чтобы иметь возможность судить, какое увеличение скорости будет необходимо для вашего особого случая (ваш случай всегда особенный; -)

0 голосов
/ 18 мая 2010

Я думаю, что последнее ядро ​​Linux поддерживает пакет 10 Гб от nic-> kernel но я сомневаюсь, что есть эффективный способ скопировать данные в пространство пользователя, даже играть на платформе i7 / XEON 5500

...