Eu aprendi recentemente sobre o FreeBSD's accept_filter
socket option que pode permitir que um processo de trabalho evite a comutação de contexto, por exemplo, esperando até que uma solicitação HTTP completa seja recebida com accf_http
:
This is a filter to be placed on a socket that will be using accept() to receive incoming HTTP connections.
It prevents the application from receiving the connected descriptor via accept() until either a full HTTP/1.0 or HTTP/1.1 HEAD or GET request has been buffered by the kernel.
If something other than a HTTP/1.0 or HTTP/1.1 HEAD or GET request is received the kernel will allow the application to receive the connection descriptor via accept().
The utility of accf_http is such that a server will not have to context switch several times before performing the initial parsing of the request. This effectively reduces the amount of required CPU utilization to handle incoming requests by keeping active processes in preforking servers such as Apache low and reducing the size of the file descriptor set that needs to be managed by interfaces such as select(), poll() or kevent() based servers.
Minha intuição é que, em hardware moderno, servindo tráfego para clientes em conexões de alta velocidade (velocidades de modem a cabo / DSL ou melhor), isso pode ser uma micro-otimização. Dado que accf_http
não pode ser usado para conexões HTTPS ou HTTP / 2 e accf_data
apenas aguarda o primeiro byte, não vejo muita vantagem aqui. Talvez eles salvem uma ou duas opções de contexto?
Existe algum benchmark recente (pós-2015 talvez?) sobre quanto% de accept_filter
do FreeBSD pode realmente melhorar o desempenho ou rendimento / simultaneidade?