- Язык программирования: 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 такой деградации не было замечено, ввиду, предположительно, имеющихся оптимизаций для большого числа воркеров.