¿Por qué cambiar net.inet.tcp.tcbhashsize en FreeBSD?

8

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 tcptampoco 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?

sh-beta
fuente
+1, pregunta muy interesante!
Janne Pikkarainen
AFAIK, toda la información para entregar el paquete al zócalo apropiado inpcbsolo está disponible a través de .
SaveTheRbtz

Respuestas:

3

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ó: tcbhashsizees básicamente el número de cubos en la tabla hash.
En nuestros servidores está configurado con valores bastante altos como 16384e 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 de vmstat -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

SaveTheRbtz
fuente
Todo estaba borroso, pero ahora con este oscuro encabezado C todo está claro;)
gparent
Entiendo por qué aumentar el número de cubos en una tabla hash ayudaría al rendimiento de las búsquedas en esos cubos, no me di cuenta de que esto era realmente lo que estaba haciendo este valor. Si esta es una tabla de cubos, entonces supongo que el TCPCB realmente es donde se almacena la información del socket para que los segmentos TCP puedan coincidir con el receptor adecuado. ¿Puedes confirmar esto? Además, parte del propósito de estos sitios es agregar información, por lo que las respuestas "Leer la fuente" o "Leer un libro" no son muy útiles.
sh-beta el
¿Cómo llegaste a tu sintonización de 16384? ¿Por qué eso? ¿Y qué sacrificas por ese valor (supongo que la memoria del núcleo, pero ¿cuánto?)? Si se tratara de una victoria de rendimiento gratuita, me gusta pensar que sería el valor predeterminado. Seguramente cuesta algo.
sh-beta
En mi opinión, este valor debe establecerse de manera algo similar al número de conexiones simultáneas que este servidor está dispuesto a manejar. PD. ¿Realmente quieres convertirte en un experto en alguna área sin leer fuentes / libros? =)
SaveTheRbtz
1
@SaveTheRbtz Aborrezco esta noción de que, si usa una tecnología, debe dejar de hacer preguntas o volverse tan experto en el código que puede recitar el propósito preciso de cada estructura y función individual en la pila de red. El propósito de StackExchange es intercambiar conocimiento. Soy un experto en algunas cosas y no en otras. Esa línea está determinada por mi trabajo, donde tengo que elegir cuidadosamente dónde paso mi tiempo. Pero eso no significa que estoy contento con aceptar simplemente "consejos" de sintonía que parecen haber sido copiados y pegados sin pensar de un blog a otro.
sh-beta el