«

»

Сен 08 2012

Разработка CatServerRTL завершена

При начале работ над сервером для системы обновления остро встал вопрос об создании своей RTL, уж слишком много претензий было в стандартной. Основными из них были:

  • Медленная и избыточная реализация threadvar (а через них, как минимум, реализовывался errno)
  • Медленная реализация исключений, к тому же требовавшая создания экземпляр класса и как следствие выделения памяти
  • Неясное поведение стандартного хипа

По мимо перечисленных были  и другие, не столь значимые, проблемы, вроде огромнейших дыр в переводе заголовков Linux (например отсутствие заголовков EPoll). Принимая во внимание сравнительно небольшой объём работы необходимый для создания своей узкоспециализированной RTL, было принято решения начать разработку CatServerRTL.

И вот сегодня основные работы над RTL завершились. Конечно возможно что придётся что-то дорабатывать, но основные вещи уже готовы. Разработка заняла 98.5 часов, а размер RTL – 1646 строк кода (и еще используется около 9500 строк кода из CatFramework).

Сравнение относительного времени выполнения различных операций в стандартной RTL и CatServerRTL
Операция
Стандартная RTL, однопоточное приложение
Стандартная RTL, многопоточное приложение
CatServerRTL, однопоточное приложение
CatServerRTL, многопоточное приложение
Неудачный вызов syscall (закрытие несуществующего файлового дескриптора)  100% 111% 96% 96%
Обращение с ThreadVar 100% 634% 302% 302%
Обработка исключений 100% 180% 30% 32%

 

Кроме прочего, еще одной больной темой была организация лога для сервера. Во время дискуссии на эту тему на GameDev.ru некоторые предлагали использовать для этих целей демона syslogd с передачей ему сообщений по Unix-сокету /dev/log. Функция log из CatServerRTL осуществляет формирование строки лога на стеке, после чего сбрасывает её в файловый дескриптор 1 вызовом write (правда оговорюсь, что данный метод имеет маленький недостаток при обработке сигналов, но тесты показали что им можно пренебречь). Для тестов была выбран следующий сценарий: каждый из 2-х потоков приложения должен записать в лог-файл миллион строк. Замерялись время выполнения и нагрузка процессора в это время:

  • Стандартная RTL: 9с, загрузка процессора 50%+84% (потери 75% сообщений даже после настройки syslogd)
  • CatServerRTL: 0.71с, загрузка процессора 25%

Думаю результаты говорят сами за себя. Использование syslogd там, где в приоритете скорость не целесообразно.

Добавить комментарий