Недавно я узнал о FreeBSD accept_filter
вариант сокета который может позволить рабочему процессу избежать переключения контекста, например, ожидая получения полного HTTP-запроса с accf_http
:
Это фильтр, который будет помещен в сокет, который будет использовать accept () для приема входящих HTTP-соединений.
Это предотвращает получение приложением подключенного дескриптора через accept () до тех пор, пока ядро не буферизует полный HTTP / 1.0 или HTTP / 1.1 запрос HEAD или GET.
Если получено что-то другое, кроме HTTP / 1.0 или HTTP / 1.1 HEAD или GET-запроса, ядро разрешит приложению получить дескриптор соединения через accept ().
Утилита accf_http такова, что серверу не нужно будет несколько раз переключать контекст перед выполнением первоначального анализа запроса. Это эффективно снижает объем требуемой загрузки ЦП для обработки входящих запросов за счет поддержания низкого уровня активных процессов на серверах предварительной загрузки, таких как Apache, и уменьшении размера набора файловых дескрипторов, которым необходимо управлять с помощью таких интерфейсов, как select (), poll () или серверы на основе kevent ().
Мне кажется, что на современном оборудовании, обслуживающем трафик клиентам по высокоскоростным соединениям (кабельный модем / DSL или лучше), это может быть микрооптимизация. При условии accf_http
не может использоваться для соединений HTTPS или HTTP / 2 и accf_data
просто ждет первого байта, особого преимущества здесь не вижу. Может, они спасут одно или два переключения контекста?
Существуют ли какие-либо недавние (возможно, после 2015 года?) Тесты на то, сколько FreeBSD accept_filter
действительно может улучшить производительность или пропускную способность / параллелизм?