Недавно я установил пару 10-гигабитных карт Ethernet на нескольких машинах, подключенных к локальной сети из примерно 80 стандартных узлов, работающих с распределенной файловой системой (Lustre). Карта 10 Гбит обеспечивает хорошую производительность при файловых операциях и работает должным образом.
Однако я написал собственное клиентское приложение на языке C, которое асинхронно отправляет большие блоки данных на несколько узлов в сети. Машина, на которой работает клиентское приложение, имеет карту Ethernet 10 ГБ, а все конечные узлы имеют карту Ethernet 1 ГБ, поэтому я должен иметь возможность получить теоретическую максимальную скорость передачи 10 ГБ.
Если я запускаю клиентское приложение на машине с 1 Гбит картой, оно легко загружает карту на длительное время. Но, как ни странно, если я запускаю то же приложение на машине с 10-гигабитной картой, производительность оказывается ужасной (около 20-30 Мбит / с).
Программа написана на C с использованием обычных сокетов TCP. Требуются ли какие-то специальные настройки для 10 Гбит? Потому что очень странно, что он обеспечивает максимальную производительность на карте 1 Гбит, но ужасную производительность на карте 10 Гбит. Опять же, проблема не в самой карте 10 Гбит, поскольку распределенная файловая система (Lustre) дает хорошую производительность с картой 10 Гбит.
Есть идеи / предложения?
Одна вещь, которую я заметил в качестве проблемы между сегментами LAN 10 ГБ и 1 ГБ, заключается в том, что MTU по умолчанию отличается. Ethernet 10 ГБ использует MTU по умолчанию 9000 в отличие от значения по умолчанию 1500 для Ethernet 1 ГБ. Вы можете либо изменить свой MTU на 10g на меньшее значение, либо настроить маршрутизатор на обработку разбивки больших пакетов за вас.
Это вызвало у меня некоторые головные боли, потому что без настройки одной из этих двух вещей происходит сильная фрагментация пакетов.
Очень вероятно, что написанное вами приложение не соответствует оптимизациям ввода-вывода стандартных приложений, таких как Lustre.
Узкие места производительности в вашем коде могут не проявляться на машине и ОС с картой 1 Гбит / с, но когда пропускная способность карты увеличивается до 10 Гбит / с при постоянных всех остальных параметрах (аппаратное обеспечение и ОС), ограничения вашего кода становятся заметными.
Это цитата из Википедии. Реализация блеска раздел.
В типичной установке Lustre на клиенте Linux модуль драйвера файловой системы Lustre загружается в ядро, и файловая система монтируется как любая другая локальная или сетевая файловая система. Клиентские приложения видят единую унифицированную файловую систему, даже если она может состоять из десятков и тысяч отдельных серверов и файловых систем MDT / OST.
На некоторых установках с массовым параллелизмом (MPP) вычислительные процессоры могут получить доступ к файловой системе Lustre, перенаправляя свои запросы ввода-вывода на выделенный узел ввода-вывода, настроенный как клиент Lustre. Этот подход был использован в установке LLNL Blue Gene.
Вы используете эту часть?
Другой подход использует библиотеку liblustre, чтобы предоставить приложениям пользовательского пространства прямой доступ к файловой системе.
Liblustre позволяет перемещать данные напрямую между пространством приложения и Lustre OSS, не требуя промежуточного копирования данных через ядро, тем самым обеспечивая доступ с малой задержкой и высокой пропускной способностью от вычислительных процессоров к файловой системе Lustre напрямую.
MTU будет важен для согласования интерфейсов.
Убедитесь, что у вас включена аппаратная разгрузка TCP (если она работает). И что прошивки на всех ваших сетевых адаптерах обновлены, так как TOE на некоторых сетевых адаптерах сильно поврежден при поставке. Я бы протестировал с включением и выключением TOE, TSO и т. Д. И посмотрел, имеет ли это какое-либо значение.
Вы используете Broadcomm 10G Ethernet, поскольку мы обнаружили реальные проблемы с ними.
Вы проверяли свою сеть с помощью тестера lnet?
Сколько у вас OSS и какую пропускную способность вы получаете через файловую систему?