Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Существует ли модуль UDT для Boost.ASIO? 
:(
    Опции темы
phprus
Дата 26.1.2011, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



Здравствуйте!

UDT ( http://udt.sourceforge.net/ ) - это протокол предназначенный для передачи данных по высокоскоростным сетям.
Подскажите пожалуйста, существует ли реализация модуля для Boost.ASIO, поддерживающего UDT? Пробовал искать, но готовых решений не находил.

Может быть здесь кто-нибудь встречал нечто подобное или хотя-бы документацию по добавлению поддержки нового протокола в Boost.ASIO?
PM MAIL WWW ICQ   Вверх
GrayCardinal
Дата 27.1.2011, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 3
Всего: 58



phprus
Извини, а на кой черт ЭТУ вещь прикручивать к бусту ? 


--------------------
PM MAIL WWW   Вверх
phprus
Дата 27.1.2011, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



GrayCardinal
А в чем проблема с Boost'ом?

Есть готовое приложение, которое использует Boost и в частности Boost.ASIO для сетевой подсистемы и в него нужно добавить поддержку UDT, при этом желательно без переписывания всей сетевой подсистемы.

P.S> Я задал этот вопрос еще и на forum.sources.ru (да простят меня модераторы за мультифорумный кросспостинг) и там мне ответили: http://forum.sources.ru/index.php?showtopic=324283 
PM MAIL WWW ICQ   Вверх
boostcoder
Дата 27.1.2011, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Цитата(phprus @  27.1.2011,  12:20 Найти цитируемый пост)
Я задал этот вопрос еще и на forum.sources.ru (да простят меня модераторы за мультифорумный кросспостинг) и там мне ответили

я даже знаю кто это smile 
PM WWW   Вверх
phprus
Дата 23.7.2011, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



Прошло пол года и у меня дошли руки реализовать такое расширение для Boost 1.47.

Правда результат тестирования меня несколько разочаровал. На канале в 1 Гбит/с (ping 4-6 мс, из них порядка 50-100Мбит/с занято трафиком соседнего vlan) средняя скорость передачи данных по TCP получилась порядка 800Мбит/с (в пиках до 930), а UDT показал среднюю скорость порядка 580Мбит/с (в пиках до 920).

При этом, если TCP набрал максимальную скорость за 3 секунды, то UDT на это потребовалось 40 секунд и провалы на графике скорости, вызванные потерями пакетов, в случае TCP гораздо короче по времени и скорости (2с, до 200Мбит/с), чем у UDT (6-10c, до 400Мбит/с).

На обоих концах канала - CentOS 5.5, TCP испытывалось при помощи iperf, UDT при помощи входящих в дистрибутив демок. Статистика снималась путем чтения значений RX, TX соответствующего сетевого интерфейса 1 раз в секунду.

А так как мое приложение в своей работе по сути обменивается сообщениями через сеть (до 40Мбайт на сообщение), то такой медленный разгон UDT на стандартных настройках может свести на нет почти все преимущества UDT.

P.S. К осени-зиме обещается 10GE оборудование и можно будет проверить применимость TCP/UDT в случае передачи данных на более высокоскоростных линиях связи.

P.P.S. Код модифицированной ASIO для UDT в ближайшее время выложу для всеобщего обозрениязакидывания помидорами.
PM MAIL WWW ICQ   Вверх
boostcoder
Дата 23.7.2011, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



phprus, в какой-то теме, я Вам пытался сказать о том, что TCP в моей задаче и на моем оборудовании отлично справляется. я не видел нужды завершать реализацию UDT для asio.
помимо того, я проводил тесты демками что в дистре, и не увидел большого выигрыша. он был. но незначительный. потому забросил.

Добавлено через 2 минуты и 1 секунду
Цитата(boostcoder @  23.7.2011,  13:06 Найти цитируемый пост)
я проводил тесты демками что в дистре

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

Добавлено через 3 минуты и 48 секунд
в общем, я тоже немного разочаровался в том, что мои результаты тестов не подтверждают тех что выложены на офф. сайте :(
PM WWW   Вверх
phprus
Дата 23.7.2011, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



boostcoder, судя по тому, что написано на официальном сайте UDT, заявленная эффективность должна проявляться на высокоскоростных линиях связи с большими пингами. Например, при трансконтинентальной передаче данных. А у меня рабочая инфраструктура всего 400км в длину и 5мс RTT, да и канал всего 1GE.

Когда появится оборудование 10GE буду проводить повторные тесты, вдруг что-то изменится и авторы на самом деле правы, а это мы со своим "допотопным" железом что-то делать пытаемся smile) .


Цитата(boostcoder @  23.7.2011,  16:06 Найти цитируемый пост)
смысла во времязатратах на на реализацию UDT я не обнаружил.

Для меня отрицательный результат тоже результат. Так как эта часть была указана в описании работ по грантам (я в научной организации работаю), следовательно даже если эта часть в итоге использоваться не будет, то проверить эффективность все равно надо.

P.S.> Но нет худа без добра smile Когда делал эту реализацию немного лучше разобрался во внутренностях ASIO.
PM MAIL WWW ICQ   Вверх
phprus
Дата 29.7.2011, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



Цитата(boostcoder @  23.7.2011,  16:06 Найти цитируемый пост)
ах да. я еще и свои клиент и сервер написал. чтоб было. и все так же. смысла во времязатратах на на реализацию UDT я не обнаружил.

Скажи пожалуйста, можно будет посмотреть твою реализацию клиента и сервера UDT?
PM MAIL WWW ICQ   Вверх
boostcoder
Дата 29.7.2011, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



сервер. код клиента почти ничем не отличается от того что в примере.
Код


#include <iostream>
#include <boost/thread.hpp>
#include <string.h>
#include <udt.h>

/***************************************************************************/

struct thread_args {
   thread_args()
      :run(true),
      connections(0),
      per_sec_req(0),
      per_sec_ask(0),
      epoll_fd(0)
   {}

   volatile bool run;
   volatile int connections;
   volatile int per_sec_req;
   volatile int per_sec_ask;
   int epoll_fd;
   boost::mutex mutex;
   void add(UDTSOCKET s) {
      boost::mutex::scoped_lock locker(mutex);
      UDT::epoll_add_usock(epoll_fd, s);
   }


};

void epoll_thread(thread_args&);

/***************************************************************************/

int main(int argc, char** argv) {
   (void)argc;
   (void)argv;

   UDT::startup();

   const int port = 9000;

   UDTSOCKET sock = UDT::socket(AF_INET, SOCK_DGRAM, 0);
   if ( UDT::INVALID_SOCK == sock ) {
      std::cout << "UDT::socket(): " << UDT::getlasterror().getErrorMessage() << std::endl;
      return 1;
   }

   sockaddr_in addr;
   memset(&addr, 0, sizeof(addr));
   addr.sin_family      = AF_INET;
   addr.sin_port        = htons(port);
   addr.sin_addr.s_addr = INADDR_ANY;

   if ( UDT::ERROR == UDT::bind(sock, (sockaddr*)&addr, sizeof(addr)) ) {
      std::cout << "UDT::bind(): " << UDT::getlasterror().getErrorMessage() << std::endl;
      return 1;
   }

   if ( UDT::ERROR == UDT::listen(sock, 10) ) {
      std::cout << "UDT::bind(): " << UDT::getlasterror().getErrorMessage() << std::endl;
      return 1;
   }

   /**  */
   thread_args args;
   args.run = true;
   args.epoll_fd = UDT::epoll_create();
   boost::thread thread(&epoll_thread, boost::ref(args));
   boost::thread stat(
      [&args]() {
         while ( args.run ) {
            std::cout
            << "connections: " << args.connections << std::endl
            << "requests   : " << args.per_sec_req << std::endl
            << "answers    : " << args.per_sec_ask << std::endl
            << std::endl;
            args.per_sec_req = args.per_sec_ask = 0;
            boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
         }
      }
   );

   sockaddr_storage clientaddr;
   int addrlen = sizeof(clientaddr);

   UDTSOCKET client;
   while ( args.run ) {
      if ( UDT::INVALID_SOCK == (client = UDT::accept(sock, (sockaddr*)&clientaddr, &addrlen)) ) {
         std::cout << "UDT::accept(): " << UDT::getlasterror().getErrorMessage() << std::endl;
         args.run = false;
         thread.join();
         break;
      }
      args.connections++;
      args.add(client);
   }

   UDT::epoll_release(args.epoll_fd);
   UDT::cleanup();
}

/***************************************************************************/

void epoll_thread(thread_args& args) {
   std::set<UDTSOCKET> readfds;
   char buf[32] = "\0";

   while ( args.run ) {
      if ( 0 == UDT::epoll_wait(args.epoll_fd, &readfds, 0, 10) ) continue;

      for ( std::set<UDTSOCKET>::iterator it = readfds.begin(); it != readfds.end(); ++it ) {
         bool block = false;
         UDT::setsockopt(*it, 0, UDT_RCVSYN, &block, sizeof(bool));
         UDT::setsockopt(*it, 0, UDT_SNDSYN, &block, sizeof(bool));

         if ( UDT::ERROR == UDT::recvmsg(*it, buf, sizeof(buf)) ) {
            std::cout << "UDT::recv(): " << UDT::getlasterror().getErrorMessage() << std::endl;
         }
         if ( UDT::ERROR == UDT::sendmsg(*it, buf, sizeof(buf)) ) {
               std::cout << "UDT::send(): " << UDT::getlasterror().getErrorMessage() << std::endl;
         }
         {  boost::mutex::scoped_lock locker(args.mutex);
            args.per_sec_req++;
            args.per_sec_ask++;
         }
      }
   }
}

/***************************************************************************/


PM WWW   Вверх
phprus
Дата 30.7.2011, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



boostcoder
Спасибо!
PM MAIL WWW ICQ   Вверх
boostcoder
Дата 1.8.2011, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



phprus, скажи, у тебя действительно нет предела пропускной способности из-за того что сервер все свои ресурсы тратит на аллокации?
я, к примеру, в своем проекте реализовал для всех хэндлеров Custom Memory Allocation, и нагрузка на проц уменьшилась в 2.5 раза!
я в какой-то теме уже писал о том, что половина ресурсов затрачивалось только на new и delete.
все же, уже в который раз убеждаюсь в том, что asio создавалась не дауном, и там нет ничего лишнего или каких-либо ограничений smile 
PM WWW   Вверх
phprus
Дата 2.8.2011, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



boostcoder
На гигабите нету. До тормозов из-за распределителя памяти еще очень далеко.
Правда у меня и обращений к new/delete в самих обработчиках практически нет (но почитать про Custom Memory Allocation я все равно планирую). А вот тормоза из-за излишних копирований данных были и один маленький баг из-за которого были эти копирования влиял на производительность уменьшая ее почти в 5 раз.

Сейчас у меня потенциальная производительность упирается в сеть и в то, с какой скоростью я могу получать данные для раздачи из оборудования.
Ну еще и винда XP в качестве сервера меня настораживает, однако прорабатывается вопрос ее замены на "нормальную", серверную винду.
PM MAIL WWW ICQ   Вверх
boostcoder
Дата 2.8.2011, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Цитата(phprus @  2.8.2011,  12:52 Найти цитируемый пост)
у меня и обращений к new/delete в самих обработчиках практически нет

каждый boost::bind() выполняет new/delete.
PM WWW   Вверх
phprus
Дата 2.8.2011, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



Цитата(boostcoder @  2.8.2011,  17:41 Найти цитируемый пост)
каждый boost::bind() выполняет new/delete. 

Интересно. Не знал об этой детали реализации.

Я правильно понимаю, что пример http://www.boost.org/doc/libs/1_47_0/doc/h...tion/server.cpp показывает, как можно избежать таких new/delete?
Пожалуй надо более детально разобраться в этом механизме.
PM MAIL WWW ICQ   Вверх
boostcoder
Дата 2.8.2011, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Цитата(phprus @  2.8.2011,  15:12 Найти цитируемый пост)
Я правильно понимаю, что пример http://www.boost.org/doc/libs/1_47_0/doc/h...tion/server.cpp показывает, как можно избежать таких new/delete?

да. но в нем не хватает почему-то InvocationStrategy...
вот пример на базе того кода: http://liveworkspace.org/code/d8f9abec20e6...590d53f53f373a4

Добавлено через 2 минуты и 32 секунды
я еще планирую по этому же принципу реализовать ReusingAllocators/ReusingSessions.
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1281 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.