Как перенести существующее приложение udp на необработанные сокеты

Есть ли руководство по переходу с простых сокетов udp (linux, C99 / C ++, recv syscall) на необработанные сокеты?

Согласно http://aschauf.landshut.org/fh/linux/udp_vs_raw/ch03s04.html raw socket намного быстрее, чем udp.

Приложение клиент-серверное. клиент является проприетарным и должен использовать точно такой же протокол, как и с udp-сервером. Но сервер может быть немного быстрее с сырыми сокетами. Какие части udp я должен реализовать на сервере? Есть ли библиотеки "быстрой миграции"?


person osgx    schedule 31.05.2010    source источник
comment
Кроме того, какая часть работы udp выиграет от использования rawsockets - отправка или получение?   -  person osgx    schedule 31.05.2010
comment
Производительность по скорости достигается за счет отказа от уровня IP, то есть маршрутизации, фильтрации, управления портами и т. Д. Хорошим направлением для рассмотрения было бы RDMAoE, то есть RDMA через Ethernet, поговорите с Mellanox.   -  person Steve-o    schedule 18.08.2010
comment
Стив-о, это программное обеспечение (RDMAoE) или оборудование? Требуется ли, чтобы обе машины находились в одной подсети (только коммутаторы между ними)?   -  person osgx    schedule 18.08.2010


Ответы (1)


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

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

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

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

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

person feroze    schedule 05.06.2010
comment
мое приложение на данный момент является эталонным кодом, в то время как он выполняет recvfrom / sendto. так что нечего оптимизировать в клиент / сервер. Стек udp / ip ОС ограничивает скорость. да, это тест для пинг-понга и реальное приложение работает в том же стиле. Клиент и сервер можно переписать как в сырые сокеты. - person osgx; 06.06.2010