вторник, 8 сентября 2009 г.

Старт дан, что дальше?


Вот, вроде, наконец-то "пошла работа" по проекту "asio samples". Что уж и говорить, и времени не хватает и трудно "переходить" от одного приложения в "asio samples" к другому - руки так и "тянутся" что-то поправить, улучшить, добавить, но только не начинать новое приложение.


Итак, имеем (https://sourceforge.net/projects/asio-samples/):


1) nmea_client (категория "клиент") - простое чтение данных с последовательного порта с разбиением на строки. Планируется постепенно добавить "параллельный" парсинг NMEA 0183. Основная задача - показать, что разработанная модель работы с активными объектами полезна в программировании клиентов сетевых приложений и привести пример с custom memory allocation.


2) echo_server (категория "сервер") - (не)простой эхо-сервер. Планирую провести нагрузочное/стресс тестирование и сравнить с другими (может кто подскажет?).


Для начала в качестве инструмента тестирования взял tests/performance/client, что посоветовал Christopher Kohlhoff из non-boost asio 1.4.1. Но вот незадача - не умеет этот client и читать и писать одновременно (на самом деле умеет, но только за счет буферов сокета) - надо будет "прикрутить" к нему io_buffer из моего эхо-сервера, но это уже спорная модификация.


Сейчас занят следующим - ищу для тестирования эхо-сервера:


а) подходящий инструментарий - вот для Web-серверов его "навалом" я для эхо - нет (а у эхо-сервера своя специфика!)


б) другие реализации, можно даже "не-open source" - пока хочу сравнить с эхо-сервером из Windows 2003 R2 и с ProstoServer echo server - если кто может подсказать другие - "милости прошу"


в) инициативных добровольцев 8) - может кому-то интересно самому провести такое тестирование? (например, чтобы доказать, что "его/мой эхо-сервер лучше/хуже")
Очень интересно знать, какой же он - этот самый overhead от использования прослойки по имени boost::asio? Надеюсь, что в пределах 5% по сравнению с трафиком других серверов. Кроме того, надеюсь, что память будет использоваться довольно экономично (старался все таки).


Теперь о планах:


1) переделка chat_client из asio examples - "заюзаю" Qt и "свою модель работы с асинхронными активными объектами, построенными на базе boost::asio". Это будет пример того, как лучше всего (для производительности - не для простого "читателя" кода) соединять GUI и активные объекты на boost::asio (и вообще, мой первый серьезный GUI-проект с использованием Qt и boost::asio 8). Заодно "обкатаю" и Qt Creator - помимо MS VS 2008 + Qt integration) - давно интересует вопрос: как Qt Creator поведет себя на rich-template C++ code (читайте Boost C++ Libraries).


2) (естественно) переделка chat_server из asio examples - для начала по аналогии с эхо-сервером (если раньше кто-нибудь не докажет мне "провальность" моего старания) - но основная задача переделки - подготовка к усложнению протокола, предложенного в asio examples для chat-а: переделка будет в несколько этапов и на первом из них планирую ввести handshake, authentication (login), logout (с возможностью последующего login), shutdown, timeouts (connect, login, read-write, inactivity).


Вот еще вчера Christopher Kohlhoff наконец-то "всенародно признался" (asio-users mailing list), что SSL в boost::asio не поддерживает custom memory allocation (не случайно я всегда смотрю код перед тем как на него положиться!) - думаю SSL - это minimum must have в любом сервере - так что надо попробовать осилить OpenSSL и переделать boost::asio::ssl::detail::openssl_stream_service - но прежде надо четко все распланировать и "вставить" это в общий план.

7 комментариев:

niXman комментирует...

вообще, хочу сказать - замечательный ресурс!

но мне интересно другое: с пониманием принципов/архитектуры/концепта asio, у большинства знакомых мне программистов проблемы. и я не исключение. сейчас уже вроде получше ориентируюсь, но все равно существуют "узкие" для моего понимания моменты. надеюсь Ваш блог поможет расставить все по полочкам.
так вот... из-за сказанного выше, очень часто приходится гуглить по теме. но ни я, ни знакомые, никогда не видели этот блог!
нахожу постоянно это:
http://evgeny-lazin.blogspot.com/2008/12/boostasio.html
http://evgeny-lazin.blogspot.com/2009/02/boostasio.html

как такое возможно?!

в любом случае, сильно Вам благодарен за проделанную Вами работу.
спасибо.

Marat Abrarov комментирует...

Надо использовать Yandex и листать чуть дальше первой страницы 8)
Я и сам не понимаю, почему в поисковиках этот блог трудно найти. Думаю, основная причина - русский язык.

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

niXman комментирует...
Этот комментарий был удален автором.
Igor Razin комментирует...

Есть ли какие-нибудь результаты тестирования?

Marat Abrarov комментирует...

Есть ли какие-нибудь результаты тестирования?

Нагрузочное тестирование я так и не провел. При столь простой логике нет смысла.

Сравнивал с EchoServer из ProstoServer. В качестве клиента использовал EchoClient из ProstoServer. То echo_server вырывался вперед, то EchoServer. Сложилось ощущение, что EchoServer все же немного по-быстрее на accept работает (чего я от него и ожидал).

EchoClient, кажется, за одну TCP-сессию только один раз отправляет данные и один раз принимает. Так что посмотреть, насколько asio overhead сказвается на echo_server, не получится - нужно писать свой клиент.

Igor Razin комментирует...

Да, EchoClient шлет 1Кб, принимает обратно и отключается.
ProstoServer моя библиотека, вот и стало интересно :)

Marat Abrarov комментирует...

Я это понял еще по первому комментарию :)