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


En prácticamente todos los documentos de ajuste de red de FreeBSD puedo encontrar:

# /boot/loader.conf
net.inet.tcp.tcbhashsize=4096

Por lo general, esto se combina con alguna declaración poco útil como "ajuste de la tabla hash de bloque de control TCP" o "Establézcalo 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 Optimizando la pila FreeBSD IP y TCP, pero su descripción es más sobre posibles cuellos de botella en su uso. Parece estar ligado a hacer coincidir los nuevos segmentos TCP con sus sockets de escucha, pero no estoy seguro de cómo.

¿Para qué se usa exactamente el bloque de control TCP? ¿Por qué querría establecer su tamaño de hash en 4096 o cualquier otro número en particular?


8
2018-03-22 18:09


origen


+1, pregunta muy interesante! - Janne Pikkarainen
AFAIK, toda la información para entregar paquetes al socket apropiado está disponible a través de inpcb solamente. - SaveTheRbtz


Respuestas:


Es más como una pregunta de informática. Especialmente si quieres profundizar en tablas hash y grande-O notaciones

La respuesta es:
Si está manejando muchas sesiones TCP en servidor, realmente desea buscar los parámetros TCP de la conexión en tiempo O (1) en lugar de O (n). Usos de FreeBSD encadenamiento para resolver las colisiones de tabla hash. Entonces, si hay mucha conexión, habrá muchas colisiones y, en lugar de la búsqueda de tabla hash O (1), tendrá que hacer una búsqueda de cadena lineal con complejidad O (n).

Parámetro que usted mencionó - tcbhashsize es básicamente el número de cubos en la tabla hash.
En nuestros servidores está configurado a valores bastante altos como 16384 e incluso más alto. Con esa configuración estamos manejando cerca 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 la memoria del núcleo para cada entrada (el tamaño en kmem es 512G en amd64 desde 7.2+ IIRC). Se puede ver vía vmstat -z.

Sobre la estructura del bloque de control TCP puede leer las fuentes de FreeBSD: tcp_var.h o leer Ilustrado TCP / IP, Volumen 2: La implementación por Gary R. Wright, W. Richard Stevens


3
2018-03-23 16:38



Todo estaba borroso, pero ahora con este oscuro encabezado en C, todo está claro;) - gparent
Entiendo por qué aumentar el número de grupos en una tabla hash ayudaría a realizar búsquedas en esos grupos, no me di cuenta de que en realidad era lo que estaba haciendo este valor. Si esta es una tabla de cubos, 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 de "Leer la fuente" o "Leer un libro" no son muy útiles. - sh-beta
¿Cómo llegaste a tu afinación de 16384? ¿Por qué eso? ¿Y qué estás sacrificando por ese valor (asumo la memoria del kernel, pero cuánto?)? Si fuera una victoria gratis, me gustaría pensar que sería el valor predeterminado. Seguramente cuesta algo. - sh-beta
En mi opinión, este valor debe establecerse de manera similar al número de conexiones simultáneas que este servidor está dispuesto a manejar. PD. ¿Realmente quieres convertirte en un experto en algún área sin leer fuentes / libros? =) - SaveTheRbtz
@SaveTheRbtz Detesto esta idea 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 exacto de cada estructura y función individual en la pila de la 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 gasto mi tiempo. Pero eso no significa que estoy contento de aceptar simplemente los "consejos" de sintonía que parecen haber sido copiados y pegados sin pensar del blog al blog. - sh-beta