/HL-web-server

Конфигурируемый Web-сервер для отдачи статических файлов, способный работать под высокой нагрузкой

Primary LanguageHTML

Архитектура

  • Язык программирования: C
  • Реализация многопоточности: prefork
  • Асинхронность: libev

Конфигурация

Задание конфигураций осуществляется через файл serv.conf

Параметры:

  • port - порт, на котором сервер будет слушать соединения (8080 по умолчанию)
  • cpu_limit - количество работающих процессов. Рекомендуется устанавливать число, равное числу ядер в системе (1 по умолчанию)
  • root_dir - директория, относительно которой сервер ищет запрашиваемые файлы (/var/www/html по умолчанию). Не рекомендуется устанавливать корневую директорию.

Использование

  • Запуск/перезапуск - make
  • Использование готового докер-контейнера - make use-docker
  • Сборка бинарного файла - make build-bin
  • Запуск бинарного файла - make go-bin
  • Сборка докер-образа - make build-docker
  • Запуск в докер-контейнере - make run-docker

Тестирование

  • Запуск функционального тестирования на сервер - make func
  • Запуск нагрузочного тестирования на сервер - make perf-server
  • Сборка Nginx - make build-nginx
  • Запуск Nginx - make run-nginx
  • Запуск нагрузочного тестирования на Nginx - make perf-nginx

Сравнительная оценка результатов тестирования

Нагрузочное тестирование производилось с помощью WRK.

Значения RPS в зависимости от числа воркеров в сервере:

Num cores server nginx
1 2071.78 2239.06
2 3437.98 3584.98
3 4241.62 5043.96
4 4861.24 5605.93
6* 5208.74 5786.48
12 4677.56 5887.73
16 3877.23 6076.78
64 3063.41 5987.70

*(max cores for stand)

Нетрудно видеть, что оптимум располагается при числе воркеров, равным числу физических ядер. Однако с дальнейшим увеличением числа воркеров производительность уменьшается на сервере, ввиду, вероятно, дополнительных накладных расходов на переклюения контекста процессором для большего числа процессов.

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