En prácticamente todos los documentos de ajuste de red de FreeBSD puedo encontrar:
# /boot/loader.conf
net.inet.tcp.tcbhashsize=4096
Esto generalmente se combina con alguna declaración inútil como "Ajuste de la tabla hash del bloque de control TCP" o "Establezca esto en un valor razonable". man 4 tcp
tampoco es de mucha ayuda:
tcbhashsize Size of the TCP control-block hash table (read-only). This may be tuned using the kernel option TCBHASHSIZE or by setting net.inet.tcp.tcbhashsize in the loader(8).
El único documento que puedo encontrar que toca esta cosa misteriosa es la subsección de búsqueda de bloque de control de protocolo debajo de la capa de transporte en la optimización de la pila de IP y TCP de FreeBSD , pero su descripción es más sobre posibles cuellos de botella en su uso. Parece vinculado a la coincidencia de nuevos segmentos TCP con sus zócalos de escucha, pero no estoy seguro de cómo.
¿Para qué se usa exactamente el bloque de control TCP? ¿Por qué querrías establecer su tamaño de hash en 4096 o cualquier otro número en particular?
fuente
inpcb
solo está disponible a través de .Respuestas:
Es más como una pregunta de informática. Especialmente si quieres profundizar en tablas hash y anotaciones big-O .
La respuesta es:
si está manejando muchas sesiones TCP en servidor, realmente desea buscar los parámetros tcp de la conexión en O (1) en lugar de O (n). FreeBSD usa el encadenamiento para resolver colisiones de tablas hash. Entonces, si hay mucha conexión, habrá muchas colisiones y, en lugar de la búsqueda de tabla hash O (1), deberá realizar una búsqueda de cadena lineal con complejidad O (n).
Parámetro que mencionó:
tcbhashsize
es básicamente el número de cubos en la tabla hash.En nuestros servidores está configurado con valores bastante altos como
16384
e incluso más altos. Con esa configuración estamos manejando alrededor de 60,000 conexiones por servidor.Cada entrada en la tabla hash por sí misma actualmente en x86_64 usa 252 bytes (
tcp_inpcb
) + 688 bytes (tcpcb
) de memoria del núcleo para cada entrada (el tamaño de kmem es 512G en amd64 desde 7.2+ IIRC). Se puede ver a través devmstat -z
.Acerca de la estructura del bloque de control TCP, puede leer las fuentes de FreeBSD: tcp_var.h o leer TCP / IP ilustrado, Volumen 2: La implementación Por Gary R. Wright, W. Richard Stevens
fuente