Detalle irrevocable cfm. Sistema BBR: control de la congestión directamente en la congestión

    Ver fanfarronear ... Diccionario de sinónimos rusos y expresiones similares. debajo. ed. N. Abramova, M.: Diccionarios rusos, 1999. alardear, alardear Diccionario de sinónimos en ruso ... Diccionario de sinónimos

    Para jactarme, soy, soy; inconfirmado. (coloquial). Presumir, presumir. P. ropa nueva. Diccionario explicativo de Ozhegov. SI. Ozhegov, N.Yu. Shvedova. 1949 1992 ... Diccionario explicativo de Ozhegov

    Nessov. coloquial 1. Expresarse sobre sí mismo o sobre alguien, algo o los suyos propios con elogios; presumir. 2. Promesa jactanciosa de hacer algo. Diccionario explicativo de Efremova. T.F. Efremova. 2000 ... Diccionario explicativo moderno del idioma ruso por Efremova

    Presumir, presumir, presumir, presumir, presumir, presumir, presumir, presumir, presumir, presumir, presumir, presumir, presumir, presumir, presumir, presumir, presumir, presumir, ...

    presumir - alabanza, digo, digo ... Diccionario ortográfico ruso

    presumir - (yo), alabanza / yus, la / eat, la / are ... Diccionario ortográfico del idioma ruso

    Ver Jactancia ... diccionario enciclopédico

    presumir - ver alardear; yo / yus, yo / como; NS V; coloquial Alabense unos a otros. Alabado sea tu fuerza ... Diccionario de muchas expresiones

    presumir - por / alabanza / I / be / sya ... Diccionario morfemico y ortográfico

    Raza (parientes) para presumir de sus nobles orígenes Cf. Nuestra raza sirvió bajo los zares. Mie Y vivimos con ella, solo peleamos Sí, nos jactamos de nuestros familiares. Koltsov. Todos tienen su propio talento. Ver que los rusos no viven sin parientes. Ver en el hocico ... ... Gran diccionario de frases explicativas de Michelson

Libros

  • El segundo libro de conceptos erróneos comunes, John Lloyd, John Mitchinson. El primer Libro de conceptos erróneos comunes se publicó en Inglaterra en 2006. Y desde entonces, en 30 países, se ha convertido en un libro de referencia para quienes anhelan la verdad. Quizás hayas estudiado eso ...
  • Poemas del libro "Tierra verde", Evgeny Klyuev. La aparición en la literatura actual del nombre de Yevgeny Klyuev me recuerda un cuento de hadas sobre un jardinero. Un maestro trabajador y solitario lleva muchos años cultivando su estrafalario jardín: flores inquietas, frágiles ...

El equipo de campamento ultraligero es cada vez más complejo. Esta tendencia es más evidente en la categoría en constante evolución de refugios individuales, más conocida como bolsas vivac ("Bivi").

Si aún no está familiarizado con la variedad existente de opciones de vivac, ahora es el momento de solucionarlo. Te sorprenderá la variedad de opciones y los diseños inteligentes disponibles para el viajero independiente que busca reducir el peso de su equipo.

¿Quién usa bolsas de vivac? Gente que:

  • Viaja solo a menudo;
  • Realice grandes ascensos por muros, que requieren más de un día para completarse;
  • A menudo hacen largas caminatas en bicicleta;
  • Cuente cada gramo de la carga transportada;
  • No le importe dormir en espacios reducidos.

Los basicos

Bolsas vivac fueron inventados para satisfacer las necesidades de los escaladores que necesitaban proteger sus sacos de dormir de los elementos durante sus escaladas que duraban varios días, especialmente en grandes paredes.

Las primeras bolsas de vivac no eran más que una funda impermeable de nailon para sacos de dormir que protegía bien un saco de dormir de la lluvia y tenía una ventilación mediocre.

Hoy en día, la construcción de bolsas de vivac incluye dos capas de tela. El nivel inferior generalmente consiste en un derivado de nailon fuerte (típicamente tafetán, a veces oxford), que se recubre con uretano para hacerlo impermeable. La mayoría de los fabricantes utilizan el mismo material en la producción de suelos para carpas.

El nivel superior suele estar hecho de nailon ripstop (una tela más ligera) y acabado con un laminado impermeable / transpirable como Gore-Tex®, Tegraltex o REI Elements®.

Con el tiempo, el vivac original generó un producto relacionado con características similares a las de una tienda: el refugio vivac ( refugio vivac). Si bien es un poco más pesado, este tipo de refugio tiene dos características que no se encuentran en los bivis tradicionales: un área extendida de espacio para la cabeza protegida y protección completa contra el mal tiempo y los insectos. Gracias a estas características, la popularidad de este tipo de refugio está creciendo entre los consumidores de senderismo, especialmente aquellos que viajan con poco peso (caminantes ligeros).

Además, hay una categoría tipo vivac de tiendas de campaña de doble capa. El peso medio de estas tiendas de campaña (aproximadamente 1,8 kg) es mayor que el peso de un vivac estándar (900 gy menos), pero ofrecen más espacio interior junto con una masa modesta, un argumento reconfortante para los solistas que necesitan poder sentarse en su refugio. pero la capacidad de viajar ligero también es importante. Ejemplos: REI Sololite; Kelty Clark; Morsa Micro Swift; Linterna Clip Sierra Designs.

Bolsas vivac

Incluso cuando se diseña con telas modernas, la bolsa vivac tradicional está destinada principalmente a escaladores de montañas o minimalistas reflexivos, personas que perforan agujeros en sus cucharas para ahorrar unos gramos más.

Una riñonera normal tiene dos funciones básicas.: protege el saco de dormir de la humedad y aumenta su temperatura en unos 5 ° C.

Vivac tiene un área de cabeza abierta. Cuando llueve, puede entrar algo de humedad a través del orificio de la cabeza sin protección. Para minimizar la entrada de humedad, apriete la cuerda alrededor de este agujero. Por supuesto, esto convertirá el orificio de la cabeza en un orificio para la nariz, lo cual es inaceptable para algunas personas. Pero este es un pequeño compromiso para el mochilero ultraligero que valora las bolsas vivac por su peso mínimo.

Otras Consideraciones

Algunos modelos le permiten crear sisas en el costado de la bolsa vivac, lo que le permite clasificar su equipo o cocinar mientras está caliente y protegido de los elementos.
La cremallera de largo completo en el vivac será útil al brindar más opciones de ventilación.
Preste atención a las costuras de fábrica, las marcas líderes suelen ofrecer esta útil característica.
Algunos modelos tienen correas para ayudar a mantener la alfombra en su lugar.
En condiciones cálidas, a veces las personas no usan ningún saco de dormir, sino que simplemente duermen directamente en un saco vivac.

Representantes típicos de las bolsas de vivac.: Refugio personal Moonstone; Bivy estándar de Outdoor Research REI Cyclops.

Refugios como "bivi"

La evolución de los bivy bags ha producido una nueva categoría de carpas de poca altura conocidas como refugios vivac. Estos modelos tienen inserciones de malla ubicadas en la zona del orificio de la cabeza, así como pequeños sistemas de suspensión (clavijas, arcos) que sujetan la tela sobre el rostro del turista. En un refugio de vivac, se puede lograr un aislamiento completo de los insectos y la lluvia. Puede ser necesario un poco de ingenio para proporcionar ventilación durante una tormenta, pero es muy posible lograrlo.

Para muchos turistas que viajan largos y livianos, el refugio vivac con su refuerzo adicional en forma de cuña en el área de la cabeza puede proporcionar un nivel suficiente de comodidad. En áreas con lluvias constantes, los refugios de vivac pierden su atractivo; será difícil esperar a que pase la tormenta en un refugio que no pueda sentarse. Sin embargo, el uso de refugios vivac tiene sentido con condiciones climáticas favorables como Sierra Nevada. Ejemplos: Diseños integrales Unishelter; Saco de vivac avanzado de Outdoor Research.

Otras Consideraciones

¿Bivi es demasiado estrecho para ti? Al principio, podrías pensar que sí. Pero no descarte inmediatamente esta opción de cobertura. Por supuesto, la carpa ofrece a los turistas un refugio espacioso y seguro con un techo sobre sus cabezas. Sin embargo, bivi le permite "fusionarse" con la naturaleza con más fuerza. Es casi como un sueño bajo las estrellas. Al mismo tiempo, tiene suficiente protección contra la lluvia y los insectos, que también es liviana. Sin embargo, si el espacio confinado lo pone ansioso, es más probable que se sienta incómodo en el vivac, especialmente con mal tiempo. En ese caso, considere comprar una carpa.

¿Cómo circula el aire dentro del vivac? Un laminado impermeable / transpirable como Gore-Tex permite que la humedad se evapore a través de la tela. Al mismo tiempo, evita que las gotas de lluvia se filtren a través del tejido. Las bolsas vivac transpirables / impermeables funcionarán mejor en situaciones en las que el cuerpo caliente y sudoroso de un turista descansa en condiciones frías y secas. En condiciones de lluvia, a pesar de que los bivis modernos están diseñados con suficiente material superpuesto y cremalleras, es poco probable que tenga que cerrarlos por completo. La ventilación manual ayuda a mantener un nivel aceptable de humedad dentro de la bolsa vivac.

¿Es posible que se forme condensación dentro del vivac? Potencialmente, sí. Básicamente, un vivac es una tienda de campaña de una sola capa. El vapor caliente de su cuerpo y pulmones se eleva y choca con el aire más frío. Cuando el vapor entra en contacto con el laminado de la bolsa vivac, el aire ya no puede transportar toda la humedad, por lo que parte de ella se acumula en el interior de la tela en cuestión. En una tienda de campaña de doble capa, esta humedad pasa a través de la tienda interior transpirable y se asienta en la exterior. En el caso del vivac, esto puede provocar que se acumule una pequeña cantidad de humedad en el interior. En condiciones frías, esto puede provocar la formación de una costra de hielo en el interior.

¿Estará realmente seco el saco de dormir en un vivac? En condiciones de clima lluvioso (húmedo), la tela Gore-Tex a veces puede producir una sensación de frío y humedad cuando entra en contacto con la piel, pero esto es solo una sensación, no mojarse. Una buena ventilación ayuda a minimizar esta sensación.

Breve resumen

Bolsas vivac: sería una buena opción para escaladores y senderistas minimalistas que realizan caminatas cortas (uno y dos días). Requiere una mentalidad que se adapte bien a las condiciones espartanas.

Refugios vivac: populares entre los ciclistas y ciclistas ultraligeros de larga distancia. Una buena opción para los turistas que viajan en áreas con poca lluvia. El espacio adicional y la protección total los convierten en una opción aceptable para los turistas que pueden adaptarse psicológicamente para pasar la noche en un espacio reducido. Estrecho pero ligero.

Tiendas de campaña pequeñas: algunos modelos de la gama de 2 kg ofrecen una combinación de amplitud y peso modesto; en muchos casos será la opción preferida por el turista medio.

  • Transferir

Medición de cuellos de botella en el rendimiento por paquetes de tiempo de doble paso

Según todas las cuentas, Internet de hoy no puede mover datos tan rápido como debería. La mayoría de los usuarios de celulares en todo el mundo experimentan retrasos de segundos a minutos: los puntos de acceso WiFi públicos en los aeropuertos y las conferencias son aún peores. Los físicos y climatólogos necesitan intercambiar petabytes de datos con colegas de todo el mundo, pero descubren que su elaborada infraestructura de varios gigabits a menudo solo impulsa unos pocos megabits por segundo en enlaces transcontinentales.

Estos problemas surgieron de la elección de la arquitectura que se hizo al crear el sistema de control de congestión TCP en la década de 1980, cuando se decidió interpretar la pérdida de paquetes como "congestión". La equivalencia de estos conceptos era cierta para ese momento, pero solo debido a las limitaciones de la tecnología, y no por definición. Cuando las NIC (controladores de interfaz de red) se actualizaron de megabit a gigabit y los chips de memoria de kilobytes a gigabytes, la relación entre la pérdida de paquetes y la congestión se volvió menos obvia.

