Алгоритмы быстрой обработки HTTP-строк Бэкенд, теория программирования
Основатель и системный архитектор Tempesta Technologies, эксперт в области высокопроизводительных вычислений в Linux/x86-64.
HTTP/2 ввел компрессию стандартных заголовков, но тело URI, Cookie, значения User-Agent по-прежнему могут составлять десятки килобайт и требуют токенизации, поиска и сравнения подстрок и пр. Задача становится критичной, если HTTP-парсер должен обрабатывать интенсивный злонамеренный трафик, как, например, HTTP flood. Стандартные библиотеки предоставляют обширный инструментарий обработки строк, но HTTP-строки имеют свою специфику, и если разрабатывать HTTP-парсер с учетом этой специфики, то можно получить в несколько раз более высокую производительность по сравнению с современными opensource-решениями и даже превзойти быстрейшие из них.
В докладе будет рассмотрено:
* как HTTP flood может сделать ваш HTTP-парсер бутылочным горлышком;
* проблемы x86-64 с branch mispredictions, кэшированием и невыровненной памятью на типичных задачах HTTP-парсера;
* оптимизации C/С++-компилятора для multi-branch выражений и автовекторизации;
* сравнение switch-driven конечного автомата (FSM) с прямыми переходами (например в Ragel);
* особенность структуры HTTP-строк и почему стандартные библиотеки плохо подходят для их обработки;
* strspn()- и strcasecmp()-like алгоритмы для HTTP-строк с использованием SSE- и AVX-расширений x86-64;
* эффективная фильтрация инъекционных атак (SQL, XSS и пр.) с использованием AVX;
* цена переключения контекста FPU и как Linux-ядро работает с SIMD.
Все эти топики будут проиллюстрированы микробенчмарками.