При начале работ над сервером для системы обновления остро встал вопрос об создании своей RTL, уж слишком много претензий было в стандартной. Основными из них были:
- Медленная и избыточная реализация threadvar (а через них, как минимум, реализовывался errno)
- Медленная реализация исключений, к тому же требовавшая создания экземпляр класса и как следствие выделения памяти
- Неясное поведение стандартного хипа
По мимо перечисленных были и другие, не столь значимые, проблемы, вроде огромнейших дыр в переводе заголовков Linux (например отсутствие заголовков EPoll). Принимая во внимание сравнительно небольшой объём работы необходимый для создания своей узкоспециализированной RTL, было принято решения начать разработку CatServerRTL.
И вот сегодня основные работы над RTL завершились. Конечно возможно что придётся что-то дорабатывать, но основные вещи уже готовы. Разработка заняла 98.5 часов, а размер RTL – 1646 строк кода (и еще используется около 9500 строк кода из CatFramework).
Операция |
Стандартная 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 там, где в приоритете скорость не целесообразно.