En el TCP moderno, el control de la congestión por pérdida de paquetes, incluso en la tecnología más avanzada de su tipo, CUBIC, es la causa principal de estos problemas. Si los búferes de cuello de botella son demasiado grandes, el control de congestión de pérdida de paquetes los mantiene llenos, lo que genera un búfer de red innecesario. Si las memorias intermedias son demasiado pequeñas, el sistema de control de congestión de pérdida de paquetes malinterpretará la pérdida de paquetes como una señal de congestión, lo que reducirá el rendimiento. La solución de estos problemas requiere una alternativa al control de congestión por pérdida de paquetes. Para encontrar esta alternativa, debe comprender dónde y cómo se produce la congestión.

Congestión y cuello de botella

Solo hay un enlace más lento en una conexión TCP (dúplex completo) en un momento dado, o embotellamiento en todas direcciones. El cuello de botella es importante por las siguientes razones:
  • Determina la velocidad máxima de transferencia de datos en la conexión. Ésta es la propiedad principal de un flujo de datos sin comprimir (por ejemplo, imagine una carretera de seis carriles durante la hora pico, si un accidente ha limitado una pequeña sección de la carretera a un solo carril. El tráfico frente al lugar del accidente no se moverá más rápido que el tráfico a través de ese carril.
  • Este es el lugar donde se forman constantemente colas. Disminuyen solo si la intensidad del flujo saliente del cuello de botella excede la intensidad del flujo entrante. Para las conexiones que operan a la tasa de bits más alta, todos los flujos de salida al cuello de botella siempre tienen una tasa de salida más alta, por lo que las colas se mueven hacia el cuello de botella.
Independientemente de cuántos enlaces haya en la conexión y cuáles sean sus velocidades individuales, desde el punto de vista de TCP, una ruta arbitrariamente compleja se representa como una sola conexión con el mismo RTT (tiempo de doble paso del paquete, es decir, tiempo de ida y vuelta) y el ancho de banda del cuello de botella. ... Dos limitaciones físicas RTprop (tiempo de propagación de ida y vuelta) y BtlBw (ancho de banda de cuello de botella) afectan el rendimiento de la transmisión. (Si la ruta de la red fuera una tubería de material, RTprop sería la longitud de la tubería y BtlBw sería su diámetro).

La Figura 1 muestra varias combinaciones de RTT y tasa de bits con volumen de datos. en vuelo, es decir, en vuelo (datos enviados, pero sin confirmación de entrega). Las líneas azules muestran el límite de RTprop, las líneas verdes muestran el límite de BtlBw y las líneas rojas muestran el búfer de cuello de botella. Las operaciones en áreas grises no son posibles porque contradicen al menos una restricción. Las transiciones entre las restricciones llevaron a la formación de tres regiones (limitada por aplicación, limitada por ancho de banda y limitada por búfer) con un comportamiento cualitativamente diferente.

Foto 1

Cuando no hay suficientes datos en vuelo para llenar la tubería, RTprop determina el comportamiento; de lo contrario, BtlBw domina. Las líneas de limitación se cruzan en el punto, que también es la tubería BDP (producto de retardo de ancho de banda, la derivada del ancho de banda y el retardo). Dado que la tubería está llena después de este punto, el exceso crea una cola para el cuello de botella, lo que resulta en una relación lineal entre RTT y los datos en vuelo, que se muestran en el gráfico superior. Los paquetes se descartan cuando el excedente excede la capacidad del búfer. Congestión es solo una ubicación continua a la derecha de la línea BDP, y control de congestión - algún tipo de esquema para establecer un límite sobre qué tan lejos a la derecha de la línea BDP, en promedio, ocurre la transferencia de datos.

El control de pérdida de congestión opera en el borde derecho del área de ancho de banda limitado, proporcionando un ancho de banda de cuello de botella completo a expensas de la alta latencia y la pérdida frecuente de paquetes. En los días en que la memoria era cara, los tamaños de búfer eran solo un poco más grandes que BDP, lo que minimizaba el exceso de latencia de la pérdida de control de congestión. Los recortes posteriores del precio de la memoria dieron como resultado un aumento en el exceso de almacenamiento en búfer de la red y un aumento en RTT a segundos en lugar de milisegundos.

En el borde izquierdo del área de capacidad limitada, hay un punto de operación con mejores condiciones que en el derecho. En 1979, Leonard Kleinrock demostró que este punto de funcionamiento es óptimo, maximiza el rendimiento real y minimiza la latencia y la pérdida, tanto para las conexiones individuales como para la red en su conjunto. Desafortunadamente, casi al mismo tiempo, Jeffrey Yaffe demostró que era imposible crear un algoritmo distribuido que converja en este punto operativo. Este hallazgo cambió la dirección de la investigación. En lugar de buscar un algoritmo distribuido que busque el punto de operación óptimo de Kleinrock, los investigadores comenzaron a explorar enfoques alternativos para el control de la congestión.

Nuestro grupo en Google pasa horas todos los días examinando los registros de captura de encabezados TCP de todo el mundo, entendiendo anomalías y patologías de comportamiento. Por lo general, buscamos las características clave de la ruta, RTprop y BtlBw primero. El hecho de que puedan derivarse de las trazas de la red sugiere que la conclusión de Jaffe podría no ser tan sencilla como parecía. Su conclusión se basa en la incertidumbre fundamental de la medición (por ejemplo, si el aumento medido en RTT se debe a un cambio en la longitud de la ruta, una disminución en el ancho de banda del cuello de botella o un aumento en la latencia de la cola debido al tráfico de otra conexión). Si bien es imposible eliminar la incertidumbre de cada medición en particular, el comportamiento del compuesto a lo largo del tiempo proporciona una imagen más clara, lo que sugiere la posibilidad de aplicar estrategias de medición diseñadas para eliminar la incertidumbre.

Al combinar estas mediciones con un bucle de seguimiento confiable, aplicando los últimos avances en sistemas de control, la esperanza es desarrollar un protocolo de control de congestión distribuido que responda a la congestión real, en lugar de la pérdida de paquetes o retrasos cortos en la cola. Y convergerá con una alta probabilidad en el punto operativo óptimo de Kleinrock. Así comenzó nuestro proyecto de tres años para desarrollar un sistema de gestión de congestión basado en medir dos parámetros que caracterizan una ruta: capacidad de cuello de botella y tiempo de doble paso de paquetes, o BBR.

Característica de cuello de botella

La conexión funciona con un ancho de banda máximo y una latencia mínima cuando (balance de velocidad) la tasa de llegada de paquetes al cuello de botella es BtlBw y (canal completo) la cantidad total de datos en vuelo es igual a BDP ().

La primera condición asegura que el cuello de botella se utilice al 100%. El segundo asegura que tengamos suficientes datos para evitar un simple cuello de botella, pero sin desbordar el canal. La propia condición de equilibrio de velocidad no garantiza que no hay cola, solo su tamaño sin cambios (por ejemplo, si una conexión comienza con el envío de una ventana inicial de 10 paquetes a un BDP de cinco paquetes, luego opera exactamente a la misma velocidad de cuello de botella, entonces cinco de cada diez paquetes iniciales llenarán el canal y el excedente formará una cola permanente en lugar estrecho que no se puede disolver). Del mismo modo, una condición de canal completo no garantiza que no haya cola (por ejemplo, una conexión envía BDP en ráfagas sobre BDP / 2 y explota completamente el cuello de botella, pero la cola promedio es BDP / 4). La única forma de minimizar la cola en el cuello de botella y en todo el canal es cumplir ambas condiciones al mismo tiempo.

Los valores de BtlBw y RTprop cambian durante la vida útil de la conexión, por lo que deben evaluarse constantemente. Actualmente, TCP monitorea RTT (el intervalo de tiempo entre el envío de un paquete de datos al mensaje que se ha entregado) porque es necesario para determinar la pérdida. En cualquier momento dado,


dónde está el "ruido" de las colas a lo largo de la ruta, la estrategia del destinatario con el retraso de los reconocimientos, la acumulación de reconocimientos, etc. RTprop es la característica física del enlace y solo cambia cuando cambia el canal. Dado que los cambios de canal ocurren en una escala de tiempo RTprop, entonces se realizará una evaluación imparcial y eficaz del tiempo
es decir, iniciar en una ventana de tiempo (que suele ser de decenas de segundos a minutos).

A diferencia de RTT, nada en las especificaciones de TCP requiere una implementación para rastrear el rendimiento del cuello de botella, pero se puede obtener una buena estimación de esto a partir del rastreo de las tasas de entrega. Cuando se devuelve un acuse de recibo de la entrega de un paquete al remitente, muestra el RTT del paquete y anuncia la entrega de datos en vuelo cuando el paquete sale. La velocidad de entrega promedio entre el envío de un paquete y la recepción de la confirmación es la relación entre los datos entregados y el tiempo transcurrido :. Esta velocidad debe ser menor o igual al caudal del cuello de botella (la cantidad a la llegada se conoce con exactitud, por lo que toda la incertidumbre radica en cuál debe ser mayor o igual que el intervalo de llegada actual; por lo tanto, la relación debe ser menor o igual a la velocidad real de entrega, la cual, en su cola, limitada desde arriba por la capacidad del cuello de botella). Por lo tanto, la ventana de velocidad de entrega máxima es una estimación eficiente y no particular de BtlBw:


donde la ventana de tiempo suele ser de seis a diez RTT.

TCP debe registrar la hora a la que se envió cada paquete para calcular el RTT. BBR aumenta estos registros con la cantidad total de datos entregados para que la llegada de cada acuse de recibo informe tanto el RTT como la medición de la tasa de entrega, que los filtros convierten en estimaciones de RTprop y BtlBw.

Tenga en cuenta que estos valores son completamente independientes: RTprop puede cambiar (por ejemplo, cuando se cambia la ruta), pero tiene el mismo cuello de botella, o BtlBw puede cambiar (por ejemplo, cuando cambia el ancho de banda inalámbrico) sin cambiar la ruta. (La independencia de ambas restricciones es la razón por la que deben conocerse para vincular el comportamiento del envío con la ruta de entrega). Dado que RTprop solo es visible en el lado izquierdo del BDP y BtlBw solo es visible en el lado derecho en la Figura 1, obedecen al principio de incertidumbre: siempre que se pueda medir uno de los dos, el otro no se podrá medir. Intuitivamente, esto se puede entender de la siguiente manera: para determinar la capacidad del canal se debe sobrellenar, lo que genera una cola que no permite medir la longitud del canal. Por ejemplo, es posible que una aplicación con un protocolo de solicitud / respuesta nunca envíe suficientes datos para llenar el canal y ver BtlBw. Muchas horas de transferencia de una gran cantidad de datos pueden pasar todo su tiempo en un área con ancho de banda limitado y recibir solo una única muestra de RTprop de RTT desde el primer paquete. El principio de incertidumbre inherente significa que además de las estimaciones para la reconstrucción de los dos parámetros de ruta, debe haber estados que se rastreen simultáneamente y lo que se pueda aprender en el punto de operación actual y, a medida que la información pierde frescura, cómo moverse al punto de operación donde datos más recientes.

Mapeo de un flujo de paquetes a una ruta de entrega

El algoritmo principal de BBR tiene dos partes:

Cuando recibamos la confirmación (ack)

Cada confirmación proporciona un nuevo RTT y mediciones de tasa de entrega promedio que actualizan las estimaciones de RTprop y BtlBw:

Función onAck (paquete) rtt \u003d ahora - packet.sendtime update_min_filter (RTpropFilter, rtt) entregado + \u003d tamaño del paquete entregado_time \u003d ahora deliveryRate \u003d (entregado - paquete.delivered) / (entregado_time - paquete.delivered_time) if (deliveryRate\u003e BtlBwFilter. currentMax ||! packet.app_limited) update_max_filter (BtlBwFilter, deliveryRate) if (app_limited_until\u003e 0) app_limited_until \u003d app_limited_until - tamaño del paquete
La verificación si es necesaria debido al problema de ambigüedad discutido en el último párrafo: la aplicación puede restringir los remitentes, es decir, la aplicación puede quedarse sin datos para llenar la red. Esta es una situación bastante común debido al tráfico de solicitudes / respuestas. Cuando existe la oportunidad de enviar, pero no se envían datos, BBR marca las muestras de ancho de banda correspondientes como "aplicación limitada", es decir, app_limited (ver el pseudocódigo send ()). Este código determina qué patrones incluir en el modelo de ancho de banda, por lo que refleja los límites de la red, no los límites de la aplicación. BtlBw es un límite superior firme en la tasa de entrega, por lo que una tasa de entrega medida mayor que la estimación actual de BtlBw debería significar una estimación de BtlBw subestimada, ya sea que la muestra tuviera una aplicación restringida o no. De lo contrario, se descartan los patrones restringidos por la aplicación. (La Figura 1 muestra que en la región con la restricción de aplicación deliveryRate, el parámetro BtlBw está subestimado). Estas comprobaciones evitan que el filtro BtlBw se llene con valores subestimados, lo que podría ralentizar el envío de datos.

Cuando se envían datos

Para correlacionar la tasa de llegada de paquetes con la tasa de salida del cuello de botella, BBR monitorea cada paquete de datos. (BBR debe coincidir velocidad cuello de botella: esto significa que el seguimiento es una parte integral de la arquitectura y una parte fundamental del trabajo, por lo tanto ritmo_paso es el principal parámetro de control. Parámetro auxiliar cwnd_gain conecta en vuelo con un pequeño conjunto de BDP para manejar las patologías típicas de la red y del receptor (consulte el capítulo sobre confirmaciones retrasadas y extendidas a continuación). Conceptualmente, el procedimiento de envío en TCP se parece al siguiente código. (En Linux, el envío de datos utiliza una cola de ritmo / FQ eficiente, lo que le da a BBR el rendimiento lineal de una sola conexión en enlaces de varios gigabits y maneja miles de conexiones más lentas con una sobrecarga de CPU insignificante).

Función enviar (paquete) bdp \u003d BtlBwFilter.currentMax × RTpropFilter.currentMin if (inflight\u003e \u003d cwnd_gain × bdp) // esperar una confirmación o tiempo de espera de retransmisión return if (ahora\u003e \u003d nextSendTime) packet \u003d nextPacketToSend () if (! Packet) app_limited_until \u003d paquete de retorno durante el vuelo.app_limited \u003d (app_limited_until\u003e 0) packet.sendtime \u003d ahora paquete.delivered \u003d paquete entregado.tiempo_entregado \u003d tiempo_entregado enviar (paquete) nextSendTime \u003d ahora + paquete.size / (pacing_gain × BtlBwFilter.currentMax) timerCallbackAt (enviar, nextSendTime)
Comportamiento en estado estacionario

La velocidad y la cantidad de datos enviados a través de BBR dependen solo de BtlBw y RTprop, por lo que los filtros controlan no solo las estimaciones de restricciones de cuello de botella, sino también su aplicación. Esto crea el bucle de control personalizado que se muestra en la Figura 2, que muestra el RTT (azul), durante el vuelo (verde) y la velocidad de entrega (rojo) de más de 700 milisegundos para un flujo de 10 megabits y 40 milisegundos. La línea gris en negrita sobre la tasa de entrega es el estado del filtro BtlBw máximo. Las formas triangulares se obtienen aplicando cíclicamente el coeficiente pacing_gain en BBR para determinar el aumento de BtlBw. La ganancia en cada parte del ciclo se muestra alineada en el tiempo con los datos que ha afectado. Este factor funcionó en RTT antes cuando se enviaban los datos. Esto se muestra por irregularidades horizontales en la descripción de la secuencia de eventos en el lado izquierdo.


Figura 2

BBR minimiza la latencia porque la mayor parte del tiempo pasa con el mismo BDP en acción. Debido a esto, el cuello de botella se traslada al remitente, por lo que el aumento de BtlBw se vuelve invisible. Por lo tanto, BBR gasta periódicamente el intervalo RTprop en pacing_gain\u003e 1, lo que aumenta la velocidad de envío y la cantidad de datos enviados sin confirmación de entrega (en vuelo). Si BtlBw no cambia, entonces la cola se crea antes del cuello de botella, aumentando el RTT, lo que mantiene constante el deliveryRate. (La cola se puede eliminar enviando datos con un valor de pacing_gain de compensación< 1 для следующего RTprop). Если BtlBw увеличивается, то скорость deliveryRate тоже увеличивается, а новое максимальное значение фильтра немедленно увеличивает базовую скорость отслеживания (ritmo_paso). Por esta razón, BBR se ajusta al nuevo tamaño del cuello de botella de forma exponencialmente rápida. La Figura 3 muestra este efecto en un flujo de 40 ms de 10 Mbps, que BtlBw aumenta repentinamente hasta 20 Mbps después de 20 segundos de operación constante (a la izquierda del gráfico), luego cae a 10 Mbps después de otros 20 segundos de operación sostenida por 20 Mbps (lado derecho del gráfico).


figura 3

(Básicamente, BBR es un ejemplo simple de un sistema de control "max-plus", un nuevo enfoque de los sistemas de control basado en álgebra max-plus no estándar. Este enfoque permite la adaptación de la velocidad [controlada por la relación de transmisión max] independientemente del crecimiento de la cola [controlado por la tasa de transmisión promedio]. Aplicado a nuestro problema, esto se reduce a un circuito de control simple e incondicional, donde la adaptación a los cambios en las restricciones físicas se lleva a cabo automáticamente cambiando los filtros que expresan estas restricciones. Un sistema tradicional requeriría la creación de muchos lazos de control combinados en una máquina de estado compleja para lograr este resultado).

Comportamiento al iniciar un solo hilo BBR

Las implementaciones modernas manejan eventos como el inicio, el cierre y la recuperación de pérdidas con algoritmos de respuesta a eventos con muchas líneas de código. BBR usa el código anterior (en el capítulo anterior "Hacer coincidir un flujo de paquetes con una ruta de entrega") para todo. Los eventos se manejan atravesando una secuencia de "estados". Los propios "estados" se definen mediante una tabla con uno o más valores fijos de coeficientes y criterios de salida. La mayor parte del tiempo se pasa en el estado ProbeBW, que se describe en el capítulo Comportamiento en estado estable. Los estados de inicio y drenaje se utilizan al iniciar la conexión (Figura 4). Para manejar una conexión donde el rendimiento aumenta en 12 órdenes de magnitud, el estado de inicio implementa un algoritmo de búsqueda binaria para BtlBw, que usa un factor de transmisión para duplicar la tasa de transmisión cuando aumenta la tasa de entrega. Esto define BtlBw en RTT, pero al mismo tiempo crea una cola innecesaria antes. Tan pronto como Startup encuentra BtlBw, el sistema BBR entra en el estado Drain, que usa las relaciones de engranajes inversas de Startup para deshacerse de la cola excesiva, y luego en el estado ProbeBW tan pronto como el vuelo cae a la línea BDP.


Figura 4

La Figura 4 muestra el primer segundo de un flujo BBR de 40 ms de 10 megabits. El gráfico superior muestra el tiempo y la secuencia de eventos, así como el progreso del remitente (verde) y del destinatario (azul): la cantidad de datos enviados y recibidos. La línea roja muestra el desempeño del remitente utilizando tecnología CUBIC en las mismas condiciones. Las líneas grises verticales indican tiempos de transición entre estados de BBR. El gráfico inferior muestra el cambio en el tiempo de ida y vuelta (RTT) de ambas conexiones. Tenga en cuenta que el cronograma de este horario corresponde a la hora de recepción de la confirmación de llegada (ack). Por lo tanto, puede parecer que los gráficos parecen estar desplazados en el tiempo, pero de hecho los eventos a continuación corresponden a los momentos en que el sistema BBR se entera de estos eventos y reacciona.

El gráfico inferior de la Figura 4 compara BBR y CUBIC. Al principio, su comportamiento es casi el mismo, pero BBR vacía completamente la cola formada al inicio de la conexión y CUBIC no puede hacer esto. No tiene un modelo de seguimiento que le diga cuántos datos enviados son redundantes. Por lo tanto, CUBIC aumenta menos agresivamente la transmisión de datos sin confirmación de entrega, pero este crecimiento continúa hasta que el búfer de cuello de botella se desborda y comienza a eliminar paquetes, o hasta que el receptor alcanza el límite de datos enviados sin confirmación (ventana de recepción de TCP).

La Figura 5 muestra el comportamiento de RTT en los primeros ocho segundos de la conexión representada en la Figura 4. La tecnología CUBIC (en rojo) llena todo el búfer disponible, luego rota entre un 70% y un 100% de llenado cada pocos segundos. Una vez que se inicia la conexión, BBR (verde) funciona con poca o ninguna cola.


Figura 5

Comportamiento cuando varias transmisiones de BBR se encuentran en un cuello de botella

La Figura 6 muestra cómo el rendimiento de múltiples flujos de BBR converge en una sección honesta de un cuello de botella de 100 megabits / 10 milisegundos. Las estructuras triangulares orientadas hacia abajo son estados de conexiones ProbeRTT en las que la auto-sincronización acelera la convergencia final.


Figura 6

Los ciclos de ganancia de ProbeBW (Figura 2) estimulan flujos más grandes para producir ancho de banda a flujos más pequeños, como resultado de lo cual cada flujo comprende su estado honesto. Esto ocurre con bastante rapidez (varios ciclos de ProbeBW), aunque la injusticia puede persistir si los subprocesos tardíos al comienzo de la redistribución sobreestiman RTprop debido al hecho de que los subprocesos que comenzaron antes (temporalmente) crean una cola.

Para averiguar el RTProp real, la secuencia se mueve a la izquierda de la línea BDP usando el estado ProbeRTT: si la estimación de RTProp no se actualiza (es decir, midiendo un RTT más pequeño) durante muchos segundos, entonces el BBR ingresa al estado ProbeRTT, reduciendo la cantidad de datos enviados (en vuelo) a cuatro paquetes durante al menos un doble paso y luego vuelve al estado anterior. Cuando los subprocesos grandes ingresan al estado ProbeRTT, muchos paquetes se eliminan de la cola, de modo que varios subprocesos a la vez ven el nuevo valor RTprop (nuevo RTT mínimo). Gracias a esto, sus estimaciones de RTprop se restablecen a cero al mismo tiempo, de modo que todos ingresan al estado ProbeRTT juntos, y la cola disminuye aún más, como resultado de lo cual aún más subprocesos ven el nuevo valor de RTprop, y así sucesivamente. Esta coordinación distribuida es un factor clave tanto en la equidad como en la estabilidad del ancho de banda.

BBR sincroniza los hilos en torno al evento deseado, que es una cola vacía en un cuello de botella. En contraste con este enfoque, la limitación de la congestión por pérdida de paquetes sincroniza los flujos alrededor de eventos no deseados, como el crecimiento periódico de la cola y los desbordamientos del búfer, lo que aumenta la latencia y la pérdida de paquetes.

Experiencia de implementación de B4 WAN en Google

El B4 de Google es una red de área amplia (WAN) de alta velocidad construida sobre conmutadores convencionales de bajo costo. Las pérdidas en estos interruptores de amortiguación poco profundos se deben principalmente al aumento ocasional de pequeñas ráfagas de tráfico. En 2015, Google comenzó a mover el tráfico laboral de CUBIC a BBR. No se han reportado problemas ni regresiones, y desde 2016 todo el tráfico B4 TCP usa BBR. La Figura 7 ilustra una razón para esto: el rendimiento de BBR es consistentemente de 2 a 25 veces mayor que el de CUBIC. Vimos una mejora aún mayor, pero descubrimos que el 75% de las conexiones BBR están limitadas por el búfer de recepción de TCP en el kernel, que el equipo de operaciones de red estableció deliberadamente en un valor bajo (8 MB) para evitar que CUBIC inunde la red con megabytes de exceso de tráfico sin confirmar la entrega (si divide 8 MB por 200ms de RTT intercontinental, obtienes 335 Mbps como máximo). El aumento manual del búfer de recepción en una única ruta de EE. UU. A Europa aumentó instantáneamente la velocidad de datos de BBR a 2 Gbps, mientras que CUBIC se mantuvo en 15 Mbps, un aumento relativo de 133 veces en el rendimiento previsto por Matis et al. trabajar en 1997.


Figura 7

La Figura 7 muestra la mejora relativa en BBR con respecto a CUBIC; La barra lateral muestra las funciones de distribución acumulativa (CDF) para el rendimiento. Las mediciones se realizaron utilizando un servicio de detección activa que abre conexiones BBR y CUBIC permanentes a centros de datos remotos y luego transfiere 8 MB de datos por minuto. Las sondas exploran muchas rutas B4 entre Norteamérica, Europa y Asia.

La gran mejora es una consecuencia directa del BBR no utiliza la pérdida de paquetes como indicador de congestión. Para lograr un rendimiento total, las técnicas de control de congestión de pérdida de paquetes existentes requieren que la tasa de pérdida sea menor que el cuadrado inverso del BDP (por ejemplo, menos de una pérdida por cada 30 millones de paquetes para una conexión de 10 Gbps / 100 ms). La Figura 8 compara el rendimiento útil medido en varios niveles de pérdida de paquetes. En CUBIC, la tolerancia a la pérdida de paquetes es una propiedad estructural del algoritmo y en BBR es un parámetro de configuración. A medida que el nivel de pérdida de BBR se acerca a la ganancia máxima de ProbeBW, la probabilidad de medir la tasa de entrega de BtlBw real cae drásticamente, lo que conduce a una subestimación por parte del filtro máx.


Figura 8

La Figura 8 compara el ancho de banda utilizable de BBR y CUBIC en un flujo de 60 segundos en un enlace de 100 Mbps y 100 ms con pérdidas aleatorias que van del 0,001% al 50%. El rendimiento del CUBIC se reduce 10 veces con una pérdida del 0,1% y se detiene por completo en más del 1%. El ancho de banda máximo es la fracción del ancho de banda menos la pérdida de paquetes (). BBR mantiene en este nivel hasta un 5% de pérdidas y cerca del 15%.

Experiencia de implementación de YouTube Edge

BBR se implementa en los servidores de video de YouTube y Google.com. Google está realizando un pequeño experimento en el que un pequeño porcentaje de usuarios es transferido accidentalmente a BBR o CUBIC. La reproducción de video BBR muestra una mejora significativa en todas las calificaciones de los usuarios sobre la calidad del servicio. Quizás porque el comportamiento de BBR es más consistente y predecible. BBR solo mejora ligeramente el ancho de banda de la conexión porque YouTube ya adapta la velocidad de transmisión muy por debajo de BtlBw para minimizar el almacenamiento en búfer y el almacenamiento en búfer de red innecesarios. Pero incluso aquí, BBR reduce el promedio de RTT medio en un 53% a nivel mundial y más del 80% en los países en desarrollo.

La Figura 9 muestra la mejora media en RTT frente a BBR y CUBIC en más de 200 millones de vistas de videos de YouTube medidas en los cinco continentes durante una semana. Más de la mitad de los 7 mil millones de conexiones móviles del mundo son de 2,5 G a 8 Kbps a 114 Kbps, con problemas bien documentados con técnicas de control de congestión por pérdida de paquetes que tienden a desbordar los búferes. El cuello de botella en estos sistemas suele estar entre el SGSN (Nodo de soporte de servicio GPRS) y el dispositivo móvil. El software SGSN se ejecuta en una plataforma de PC estándar con amplia RAM, a menudo con megabytes de búfer entre Internet y el dispositivo móvil. La Figura 10 compara la latencia SGSN (emulada) entre Internet y el móvil para BBR y CUBIC. Las líneas horizontales marcan una de las consecuencias más graves: TCP se adapta a retrasos RTT prolongados, a excepción del paquete SYN que inicia la conexión, que tiene un tiempo de espera fijo, según el sistema operativo. Cuando un dispositivo móvil recibe una gran cantidad de datos (por ejemplo, de actualizaciones automáticas de software) a través de un gran búfer SGSN, el dispositivo no puede establecer ninguna conexión a Internet hasta que la cola esté libre (el SYN ACK se retrasa por más del tiempo de espera fijo de SYN) ...


Figura 9

La Figura 10 muestra la mediana de los cambios de RTT en estado estable y en función del tamaño del búfer en una conexión de 128 Kbps y 40 ms con ocho flujos BBR (verde) o CUBIC (rojo). BBR mantiene la cola en valores mínimos, independientemente del tamaño del búfer de cuello de botella y del número de subprocesos activos. Los flujos CUBIC siempre llenan el búfer, por lo que la latencia aumenta linealmente con el tamaño del búfer.


Figura 10

Banda adaptable en celular móvil

Los sistemas celulares adaptan el ancho de banda para cada usuario en parte según el pronóstico de la demanda, que tiene en cuenta la cola de paquetes destinada a ese usuario. Los primeros BBR se ajustaron para crear colas muy pequeñas, lo que provocó que las conexiones se atascaran a bajas velocidades. El aumento del pico pacing_gain para ProbeBW y el aumento de las colas dieron como resultado menos conexiones estancadas. Esto muestra una gran adaptabilidad para algunas redes. Con el valor de ganancia pico actual, no hay degradación en ninguna red en comparación con CUBIC.

Paquetes ack retrasados \u200b\u200by estirados

Las redes móviles, WiFi y de banda ancha a menudo retrasan y acumulan paquetes ack. Cuando el vuelo está limitado a un BDP, provoca paradas y reduce el ancho de banda. Aumentar el factor cwnd_gain de ProbeBW a dos permitió que la transmisión sin problemas continuara a la tasa de entrega prevista, incluso cuando los paquetes ack se retrasaron en un RTT. Esto evita en gran medida averías.

Limitadores de cangilones actuales

El lanzamiento inicial de BBR en YouTube mostró que la mayoría de los ISP del mundo están sesgando el tráfico con los actuales limitadores de tasa de cubeta. El depósito suele estar lleno al comienzo de la conexión, por lo que BBR conoce el parámetro BtlBw de la red subyacente. Pero tan pronto como el depósito está vacío, se descartan todos los paquetes enviados más rápido que la velocidad de llenado del depósito (mucho más baja que BtlBw). BBR eventualmente aprende esta nueva tasa de entrega, pero ciclar la ganancia de ProbeBW resulta en pérdidas moderadas constantes. Para minimizar la pérdida de ancho de banda ascendente y el aumento en la latencia de la aplicación debido a esta pérdida, hemos agregado un detector de recorte dedicado y un modelo de recorte explícito en BBR. También estamos explorando activamente las mejores formas de eliminar el daño de los limitadores de velocidad.

Competir con los métodos de control de congestión de pérdida de paquetes

BBR se reduce a compartir honestamente el ancho de banda de un cuello de botella, ya sea en competencia con otras transmisiones BBR o transmisiones impulsadas por técnicas de control de congestión de pérdida de paquetes. Incluso cuando este último llena el búfer disponible, ProbeBW todavía sesga de manera confiable la estimación de BtlBw hacia una división justa, y ProbeRTT considera que la estimación de RTProp es lo suficientemente alta como para converger tit por tat en una división justa. Sin embargo, los búferes de enrutadores no administrados que superan algunos BDP están obligando a los competidores de control de congestión heredados a inflar la cola y obtener más de lo que les corresponde. Eliminar esto es otra área de investigación activa.

Conclusión

Repensar la gestión de la congestión es un gran beneficio. En lugar de utilizar eventos como la pérdida de búfer o la incautación de búfer, que se correlacionan solo débilmente con la congestión, BBR comienza con el modelo de congestión formal de Kleinrock y el punto operativo óptimo asociado. La molesta conclusión de que es "imposible" determinar simultáneamente la latencia crítica y el ancho de banda se pasa por alto al observar que se pueden predecir simultáneamente. A continuación, se aplican los últimos avances en sistemas de control y teoría de estimación para crear un bucle de control distribuido simple que se acerca al óptimo al utilizar completamente la red y mantener una pequeña cola. La implementación de BBR de Google está disponible en el kernel de Linux de código abierto y se detalla en el apéndice de este artículo.

La tecnología BBR se utiliza en la red troncal de Google B4, lo que mejora el ancho de banda en órdenes de magnitud sobre CUBIC. También se implementa en los servidores web de Google y YouTube, lo que reduce significativamente la latencia en los cinco continentes probados hasta la fecha, y especialmente en los países en desarrollo. La tecnología BBR funciona exclusivamente en el lado del remitente y no requiere cambios en el protocolo, el receptor o la red, lo que permite su despliegue de forma paulatina. Solo depende de las notificaciones de entrega de paquetes y RTT, por lo que se puede utilizar en la mayoría de los protocolos de transporte de Internet.

Expresiones de gratitud

Los autores agradecen a Len Kleinrock por su orientación sobre cómo manejar adecuadamente la congestión. Estamos en deuda con Larry Brakmo por su trabajo pionero en los sistemas de control de congestión de Vegas y New Vegas que anticiparon muchos de los elementos de BBR, y por su consejo y orientación durante el desarrollo inicial de BBR. También nos gustaría agradecer a Eric Dumazet, Nandita Dukkipati, Jana Iyengar, Ian Swett, M. Fitz Nowlan, David Wetherall, Leonid Leonidas Kontothanassis, Amin Vahdat y el equipo de infraestructura de Google BwE y YouTube por su invaluable ayuda y apoyo.

Apéndice: descripción detallada

Máquina de estado para sondeo secuencial

Pacing_gain controla la rapidez con que se envían los paquetes en relación con BtlBw y esto es clave para la función de BBR inteligente. Cuando pacing_gain es mayor que uno, el vuelo aumenta y la brecha entre paquetes disminuye, lo que mueve el enlace hacia el lado derecho en la Figura 1. Cuando pacing_gain es menor que uno, ocurre el efecto opuesto, el enlace se mueve hacia la izquierda.

BBR usa pacing_gain para implementar una máquina de detección de estado secuencial simple que alterna entre probar para un ancho de banda más grande y probar para un tiempo de doble paso más corto. (No es necesario probar un ancho de banda más bajo, porque el filtro BtlBw msx lo maneja automáticamente: las nuevas mediciones reflejan la caída, por lo que BtlBw se corregirá solo tan pronto como los últimos cambios antiguos se eliminen del filtro por tiempo de espera. El filtro mínimo RTprop maneja el aumento en la ruta de entrega de la misma manera) ...

Si aumenta el ancho de banda del cuello de botella, el BBR debe enviar datos más rápido para detectarlo. Del mismo modo, si el tiempo real de doble paso de un paquete cambia, esto cambia el BDP y, por lo tanto, el BDP debe enviar datos más lentamente para mantener el vuelo por debajo del BDP para medir el nuevo RTprop. Por lo tanto, la única forma de detectar estos cambios es experimentar, enviando más rápido para verificar un aumento en BtlBw, o enviando más lento para verificar una disminución en RTprop. La frecuencia, el alcance, la duración y la estructura de estos experimentos varían según lo que ya se conoce (inicio de conexión o estado estable) y el comportamiento de la aplicación que envía datos (intermitente o persistente).

Estado estable

Las transmisiones BBR pasan la mayor parte de su tiempo en el estado ProbeBW, probando la racha utilizando un método llamado ganar ciclismo, que ayuda a los flujos de BBR a lograr un alto rendimiento, una baja latencia de cola y una convergencia de participación justa. Utilizando ganar ciclismoBBR recorre un rango de valores para la ganancia. pacing_gain... Se utilizan ocho fases de ciclo con los siguientes valores: 5/4, 3/4, 1, 1, 1, 1, 1, 1. Cada fase suele durar el RTprop predicho. Este diseño permite al bucle de coeficientes sondear primero el canal para un mayor ancho de banda con un valor pacing_gain mayor que 1.0, y luego distribuya cualquier cola resultante con pacing_gain por la misma cantidad menos de 1.0, y luego moverse a velocidad de crucero con una breve ráfaga de coeficientes de exactamente 1.0. La ganancia promedio para todas las fases es 1.0 porque ProbeBW tiende a promediar para igualar el ancho de banda disponible y, por lo tanto, mantiene una alta utilización del ancho de banda sin aumentar la cola. Tenga en cuenta que aunque los ciclos de la relación cambian pacing_gainpero el valor cwnd_gain siempre permanece igual a dos, ya que los paquetes ack retrasados \u200b\u200by extendidos pueden aparecer en cualquier momento (consulte el capítulo sobre paquetes ack retrasados \u200b\u200by extendidos).

Además, para mejorar la mezcla de flujo y el uso compartido justo del ancho de banda, y para reducir las colas cuando varios BBR comparten un cuello de botella, BBR cambia aleatoriamente las fases del ciclo ProbeBW eligiendo aleatoriamente la primera fase de todas menos 3/4. ¿Por qué el ciclo no comienza a las 3/4? El objetivo principal de este valor de relación es dispersar cualquier cola que se pueda formar durante la aplicación de la relación 5/4, cuando el canal ya está lleno. Cuando un proceso sale del estado Drain o ProbeRTT y entra en ProbeBW, no hay cola, por lo que el factor 3/4 no cumple su tarea. El uso de 3/4 en este contexto solo tiene un efecto negativo: el llenado del canal en esta fase será 3/4, no 1. Por lo tanto, el comienzo del ciclo desde 3/4 tiene solo un efecto negativo, pero no tiene un efecto positivo, y desde la entrada al estado ProbeBW toma bastante tiempo al inicio de cualquier conexión, luego BBR usa esta pequeña optimización.

Los subprocesos BBR trabajan juntos para vaciar periódicamente la cola de cuello de botella mediante un estado llamado ProbeRTT. En cualquier estado que no sea ProbeRTT, si la estimación de RTProp no se ha actualizado (por ejemplo, midiendo un RTT más pequeño) durante más de 10 segundos, entonces BBR ingresa al estado ProbeRTT y disminuye cwnd a un valor muy pequeño (cuatro paquetes). Manteniendo un número mínimo de paquetes en vuelo de al menos 200 ms y durante un tiempo de doble paso de ráfaga, BBR sale del estado ProbeRTT y entra en Startup o ProbeBW, dependiendo de si el canal ya está lleno.

BBR está diseñado para ejecutarse la mayor parte del tiempo (aproximadamente el 98%) en ProbeBW y el resto del tiempo en ProbeRTT, según una serie de compensaciones. El estado de ProbeRTT dura lo suficiente (al menos 200 ms) para permitir que los subprocesos con diferentes RTT tengan estados ProbeRTT simultáneos, pero al mismo tiempo dura un tiempo lo suficientemente corto como para limitar la degradación del rendimiento a aproximadamente dos por ciento (200 ms / 10 segundos ). La ventana del filtro RTprop (10 segundos) es lo suficientemente pequeña para adaptarse rápidamente a cambios en los niveles de tráfico o cambios de ruta, pero lo suficientemente grande para aplicaciones interactivas. Tales aplicaciones (por ejemplo, páginas web, llamadas a procedimientos remotos, videoclips) a menudo exhiben períodos naturales de silencio o poca actividad en las ventanas de esta ventana, donde el flujo es lo suficientemente lento o lo suficientemente largo como para dispersar la cola en un cuello de botella. El filtro RTprop luego ajusta estas medidas RTprop de manera oportunista, y el RTProp se actualiza sin tener que usar ProbeRTT. Por lo tanto, las transmisiones normalmente solo necesitan sacrificar el 2% del ancho de banda si varias transmisiones llenan abundantemente el canal en una ventana completa de RTProp.

Comportamiento de inicio

Cuando se inicia un subproceso BBR, realiza su primer (y más rápido) proceso secuencial de sondeo / vaciado de cola. El ancho de banda de la red varía en el rango de 10 12, desde unos pocos bits hasta 100 gigabits por segundo. Para calcular el valor de BtlBw para un cambio de rango tan gigante, BBR realiza una búsqueda binaria en el espacio de velocidad. Encuentra BtlBw (pases dobles de paquetes) muy rápidamente, pero a expensas de crear una cola en 2BDP en la última etapa de la búsqueda. La búsqueda se realiza en el estado Startup en BBR y el vaciado de la cola creada se realiza en el estado Drain.

Primero, Startup aumenta exponencialmente la velocidad de envío de datos, duplicándola en cada ronda. Para lograr esta detección rápida de la manera más relajada, al iniciar los valores de ganancia pacing_gain y cwnd_gain están configurados en el valor mínimo que le permite duplicar la velocidad de carga para cada ronda. Tan pronto como el canal esté lleno, el coeficiente cwnd_gain limita el tamaño de la cola a un valor.

En el estado inicial de la conexión, la BBR juzga si el canal está lleno buscando una meseta en la estimación de BtlBw. Si se encuentra que han pasado varias (tres) rondas, donde los intentos de duplicar la velocidad de entrega realmente no dan un gran aumento en la velocidad (menos del 25%), entonces considera que ha alcanzado BtlBw, por lo que sale del estado Startup y entra en el estado Drain. BBR espera tres rondas para obtener evidencia convincente de que la meseta de la tasa de entrega observada por el remitente no es un efecto temporal de la ventana. Esperar tres rondas da tiempo suficiente para que la sintonización automática del lado del destinatario abra la ventana de recepción y para que el remitente de BBR detecte la necesidad de aumentar BtlBw: en la primera ronda, el algoritmo para ajustar automáticamente la ventana de recepción aumenta la ventana de recepción; en la segunda ronda, el remitente llena la ventana de recepción ampliada; en la tercera ronda, el remitente recibe muestras con una mayor velocidad de entrega. Este límite de tres rondas ha demostrado su eficacia en la implementación de YouTube.

En el estado de drenaje, el algoritmo BBR busca vaciar rápidamente la cola que se formó en el estado de inicio de la conexión al cambiar al pacing_gain con valores opuestos a los utilizados en el estado de Inicio. Cuando el número de paquetes en vuelo coincide con la estimación de BDP, significa que BBR considera que la cola está completamente vacía, pero el canal aún está lleno. Entonces BBR sale del estado de drenaje y entra en ProbeBW.

Tenga en cuenta que al iniciar una conexión BBR y un CUBIC de inicio lento, ambos aprenden el rendimiento del cuello de botella de manera exponencial, duplicando la velocidad de envío en cada ronda. Sin embargo, son fundamentalmente diferentes. Primero, BBR es más confiable para determinar el ancho de banda disponible, ya que no detiene la búsqueda en caso de pérdida de paquetes o (como Hystart de CUBIC) aumento de la latencia. En segundo lugar, BBR aumenta suavemente la velocidad de envío, mientras que CUBIC tiene una ráfaga de paquetes en cada ronda (incluso con ritmo), y luego un período de silencio. La Figura 4 muestra el número de paquetes en vuelo y el RTT observado para cada mensaje de acuse de recibo de BBR y CUBIC.

Responder a situaciones transitorias

La ruta de la red y el flujo de tráfico a lo largo de ella pueden experimentar cambios dramáticos repentinos. Con el fin de adaptarse a ellos de manera fluida y confiable, y también para reducir la pérdida de paquetes en estas situaciones, BBR utiliza una serie de estrategias para implementar su modelo básico. Primero, BBR considera como un objetivo hacia el cual el actual cwnd se acerca cautelosamente desde abajo, aumentando cwnd cada vez no más de la cantidad de datos para los que se envió la confirmación de entrega. En segundo lugar, con un tiempo de espera de retransmisión, lo que significa que el remitente considera todos los paquetes en tránsito como perdidos, BBR reduce de forma conservadora cwnd hasta un paquete y envía un solo paquete (al igual que los algoritmos de control de congestión de pérdida de paquetes como CUBIC). Después de todo, cuando el remitente se da cuenta de que se ha perdido un paquete, pero todavía hay paquetes en vuelo, en el primer paso del proceso de recuperación de pérdida, BBR reduce temporalmente la velocidad de envío a la velocidad de entrega actual; en la segunda y siguientes rondas de recuperación de pérdidas, verifica que la tasa de envío nunca exceda la tasa de entrega actual en más del doble. Esto reduce significativamente la pérdida transitoria cuando BBR encuentra limitadores de velocidad o compite con otros flujos en un búfer del tamaño del BDP.

Enlaces

1. Abrahamsson, M. 2015. Supresión de TCP ACK. Lista de correo IETF AQM;

El software de código abierto se ha convertido en un componente básico para algunos de los sitios web más grandes. Con el crecimiento de estos sitios web, han surgido las mejores prácticas y directrices para su arquitectura. Este capítulo tiene como objetivo cubrir algunos de los aspectos clave a considerar al diseñar sitios web grandes, así como algunos de los componentes básicos que se utilizan para lograr estos objetivos.

El enfoque principal de este capítulo es el análisis de sistemas web, aunque parte del material puede extrapolarse a otros sistemas distribuidos.

1.1 Principios de la construcción de sistemas web distribuidos

¿Qué significa exactamente crear y administrar un sitio web o una aplicación escalables? En un nivel primitivo, simplemente conecta a los usuarios con recursos remotos a través de Internet. Y los recursos, o el acceso a esos recursos, que se encuentran dispersos en varios servidores, son el vínculo que hace que el sitio web sea escalable.

Como la mayoría de las cosas en la vida, tomarse el tiempo para planificar con anticipación la creación de su servicio web puede ayudar aún más; Comprender algunas de las consideraciones y compensaciones detrás de los sitios web grandes puede resultar en decisiones más inteligentes al crear sitios web más pequeños. Estos son algunos de los principios clave que influyen en el diseño de sistemas web a gran escala:

  • Disponibilidad: El tiempo de actividad del sitio web es fundamental para la reputación y la funcionalidad de muchas empresas. Para algunas de las tiendas minoristas en línea más grandes, no estar disponible ni siquiera por unos minutos puede resultar en miles o millones de dólares en ingresos perdidos. Por lo tanto, desarrollar sus sistemas que siempre estén disponibles y sean resistentes a fallas es un requisito fundamental tanto empresarial como tecnológico. La alta disponibilidad en los sistemas distribuidos requiere una consideración cuidadosa de la redundancia de los componentes clave, la recuperación rápida de fallas parciales del sistema y una redundancia sin problemas cuando surgen problemas.
  • Actuación: El rendimiento del sitio web se ha convertido en una métrica importante para la mayoría de los sitios. La velocidad del sitio web afecta la experiencia y la satisfacción del usuario, así como la clasificación de los motores de búsqueda, un factor que afecta directamente la retención de la audiencia y los ingresos. Como resultado, la clave es crear un sistema que esté optimizado para respuestas rápidas y baja latencia.
  • Fiabilidad: el sistema debe ser robusto de manera que una solicitud específica de datos devuelva datos específicos de manera consistente. En caso de cambio o actualización de datos, la misma consulta debe devolver nuevos datos. Los usuarios necesitan saber si algo está registrado en el sistema o almacenado en él, entonces pueden estar seguros de que permanecerá en su lugar para la posibilidad de recuperación de datos más adelante.
  • Escalabilidad: Cuando se trata de cualquier gran sistema distribuido, el tamaño es solo una de las muchas cosas a considerar. Igualmente importantes son los esfuerzos para aumentar el rendimiento para manejar grandes volúmenes de carga de trabajo, lo que comúnmente se conoce como escalabilidad del sistema. La escalabilidad puede referirse a varios parámetros de un sistema: la cantidad de tráfico adicional que puede manejar, qué tan fácil es aumentar la capacidad de almacenamiento o cuántas otras transacciones se pueden procesar.
  • Controlabilidad: El diseño de un sistema que sea fácil de operar es otro factor importante. La manejabilidad del sistema se equipara a la escalabilidad de las operaciones de “mantenimiento” y “actualizaciones”. Para asegurar la manejabilidad, es necesario considerar las cuestiones de facilidad de diagnóstico y comprensión de problemas emergentes, facilidad de actualización o modificación, sistema caprichoso en funcionamiento (es decir, si funciona como se esperaba sin fallas o excepciones?)
  • Costo: El costo es un factor importante. Obviamente, esto puede incluir costos de hardware y software, pero también es importante considerar otros aspectos necesarios para implementar y mantener el sistema. Se debe prever la cantidad de tiempo que toma el desarrollador para construir el sistema, la cantidad de esfuerzo operativo requerido para ponerlo en funcionamiento e incluso un nivel suficiente de capacitación. El costo es el costo total de propiedad.

Cada uno de estos principios es la base para la toma de decisiones en el diseño de una arquitectura web distribuida. Sin embargo, también pueden entrar en conflicto entre sí, porque el logro de los objetivos de uno se obtiene a costa de descuidar a los demás. Un ejemplo simple: elegir simplemente agregar varios servidores como una solución de rendimiento (escalabilidad) puede aumentar los costos de capacidad de administración (debe operar un servidor adicional) y la compra del servidor.

Al desarrollar cualquier tipo de aplicación web, es importante considerar estos principios clave, incluso si es para confirmar que el proyecto puede donar uno o más de ellos.

1.2 Conceptos básicos

Al considerar la arquitectura de un sistema, hay varias cuestiones que deben destacarse, como qué componentes vale la pena usar, cómo encajan y qué compensaciones se pueden realizar. Invertir dinero en escalar sin la obvia necesidad de hacerlo no puede considerarse una decisión empresarial inteligente. Sin embargo, un poco de previsión en la planificación puede ahorrar mucho tiempo y recursos en el futuro.

Esta sección se centra en algunos factores básicos que son fundamentales para casi todas las aplicaciones web grandes: servicios,
redundancia, segmentacióny manejo de rechazo... Cada uno de estos factores implica opciones y compensaciones, especialmente en el contexto de los principios descritos en la sección anterior. Pongamos un ejemplo para aclarar.

Ejemplo: aplicación de alojamiento de imágenes

Probablemente hayas publicado imágenes en la web antes. Para sitios grandes que almacenan y entregan múltiples imágenes, existen desafíos en la creación de una arquitectura rentable y altamente confiable que tenga una latencia de respuesta baja (recuperación rápida).

Imagine un sistema donde los usuarios pueden subir sus imágenes a un servidor central y las imágenes pueden solicitarse a través de un enlace de sitio o API, similar a Flickr o Picasa. Para simplificar la descripción, supongamos que esta aplicación tiene dos tareas principales: la capacidad de cargar (escribir) imágenes en el servidor y solicitar imágenes. Por supuesto, la carga eficiente es un criterio importante, pero la entrega rápida será una prioridad cuando los usuarios lo soliciten (por ejemplo, se puede solicitar que las imágenes se muestren en una página web u otra aplicación). Esta funcionalidad es similar a lo que puede proporcionar un servidor web o un servidor de borde de Content Delivery Network (CDN). Un servidor CDN normalmente almacena objetos de datos en muchas ubicaciones, por lo que su ubicación geográfica / física está más cerca de los usuarios, lo que conduce a un mejor rendimiento.

Otros aspectos importantes del sistema:

  • La cantidad de imágenes almacenadas puede ser ilimitada, por lo que la escalabilidad del almacenamiento debe considerarse desde esta perspectiva.
  • Debe haber una latencia baja para las descargas / solicitudes de imágenes.
  • Si un usuario carga una imagen en el servidor, sus datos siempre deben permanecer completos y accesibles.
  • El sistema debe ser fácil de mantener (manejabilidad).
  • Dado que el alojamiento de imágenes no es muy rentable, el sistema debe ser rentable.

Otro problema potencial con este diseño es que un servidor web como Apache o lighttpd generalmente tiene un límite superior en la cantidad de conexiones simultáneas que puede manejar (el valor predeterminado es alrededor de 500, pero puede ser mucho más alto). y con mucho tráfico, las escrituras pueden agotar rápidamente este límite. Dado que las lecturas pueden ser asincrónicas o aprovechar otras optimizaciones de rendimiento como gzip o chunking, el servidor web puede cambiar las lecturas de alimentación más rápido y cambiar entre clientes, atendiendo muchas más solicitudes que el número máximo de conexiones (con Apache y con el número máximo de conexiones establecido en 500, es muy posible atender varios miles de solicitudes de lectura por segundo). Las entradas, por otro lado, tienden a mantener una conexión abierta durante todo el tiempo de descarga. Por ejemplo, transferir un archivo de 1 MB al servidor podría tardar más de 1 segundo en la mayoría de las redes domésticas, con el resultado de que el servidor web solo podría procesar 500 de tales escrituras simultáneas.


Figura 1.2: Separación de lectura y escritura

Anticipar un problema potencial de este tipo sugiere la necesidad de separar la lectura y escritura de imágenes de los servicios independientes que se muestran en. Esto permitirá no solo escalar cada uno de ellos de forma individual (ya que es probable que siempre hagamos más lecturas que escrituras), sino también estar al tanto de lo que está sucediendo en cada servicio. Finalmente, delimitará problemas futuros, facilitando el diagnóstico y la evaluación del problema de lectura lenta.

La ventaja de este enfoque es que podemos resolver problemas independientemente unos de otros, sin tener que pensar en tener que grabar y adquirir nuevas imágenes en el mismo contexto. Ambos servicios todavía utilizan el corpus de imágenes global, pero cuando utilizan métodos específicos para un servicio en particular, pueden optimizar su propio rendimiento (por ejemplo, poniendo en cola solicitudes o almacenando en caché imágenes populares, más sobre esto más adelante). En términos de mantenimiento y costo, cada servicio se puede escalar de forma independiente según sea necesario. Y este es un factor positivo, ya que combinarlos y mezclarlos podría afectar inadvertidamente su desempeño, como en el escenario descrito anteriormente.

Por supuesto, el modelo anterior funcionará de manera óptima si hay dos puntos finales diferentes (de hecho, esto es muy similar a varias implementaciones de proveedores de almacenamiento en la nube y redes de entrega de contenido). Hay muchas formas de resolver estos problemas y en cada caso se puede encontrar un compromiso.

Por ejemplo, Flickr resuelve este problema de lectura y escritura distribuyendo usuarios entre diferentes módulos de modo que cada módulo solo pueda servir a un número limitado de usuarios específicos y, a medida que aumenta el número de usuarios, se agregan más módulos al clúster (consulte la presentación de escala de Flickr.
http://mysqldba.blogspot.com/2008/04/mysql-uc-2007-presentation-file.html). En el primer ejemplo, es más fácil escalar el hardware en función de la carga de uso real (número de lecturas y escrituras en todo el sistema), mientras que el escalado de Flickr se realiza en función de la base de usuarios (sin embargo, esto supone un uso igual entre diferentes usuarios, por lo que la capacidad debe planificarse con reserva). En el pasado, la falta de disponibilidad o un problema con uno de los servicios hacían inoperante la funcionalidad de todo el sistema (por ejemplo, nadie puede escribir archivos), entonces la inaccesibilidad de uno de los módulos de Flickr solo afectará a los usuarios asociados con él. En el primer ejemplo, es más fácil realizar operaciones en un conjunto de datos completo, por ejemplo, actualizar el servicio de escritura para incluir nuevos metadatos o buscar en todos los metadatos de la imagen, mientras que con la arquitectura Flickr, cada módulo tenía que ser actualizado o buscado (o el servicio de búsqueda tenía que ser creado para ordenar los metadatos que realmente están destinados a esto).

En cuanto a estos sistemas, no existe una panacea, pero siempre se debe partir de los principios descritos al principio de este capítulo: determinar las necesidades del sistema (cargar con operaciones de "lectura" o "escritura" o todas a la vez, el nivel de paralelismo, consultas sobre conjuntos de datos, rangos, ensayos, etc.), realizar evaluaciones comparativas de diferentes alternativas, comprender las condiciones para posibles fallas del sistema y desarrollar un plan integral de fallas.

Redundancia

Para hacer frente a las fallas con elegancia, la arquitectura web debe tener redundancia en sus servicios y datos. Por ejemplo, si solo hay una copia de un archivo almacenado en un solo servidor, la pérdida de ese servidor significará la pérdida del archivo. Esta situación difícilmente se puede caracterizar positivamente y, por lo general, se puede evitar creando múltiples copias o respaldos.

Este mismo principio se aplica a los servicios. Puede protegerse contra la falla de un solo nodo proporcionando una parte integral de la funcionalidad de una aplicación para garantizar que se ejecuten simultáneamente varias copias o versiones de la aplicación.

Al crear redundancia en el sistema, puede eliminar los puntos débiles y proporcionar funcionalidad redundante o redundante en caso de un desastre. Por ejemplo, si hay dos instancias del mismo servicio ejecutándose en "producción", y una de ellas falla en su totalidad o en parte, el sistema puede superar la falla a expensas de cambiar a una copia de trabajo.
El cambio puede ocurrir automáticamente o requerir una intervención manual.

Otro papel clave de la redundancia de servicios es crear arquitectura no compartida... Con esta arquitectura, cada nodo es capaz de trabajar de forma independiente y, además, en ausencia de un "cerebro" central que controle estados o coordine las acciones de otros nodos. Promueve la escalabilidad, ya que agregar nuevos nodos no requiere condiciones o conocimientos especiales. Lo más importante es que no existe un punto crítico de falla en estos sistemas, lo que los hace mucho más resistentes a las fallas.

Por ejemplo, en nuestra aplicación de servidor de imágenes, todas las imágenes tendrían copias redundantes en otro lugar del hardware (idealmente con una ubicación geográfica diferente en caso de un desastre como un terremoto o un incendio en el centro de datos) y servicios de acceso a imágenes. será redundante, y todos ellos podrían atender solicitudes. (Cm. .)
De cara al futuro, los balanceadores de carga son una excelente manera de hacer esto posible, pero más sobre eso a continuación.


Figura 1.3: Aplicación de alojamiento de imágenes redundante

Segmentación

Los conjuntos de datos pueden ser tan grandes que no se pueden alojar en un solo servidor. También puede suceder que las operaciones computacionales requieran demasiados recursos informáticos, reduciendo el rendimiento y requiriendo un aumento de potencia. En cualquier caso, tiene dos opciones: escala vertical u horizontal.

La ampliación implica agregar más recursos a un solo servidor. Entonces, para un conjunto de datos muy grande, esto significaría agregar más (o más) discos duros y, por lo tanto, todo el conjunto de datos podría caber en un servidor. En el caso de operaciones computacionales, esto significaría mover el cálculo a un servidor más grande con CPU más rápida o más memoria. En cualquier caso, el escalado vertical se realiza para hacer que un recurso separado del sistema informático sea capaz de procesar datos adicionales.

Escalar horizontalmente, por otro lado, implica agregar más nodos. En el caso de un conjunto de datos grande, esto significaría agregar un segundo servidor para almacenar parte de los datos totales, y para un recurso computacional, esto significaría dividir el trabajo o cargar algunos nodos adicionales. Para aprovechar al máximo el potencial de la escalabilidad horizontal, debe implementarse como un principio de diseño interno para la arquitectura del sistema. De lo contrario, cambiar y resaltar el contexto requerido para la escala horizontal puede resultar problemático.

El método más común para escalar horizontalmente es dividir los servicios en segmentos o módulos. Se pueden distribuir de tal manera que cada conjunto lógico de funciones funcione por separado. Esto se puede hacer por límites geográficos u otros criterios, como usuarios que pagan y que no pagan. La ventaja de estos esquemas es que brindan un servicio o almacén de datos con funcionalidad mejorada.

En nuestro servidor de imágenes de ejemplo, es posible que el servidor de archivos único utilizado para almacenar la imagen pueda ser reemplazado por varios servidores de archivos, cada uno con su propio conjunto único de imágenes. (Ver) Esta arquitectura permitirá que el sistema llene cada servidor de archivos con imágenes, agregando servidores adicionales a medida que se llena el espacio en disco. El diseño requerirá un esquema de nombres que asocie el nombre del archivo de imagen con el servidor que lo contiene. El nombre de la imagen se puede generar a partir de un esquema de hash coherente vinculado a los servidores. O, alternativamente, cada imagen puede tener un ID incremental, lo que permitirá que el servicio de entrega procese solo el rango de ID asociados con cada servidor (como un índice) al solicitar una imagen.


Figura 1.4: Una aplicación de alojamiento de imágenes con redundancia y fragmentación

Por supuesto, existen dificultades para distribuir datos o funciones en varios servidores. Una de las preguntas clave: ubicación de datos; en los sistemas distribuidos, cuanto más cerca estén los datos del sitio de operación o del punto de cálculo, mejor será el rendimiento del sistema. En consecuencia, distribuir datos a través de múltiples servidores es potencialmente problemático, ya que cada vez que se necesiten datos, existe el riesgo de que no estén en el lugar de la demanda, el servidor tendrá que realizar una selección costosa de la información necesaria a través de la red.

Otro problema potencial surge en la forma
inconsistencia (inconsistencia)Cuando varios servicios leen y escriben en un recurso compartido, potencialmente otro servicio o almacén de datos, existe la posibilidad de condiciones de carrera, donde algunos datos se consideran actualizados a su estado actual, pero en realidad se leen antes de actualizarse, en cuyo caso los datos son inconsistentes. Por ejemplo, en un escenario de alojamiento de imágenes, puede ocurrir una condición de carrera si un cliente envía una solicitud para actualizar la imagen del perro, cambiando el título "Perro" a "Gizmo", mientras otro cliente está leyendo la imagen. En tal situación, no está claro qué título, "Perro" o "Gizmo", habría recibido el segundo cliente.

Existen, por supuesto, algunos obstáculos relacionados con la fragmentación de datos, pero la fragmentación le permite distinguir cada uno de los problemas de los demás: por datos, por carga, por patrones de uso, etc. en bloques controlados. Esto puede ayudar con la escalabilidad y la capacidad de administración, pero el riesgo sigue ahí. Hay muchas formas de mitigar el riesgo y manejar las fallas; sin embargo, en aras de la brevedad, no se tratan en este capítulo. Si desea obtener más información sobre este tema, debe echar un vistazo a la publicación del blog sobre tolerancia a fallas y monitoreo.

1.3. Componentes estructurales de acceso a datos rápido y escalable

Habiendo cubierto algunos principios básicos en el desarrollo de sistemas distribuidos, pasemos ahora al punto más difícil: escalar el acceso a los datos.

Las aplicaciones web más simples, como la pila LAMP, son similares a la imagen en.


Figura 1.5: Aplicaciones web simples

A medida que una aplicación crece, existen dos desafíos principales: escalar el acceso al servidor de aplicaciones y la base de datos. En un diseño de aplicación altamente escalable, un servidor web o un servidor de aplicaciones generalmente se minimiza y, a menudo, implementa una arquitectura que no comparte recursos. Esto hace que la capa del servidor de aplicaciones del sistema se amplíe. Como resultado de este diseño, el trabajo duro se trasladará al servidor de la base de datos y los servicios de apoyo; Aquí es donde entran en juego los problemas reales de escala y rendimiento.

El resto de este capítulo se centra en algunas de las estrategias y técnicas más comunes para mejorar el rendimiento y la escalabilidad de este tipo de servicios proporcionando un acceso rápido a los datos.


Figura 1.6: Aplicación web simplificada

La mayoría de los sistemas se pueden simplificar a un diagrama en,
que es un buen punto de partida para empezar a considerar. Si tiene muchos datos, puede asumir que quiere que sea tan fácil y rápido de acceder como la caja de dulces en el cajón superior de su escritorio. Si bien esta comparación está muy simplificada, apunta a dos problemas desafiantes: escalabilidad del almacén de datos y acceso rápido a los datos.

Para esta sección, supongamos que tiene muchos terabytes (TB) de datos y permite que los usuarios accedan a pequeñas porciones de esos datos sin ningún orden en particular. (Cm. .)
Una tarea similar es ubicar el archivo de imagen en algún lugar del servidor de archivos en la aplicación de alojamiento de imágenes de muestra.


Figura 1.7: Acceso a datos específicos

Esto es especialmente difícil porque cargar terabytes de datos en la memoria puede ser muy costoso y afecta directamente al número de operaciones de E / S del disco. La velocidad de lectura de un disco es varias veces menor que la velocidad de lectura de la RAM; podemos decir que el acceso a la memoria es tan rápido como Chuck Norris, mientras que el acceso a un disco es más lento que la cola en la clínica. Esta diferencia de velocidad es especialmente notable para grandes conjuntos de datos; en números secos, el acceso a la memoria es 6 veces más rápido que las lecturas de disco para lecturas secuenciales y 100.000 veces más rápido para lecturas aleatorias (consulte Patologías de Big Data, http://queue.acm.org/detail. cfm? id \u003d 1563874).). Además, incluso con identificadores únicos, resolver el problema de localizar una pequeña parte de los datos puede ser tan difícil como sacar el último caramelo relleno de chocolate de una caja de cientos de otros caramelos sin mirar.

Afortunadamente, hay muchos enfoques que puede adoptar para simplificar las cosas, de los cuales los cuatro más importantes son cachés, proxies, índices y balanceadores de carga. El resto de esta sección analiza cómo se puede utilizar cada uno de estos conceptos para que el acceso a los datos sea mucho más rápido.

Cachés

El almacenamiento en caché se beneficia de un principio básico de que es probable que los datos solicitados recientemente vuelvan a ser necesarios. Los cachés se utilizan en casi todas las capas de la informática: hardware, sistemas operativos, navegadores web, aplicaciones web y más. Un caché es como una memoria a corto plazo: de tamaño limitado, pero más rápido que la fuente de datos original, y contiene elementos a los que se accedió recientemente. Los cachés pueden existir en todos los niveles de la arquitectura, pero a menudo se encuentran en el nivel más cercano al front-end, donde se implementan para devolver datos rápidamente sin una carga de back-end significativa.

Entonces, ¿cómo se puede utilizar la caché para acelerar el acceso a los datos dentro de nuestra API de muestra? En este caso, hay varias ubicaciones de caché adecuadas. Como una de las posibles opciones de ubicación, puede seleccionar nodos en el nivel de consulta, como se muestra en
.


Figura 1.8: Colocación de una caché en un nodo de nivel de consulta

Colocar la caché directamente en el nodo de nivel de solicitud permite el almacenamiento local de datos de respuesta. Cada vez que se realiza una solicitud de servicio, el host devolverá rápidamente datos locales en caché, si los hubiera. Si no está en la caché, el nodo de solicitud solicitará datos del disco. La caché en un solo nodo en el nivel de solicitud también podría ubicarse tanto en la memoria (que es muy rápida) como en el disco local del nodo (más rápido que intentar acceder al NAS).


Figura 1.9: Sistemas de caché

¿Qué sucede cuando propaga el almacenamiento en caché a varios nodos? Como puede ver, si la capa de consulta incluirá muchos nodos, entonces es probable que cada nodo tenga su propia caché. Sin embargo, si su equilibrador de carga distribuye solicitudes aleatoriamente entre nodos, la misma solicitud irá a diferentes nodos, lo que aumentará las fallas de caché. Dos formas de superar este obstáculo son las cachés globales y distribuidas.

Caché global

El significado de la caché global se desprende del nombre: todos los nodos utilizan un único espacio de caché. En este caso, se agrega un servidor o almacén de archivos de algún tipo que es más rápido que su tienda original y que estará disponible para todos los nodos del nivel de consulta. Cada uno de los nodos de solicitud solicita la caché de la misma forma que si fuera local. Este tipo de esquema de almacenamiento en caché puede causar cierta confusión, ya que es muy fácil sobrecargar una sola caché a medida que aumenta el número de clientes y solicitudes. Al mismo tiempo, este esquema es muy efectivo para ciertas arquitecturas (especialmente cuando se trata de hardware especializado que hace que esta caché global sea muy rápida, o que tiene un conjunto fijo de datos para almacenar en caché).

Hay dos formas estándar de cachés globales, que se muestran en los diagramas. La situación se representa cuando no se encuentra una respuesta almacenada en caché en la caché, la caché en sí se hace responsable de recibir los datos faltantes del almacenamiento subyacente. Ilustra la responsabilidad de los nodos de solicitud de recuperar cualquier dato que no se encuentre en la caché.


Figura 1.10: Caché global, donde el caché es responsable de recuperar


Figura 1.11: Caché global donde los nodos de solicitud son responsables de recuperar

La mayoría de las aplicaciones que refuerzan las memorias caché globales tienden a utilizar el primer tipo, donde la propia memoria caché gestiona el reemplazo y recupera los datos para evitar que los clientes inunden las solicitudes de los mismos datos. Sin embargo, hay algunos casos en los que la segunda implementación tiene más sentido. Por ejemplo, si la caché se utiliza para archivos muy grandes, una tasa de aciertos de caché baja sobrecargará la caché de búfer con fallas de caché; en esta situación, es útil tener un gran porcentaje del conjunto de datos total (o conjunto de datos activo) en la caché. Otro ejemplo es una arquitectura donde los archivos almacenados en la caché son estáticos y no deben eliminarse. (Esto puede deberse a las características de rendimiento subyacentes de dicha latencia, tal vez ciertos datos deben ser muy rápidos para conjuntos de datos grandes, cuando la lógica de la aplicación comprende la estrategia de reemplazo o los puntos de acceso mejor que la caché).

Caché distribuida

Estos índices a menudo se almacenan en la memoria o en algún lugar muy local para la solicitud del cliente entrante. Berkeley DB (BDB) y las estructuras de datos de árbol, que se utilizan comúnmente para almacenar datos en listas ordenadas, son ideales para el acceso indexado.

A menudo, hay muchos niveles de índices que sirven como un mapa, moviéndolo de una ubicación a otra, y así sucesivamente, hasta que obtenga la pieza de datos que desea. (Cm. )


Figura 1.17: Índices multinivel

Los índices también se pueden utilizar para crear otras vistas de los mismos datos. Para conjuntos de datos grandes, esta es una excelente manera de definir diferentes filtros y vistas sin tener que crear muchas copias adicionales de los datos.

Por ejemplo, suponga que el sistema de alojamiento de imágenes mencionado anteriormente aloja imágenes de páginas de libros y el servicio permite que el cliente realice consultas sobre el texto de esas imágenes, buscando todo el contenido de texto sobre un tema determinado, al igual que los motores de búsqueda le permiten buscar HTML. contenido. En este caso, todas estas imágenes de libros usan muchos servidores para almacenar archivos, y encontrar una página para presentar al usuario puede ser bastante difícil. Inicialmente, los índices inversos para consultar palabras arbitrarias y conjuntos de palabras deberían estar fácilmente disponibles; luego está el desafío de navegar a la página y ubicación exactas en ese libro y extraer la imagen correcta para los resultados de búsqueda. Por lo tanto, en este caso, el índice invertido se asignaría a una ubicación (como el libro B), y luego B podría contener un índice con todas las palabras, ubicaciones y el número de ocurrencias en cada parte.

El índice invertido que Index1 puede mostrar en el diagrama anterior se vería así: Cada palabra o conjunto de palabras sirve como índice para los libros que las contienen.

El índice intermedio tendrá un aspecto similar, pero solo contendrá las palabras, la ubicación y la información del Libro B. Esta arquitectura de múltiples capas permite que cada uno de los índices ocupe menos espacio que si toda esta información se almacenara en un gran índice invertido.

Y esto es clave en los sistemas a gran escala, porque incluso cuando están comprimidos, estos índices pueden ser bastante grandes y costosos de almacenar. Supongamos que tenemos muchos libros de todo el mundo en este sistema (100.000.000 (consulte la entrada del blog "Dentro de Google Books") y que cada libro tiene solo 10 páginas (para simplificar los cálculos) con 250 palabras por página. : Esto nos da un total de 250 mil millones de palabras. Si tomamos el número promedio de caracteres en una palabra como 5, y codificamos cada carácter con 8 bits (o 1 byte, aunque algunos caracteres en realidad toman 2 bytes), gastando 5 bytes por palabra, entonces el índice contener cada palabra solo una vez requerirá más de 1 terabyte de almacenamiento. Por lo tanto, puede ver que los índices que contienen otra información, como conjuntos de palabras, ubicaciones de datos y recuentos de uso, pueden aumentar de volumen muy rápidamente.

La creación de estos índices intermedios y la presentación de los datos en trozos más pequeños facilita la resolución del problema de los macrodatos. Los datos se pueden distribuir en varios servidores y, al mismo tiempo, estar disponibles rápidamente. Los índices son la piedra angular de la recuperación de información y la base de los motores de búsqueda modernos de hoy. Por supuesto, esta sección es solo general sobre el tema de la indexación, y se ha investigado mucho sobre cómo hacer que los índices sean más pequeños, más rápidos, que contengan más información (como la relevancia) y se actualicen sin problemas. (Existen algunos problemas con la capacidad de administración de los términos en competencia, así como con la cantidad de actualizaciones necesarias para agregar nuevos datos o cambiar los datos existentes, especialmente cuando se trata de relevancia o calificación).

Ser capaz de encontrar sus datos de forma rápida y sencilla es fundamental, y los índices son la herramienta más sencilla y eficaz para lograr este objetivo.

Equilibradores de carga

Finalmente, otra parte crítica de cualquier sistema distribuido es el equilibrador de carga. Los balanceadores de carga son una parte esencial de cualquier arquitectura, ya que su función es distribuir la carga entre los nodos responsables de atender las solicitudes. Esto permite que varios nodos sirvan de forma transparente la misma función en el sistema. (Ver) Su propósito principal es manejar muchas conexiones simultáneas y enrutar esas conexiones a uno de los nodos solicitados, lo que permite que el sistema se amplíe simplemente agregando nodos para atender más solicitudes.


Figura 1.18: Balanceador de carga

Hay muchos algoritmos diferentes para atender las solicitudes, incluida la selección aleatoria de nodos, la operación por turnos o incluso la selección de nodos según ciertos criterios, como el uso de CPU o RAM. Los equilibradores de carga se pueden implementar como dispositivos de hardware o software. HAProxy es el equilibrador de carga de código abierto más utilizado.

En un sistema distribuido, los equilibradores de carga suelen estar en la parte frontal del sistema, de modo que todas las solicitudes entrantes pasan directamente por ellos. Es muy probable que en un sistema distribuido complejo, la solicitud tenga que pasar por varios balanceadores de carga, como se muestra en
.


Figura 1.19: Varios equilibradores de carga

Al igual que los proxies, algunos balanceadores de carga también pueden enrutar las solicitudes de manera diferente, según el tipo de solicitud. También se conocen como proxies inversos.

La administración de datos específicos de una sesión de usuario específica es uno de los desafíos al usar balanceadores de carga. En un sitio de comercio electrónico, cuando solo tiene un cliente, es muy fácil para los usuarios poner cosas en su carrito y guardar su contenido entre visitas (esto es importante, ya que la probabilidad de que un producto se venda aumenta significativamente si, después de que el usuario regresa al sitio, el producto aún está está en su canasta). Sin embargo, si un usuario es dirigido a un sitio durante la primera sesión y luego a otro sitio durante su próxima visita, entonces pueden ocurrir inconsistencias porque el nuevo sitio puede no tener datos sobre el contenido del carrito de compras de ese usuario. (¿No te molestaría si pusieras un paquete de Mountain Dew en tu canasta y cuando regreses no estará allí?) Una solución podría ser hacer que las sesiones sean "pegajosas" para que el usuario siempre sea dirigido a el mismo nodo. Sin embargo, aprovechar algunas de las características de confiabilidad, como la conmutación por error automática, será significativamente difícil. En este caso, el carrito del usuario siempre tendrá contenido, pero si su nodo fijo deja de estar disponible, se necesitará un enfoque especial y la suposición sobre el contenido del carrito ya no será cierta (aunque, con suerte, esta suposición no estará integrada en la aplicación). Por supuesto, este problema se puede resolver con otras estrategias y herramientas como se describe en este capítulo, como servicios y muchos otros (como cachés de navegador, cookies y reescritura de URL).

Si el sistema tiene solo unos pocos nodos, es más probable que técnicas como un carrusel de DNS sean más prácticas que los equilibradores de carga, que pueden ser costosos y agregar una capa innecesaria a la complejidad del sistema. Por supuesto, los sistemas grandes tienen todo tipo de algoritmos de balanceo de carga y programación diferentes, incluidos algoritmos simples como selección aleatoria o carrusel, así como mecanismos más complejos que toman en cuenta las características de rendimiento de los patrones de uso del sistema. Todos estos algoritmos distribuyen el tráfico y las solicitudes, y pueden proporcionar herramientas de confiabilidad útiles, como la conmutación por error automática o la eliminación automática de un nodo dañado (por ejemplo, cuando deja de responder). Sin embargo, estas funciones avanzadas pueden dificultar el diagnóstico de problemas. Por ejemplo, en situaciones de alta carga, los balanceadores de carga eliminarán los nodos que pueden estar lentos o agotados (debido a un aluvión de solicitudes), lo que solo agravará la situación para otros nodos. En estos casos, un control extenso es importante porque incluso si el tráfico y la carga del sistema general parecen reducirse (dado que los nodos atienden menos solicitudes), los nodos individuales pueden estar sobrecargados.

Los equilibradores de carga son una forma sencilla de aumentar la capacidad del sistema. Como las otras técnicas descritas en este artículo, juega un papel esencial en la arquitectura de un sistema distribuido. Los equilibradores de carga también proporcionan una función crítica para verificar el estado de los nodos. Si, como resultado de dicha verificación, un nodo no responde o está sobrecargado, entonces se puede eliminar del grupo de procesamiento de solicitudes y, debido a la redundancia de su sistema, la carga se redistribuirá entre los nodos de trabajo restantes.

Colas

Hasta ahora, hemos analizado muchas formas de leer datos rápidamente. Al mismo tiempo, la gestión eficiente de registros es otra parte importante de escalar el nivel de datos. Cuando los sistemas son simples con cargas de procesamiento mínimas y bases de datos pequeñas, la escritura puede ser predeciblemente rápida. Sin embargo, en sistemas más complejos, este proceso puede llevar un tiempo indefinidamente largo. Entonces, por ejemplo, es posible que los datos deban escribirse en varias ubicaciones en diferentes servidores o índices, o es posible que el sistema simplemente tenga una gran carga. En los casos en los que las escrituras o incluso cualquier tarea requieren mucho tiempo, lograr rendimiento y disponibilidad requiere la construcción de asincronía en el sistema. Una forma habitual de hacer esto es poner en cola las solicitudes.


Figura 1.20: Solicitud síncrona

Imagine un sistema en el que cada cliente solicita una tarea de servicio remota. Cada uno de estos clientes envía su solicitud al servidor, que completa las tareas lo más rápido posible y devuelve sus resultados a los clientes correspondientes. En sistemas pequeños, donde un solo servidor (o servicio lógico) puede atender a los clientes entrantes tan rápido como llegan, este tipo de situación debería funcionar bien. Sin embargo, cuando el servidor recibe más solicitudes de las que puede manejar, cada cliente se ve obligado a esperar a que los demás clientes completen el procesamiento antes de que se genere una respuesta a su propia solicitud. Este es un ejemplo de una solicitud síncrona representada en.

Este tipo de comportamiento sincrónico puede degradar significativamente el rendimiento del cliente; de hecho, inactivo, el cliente se ve obligado a esperar hasta recibir una respuesta a la solicitud. Agregar servidores adicionales para hacer frente a la carga del sistema no resuelve realmente el problema; Incluso con un equilibrio de carga eficaz en el lugar, es extremadamente difícil garantizar el equilibrio de carga uniforme y equitativo necesario para maximizar la productividad del cliente. Además, si el servidor no está disponible para procesar esta solicitud (o ha fallado), el cliente conectado a él también dejará de funcionar. Una solución eficaz a este problema requiere una abstracción entre la solicitud del cliente y el trabajo real que se está realizando para atenderlo.


Figura 1.21: Uso de colas para administrar solicitudes

Colas de entrada. El mecanismo de la cola es muy simple: llega una tarea, ingresa a la cola y luego los "trabajadores" aceptan la siguiente tarea tan pronto como tienen la oportunidad de procesarla. (Consulte) Estas tareas pueden ser tan simples como escribir en una base de datos o tan complejas como generar una imagen de vista previa de un documento. Cuando un cliente envía solicitudes a tareas en cola, ya no necesita esperar los resultados de la ejecución; por el contrario, las solicitudes solo deben reconocerse debidamente como recibidas. Esta confirmación puede servir posteriormente como enlace a los resultados del trabajo cuando el cliente los solicite.

Las colas permiten a los clientes trabajar de manera asincrónica al proporcionar una abstracción estratégica de la solicitud y respuesta de un cliente. Por otro lado, en un sistema síncrono, no hay diferenciación entre solicitud y respuesta y, por lo tanto, no se puede controlar por separado. En un sistema asincrónico, el cliente configura una tarea, el servicio responde con un mensaje confirmando que la tarea ha sido recibida, y luego el cliente puede verificar periódicamente el estado de la tarea, solo preguntando por el resultado tan pronto como se haya completado. Mientras el cliente realiza una solicitud asincrónica, es libre de realizar otro trabajo e incluso realizar solicitudes asincrónicas a otros servicios. Este último es un ejemplo de cómo funcionan las colas y los mensajes en sistemas distribuidos.

Las colas también brindan cierta protección contra interrupciones y denegaciones del servicio. Por ejemplo, es bastante fácil crear una cola muy persistente que pueda repetir las solicitudes de servicio que han dejado de funcionar debido a interrupciones transitorias del servidor. Es más preferible usar una cola para hacer cumplir las garantías de QoS que exponer a los clientes a interrupciones temporales del servicio, lo que requiere un manejo de errores complejo y, a menudo, conflictivo del lado del cliente.

1.4. Conclusión

Desarrollar sistemas eficientes con acceso rápido a grandes cantidades de datos es un tema muy interesante, y todavía hay un número importante de buenas herramientas que permiten adaptar todo tipo de nuevas aplicaciones. Este capítulo ha abordado solo algunos ejemplos, pero en realidad hay muchos más, y la creación de nuevas innovaciones en esta área solo continuará.

Este trabajo se distribuye bajo la licencia Creative Commons Attribution 3.0 inalterada. Ver detalles en