Смешанные эмоции. Ебанул 12 форков (ровно столько, сколько у меня потоков в процессоре). 175к рпс конечно круто, но меня напрягает то, что процессор практически всё время тестирования был загружен на сотку. К примеру, с 6 процессами, он был загружен на 60-65% (что тоже много, как по мне). Зато результаты неплохие. Интересно, зеон же схавает?
Теперь ещё лучше. Я перенёс форк в непосредственно класс-контроллер (главный класс веб-сервера, точка вхождения), убрал пару ненужных конструкций. Теперь стало ещё приятней: производительность ведь выросла на целых 25к рпс
Чайник из ЮтыПожалуй, буду разбавлять подобные посты в официальном стиле ещё и неким подобием дневника разработки вебсервера. Конечно, без всги/авсги/ювсги/придумайте-сами, а просто standalone. Однако, так даже интереснее: всегда хотел поработать напрямую с http. Сразу…
Цель выполнена: выжать 50к РПС. На данный момент, с 4 форками (5 процессами), вебсервер выдает такие результаты: 100к рпс для статичного кешированного файла, 120к рпс для статичного перманентного редиректа (который происходит внутри вебсервера). Следующая цель: выжать 200к рпс для статичного кешированного файла. #roadtothe200kRPS #родтзе200кРПС
А вот добился я этого посредством распараллеливания обработки запросов. Например, на бенчмарках выше - я принимал, обрабатывал, отдавал запросы, в одном потоке. По сути, принял запрос - обработал - отдал ответ - и так далее, по кругу. Как вы понимаете, не самый эффективный способ. Решил пойти по пути торнадо: форкать процесс вебсервера во время его инициализации. По сути - благодаря флагу SO_REUSEPORT, я просто понаспавнил форков, где в каждом - свой сокет, слушающий один и тот же порт (такая штука появилась в ядре linux 3.9 версии, к слову), а вот подключения делигируются ядром уже выбранному непосредственно ядром сокету. Получается, что каждый процесс как отдельный вебсервер, и у каждого свои клиенты. Получается, что ядро у нас некого рода лоадбалансер, который прокидывает подключения на нужный вебсервер
Прогресс. Сверху - Rush-v2. Снизу - Rush-v1. Не смотря на то, что РПС выросло практически в 2 раза, я крайне недоволен тем, что задержка на 14 мс возросла :(
А фокус был в пикрелейтед. А именно - в заголовке Connection: close. По сути, каждый раз, когда клиент хочет подключиться к серверу - сервер его отшивает, аки лесбиянка парней. Убрав заголовок, под всл сервер начал выдавать уже 1.5к рпс (мало). Под мятой - уже 21к. Неплохо, но хотелось бы 30к как минимум
Вот вроде и неплохая либа. Шустрая, на С, круто-классно. Но курва документация - просто нищебродская. К тому же, даже непонятно, как парсить файлы из post-запросов. Наглядный пример того, что хорошая документация - 50% библиотеки.