Dificultades: ¿Por qué hay avalancha del sistema?

Este martes participé en la presentación del "Programa de Apoyo a la Creación 2021" que realizó el CSDN. El autor estaba completamente contagiado por la pasión y perseverancia del vicepresidente Yu Bangxu. Para ser honesto, el autor, que tiene casi un año, rara vez He estado así recientemente. Estoy impresionado, o los veteranos de TI como yo, además de contribuir con algunos artículos de comentario a la cuenta pública de CSDN, también tienen la oportunidad de compartir algo de experiencia con los lectores en un nivel puramente técnico.

Traté de escribir algunos artículos en la serie "Enfermedades Difíciles y Misceláneas" unos años más tarde, pero al analizar las causas de las fallas, necesitaba determinar rápidamente la dirección del problema a resolver, pero la "metacognición" del se necesitaba un mecanismo subyacente. O tome el ejemplo del "Plan de apoyo a la creación 2021" Durante la transmisión en vivo, algunos internautas preguntaron por qué el sitio web de CSDN siempre colapsaba. En ese momento, el Sr. Yu mencionó que es difícil que un sitio web implementado con la arquitectura de arranque Spring se bloquee. Una vez que falla, es básicamente un mal uso de Redis. Este es en realidad el mecanismo subyacente para resolver enfermedades intratables. Por supuesto, está relacionado con Redis Resumen de manejo de problemas Tendremos una introducción detallada en el próximo artículo de esta serie Este artículo primero responde cómo establecer un sentido de cómo juzgar rápidamente la dirección de la resolución de problemas.

Tipos de avalanchas

El efecto de avalancha es una situación que se encuentra a menudo en nuestro entorno de producción. Generalmente se refiere a que el sistema está funcionando bien en momentos normales y los recursos también son redundantes, pero no puede verse afectado por tráfico repentino o condiciones anormales. Siempre que el exterior está presurizado, o hay otras situaciones que superan las expectativas colapsarán instantáneamente.Las avalanchas se dividen principalmente en dos situaciones, ambas relacionadas con valores críticos:

Problema de concurrencia de transacciones: una vez que el número de transacciones concurrentes excede un cierto valor crítico, la eficiencia de procesamiento del sistema caerá exponencialmente. Un ejemplo es el siguiente. Si en circunstancias normales, se pueden procesar 100 transacciones simultáneas por segundo, pero si el volumen de transacciones alcanza el valor crítico de 200, entonces la capacidad de procesamiento del sistema puede caer en picado a menos de 10 transacciones.

Problema de la proporción de transacciones fallidas: una vez que la proporción de transacciones fallidas supera un cierto umbral, la capacidad de procesamiento del sistema también se reducirá exponencialmente.

Hay muchas razones para la caída en picado de la capacidad de procesamiento del sistema, pero la esencia a menudo es causada por el mecanismo de penalización de la canalización de la CPU y el mecanismo de activación de la memoria caché de la CPU. A continuación, comencemos con el modelo de canalización del procesador.

Por qué los recursos son lo suficientemente redundantes, pero siguen siendo avalanchas

Sabemos que todas las acciones de las computadoras electrónicas son provocadas por oscilaciones de cristal. Por lo tanto, la frecuencia de oscilación de la CPU también se denomina frecuencia principal, que es una manifestación directa del rendimiento de procesamiento de la CPU. Sin embargo, como la ley de Moore está terminando gradualmente, simplemente aumentar la frecuencia principal de la CPU para obtener El camino hacia un mayor rendimiento se ha vuelto gradualmente imposible, por lo que los fabricantes de chips han comenzado a optimizar en la dirección de mejorar la eficiencia del procesamiento de instrucciones.

Tome la instrucción ADD adicional como ejemplo. Para completar esta instrucción de ejecución, se requieren varios pasos, como obtener instrucciones, decodificar, obtener operandos, ejecutar y obtener los resultados de la operación, y cada paso requiere una oscilación de cristal para avanzar, por lo que antes de la aparición de la tecnología de tuberías Se necesitan al menos de 5 a 6 ciclos de oscilación de cristal para ejecutar una instrucción , como se muestra en la siguiente figura:

En respuesta a tales problemas, los diseñadores de chips propusieron la idea de referirse al mecanismo de la línea de ensamblaje de fábrica, porque los módulos de búsqueda y decodificación son en realidad independientes, y la finalización se puede hacer en paralelo al mismo tiempo, siempre que los pasos relevantes de varias instrucciones se ponen Ejecutar al mismo tiempo, como la obtención de la instrucción 1, la decodificación de la instrucción 2, la obtención de operandos de la instrucción 3, etc., y así sucesivamente, para lograr un aumento significativo en el efecto de ejecución de la CPU. la tubería de 5 etapas como ejemplo. Los principios específicos se detallan a continuación Imagen:

 

 

Como puede verse en la figura anterior, T5 es el quinto ciclo de oscilación y se establece el pipeline de instrucciones Desde entonces, cada ciclo de oscilación T puede obtener el resultado de una instrucción, lo que significa que, en promedio, solo se necesita una instrucción. El ciclo de oscilación se puede completar.

 

Por supuesto, el establecimiento del pipeline de instrucciones también tiene un prerrequisito, es decir, la CPU debe poder conocer el orden de ejecución de las instrucciones de antemano. Esta es la tecnología de predicción de instrucciones, porque una vez predice que la siguiente instrucción se ejecutará incorrectamente , la CPU debe borrar todas las canalizaciones actuales y reiniciar desde la obtención de instrucciones correcta ejecutada, y la CPU se ha degradado para requerir cinco ciclos para ejecutar un punto de choque de instrucción, que también es uno de los culpables de las avalanchas.

 

Según las estadísticas de Intel, la CPU promedio encontrará un posible salto cada vez que ejecute 7 instrucciones. Es decir, un juicio si ocurre cada 7 líneas de código en promedio, y cada vez que se hace un juicio, el programa puede saltar. Una vez que el salto causa una predicción de instrucción inexacta, duplicará la eficiencia de la CPU.

 

Por lo tanto, la CPU general proporciona la función de predicción de instrucciones en la capa de lenguaje ensamblador, y el lenguaje de alto nivel generalmente también proporciona modificadores para que la CPU realice la predicción de instrucciones. A menudo podemos ver la modificación de desemejante en el código del kernel de Linux, que es esencialmente para negocios. La lógica no tiene ningún efecto, pero le indica a la CPU que es poco probable que aparezca este resultado de juicio. No coloque este código en la canalización para garantizar la máxima eficiencia operativa del sistema durante el funcionamiento normal.

 

En términos generales, durante una avalancha, esta rama diferente se ejecuta a gran escala. Dado que la rama diferente es básicamente imposible de ejecutar en circunstancias normales , agregar este modificador es muy útil para mejorar la eficiencia de ejecución en circunstancias normales , pero una vez que ocurre de tal rama popular a gran escala se ejecuta, el efecto de castigo debería ser muy obvio. Además, una vez que la situación de error supera el umbral, su impacto en la eficiencia se duplica.

El almacenamiento en caché de la CPU también puede causar problemas

En general, los programadores a menudo no entienden que la velocidad de acceso a la memoria es muy rápida, pero este no es el caso. Tomando como ejemplo la CPU de Intel, generalmente se divide en tres niveles de caché. Entre ellos, la velocidad del caché de primer nivel es a nivel de registro y solo se requieren unos pocos accesos. Ciclo de instrucción, la caché de segundo nivel es aproximadamente de 6 a 8 veces más lenta que la caché de primer nivel, la caché de tercer nivel es 8 veces más lenta que la caché de segundo nivel, y la memoria es 10 veces más lenta que la caché de tercer nivel. De hecho, la velocidad de la memoria es solo relativa al disco y la velocidad de la memoria no es suficiente en comparación con la memoria caché de la CPU.

Para aclarar este problema, aquí hay una breve revisión de los tres mecanismos de asignación de memoria a la conexión directa de la memoria caché de la CPU, la conexión completa y la conexión de grupo.

Conexión directa: La más simple es la conexión directa. La dirección de memoria general de la CPU que utiliza esta estrategia se divide en código de área + número de bloque + dirección dentro del bloque para el direccionamiento. El principio específico es el siguiente:

 

Con esta estrategia, el número de áreas en la memoria y el caché es diferente. Generalmente, el número de áreas en la memoria es mucho mayor que el de la memoria principal. Por ejemplo, puede haber 1024 áreas en la memoria principal, pero puede haber sólo 16 áreas en la memoria. Suponiendo que la longitud de cada área es 2 ^ k, entonces no importa qué área de la memoria principal el bloque de memoria a ser mapeado esté en la programación de caché de la CPU, el bloque 0 solo se puede colocar en el bloque de caché correspondiente y puede solo se pueden asignar al 0 en el caché., 2 ^ k + 1, 2 ^ k * n + 1 (donde 2 ^ k es la longitud de la dirección del área) bloques, es decir, la memoria solo se puede asignar a un número relativamente limitado de bloques, y no se puede colocar en otras ubicaciones.Esto puede causar más problemas, porque es posible que la caché sea claramente rica, pero si el bloque 0 en todas las áreas de la caché está completamente ocupado, en este momento otra memoria las unidades ubicadas en el bloque 0 ya no se pueden transferir a la caché. Por lo tanto, esta estrategia rara vez se utiliza en la práctica.

Conexión completa: debe decirse que la conexión completa es la más eficiente de todas las estrategias de almacenamiento en caché, porque no tiene ninguna estrategia de conexión directa, y todas las unidades de memoria se pueden conectar y almacenar libremente, como se muestra en la siguiente figura:

 

Esto también mejora en gran medida la eficiencia operativa de la caché de la CPU, pero también se puede ver en las líneas densas que la desventaja de esto es que el costo es demasiado alto, todas las unidades de memoria deben estar conectadas a la caché y el diseño del circuito es difícil. También es muy grande.

Conexión de grupo: en el modo de mapeo asociativo de grupo, la caché se divide en 2 ^ k grupos y la memoria se divide en u * 2 ^ k grupos (un múltiplo positivo del número de grupos de memoria). Se utiliza una conexión directa entre el grupo de memoria y el grupo de caché, y se utiliza una conexión completa con cada bloque del grupo. En otras palabras, el m-ésimo grupo de la memoria principal solo se puede asignar al grupo de caché j = m mod 2 ^ k, pero el bloque de caché en el grupo de memoria m se puede asignar a cualquier bloque del grupo de caché j. Como se muestra abajo

 

La conexión de grupo es en realidad un compromiso entre el costo y la eficiencia, y también es el método de conexión más utilizado para las CPU convencionales como Intel y ARM.

Problemas derivados causados ​​por la estrategia de mapeo de caché: dado que la estrategia de caché más utilizada es la conexión de grupo, y debido a que cada bloque del grupo está conectado, la conexión de grupo es generalmente una estrategia codiciosa, es decir, si hay otros espacios libres en el grupo en caché La caché de la CPU también mapeará otros bloques en el grupo de memoria involucrado en esta programación a la caché, porque tal operación apenas necesita pagar un costo de tiempo adicional. Es decir, es probable que los datos de la memoria adyacente en la memoria se mapeen en la caché al mismo tiempo.

Esto también conducirá a una inferencia interesante. Cuando usa un [i] [j] para atravesar datos unidimensionales, su eficiencia se ajusta mucho a un [j] [i]

for (i=0,i++,i<len1)

{

    for (j=0,j++,j<len2)

{

print(a[i][j];

}

}

Es decir, la eficiencia de ejecución del código anterior es mucho mayor que la siguiente,

for (i=0,i++,i<len1)

{

    for (j=0,j++,j<len2)

{

print(a[j][i];

}

}

La razón aquí también es muy simple, porque las filas de la matriz bidimensional se distribuyen continuamente en la memoria, por lo que cuando el código lee a [i] [j], a [i] [j + 1], a [i ] [j + 2] en realidad es probable que la CPU asigne a la caché, pero a [j] [i] y a [j + 1] [i] no son continuos en la memoria, por lo que cuando se lee a [j ] [i] a [j + 1] [i] es poco probable que se lea desde la caché, y debido a que la caché es mucho más rápida que la memoria, provocará un fenómeno tan extraño.

En el entorno de producción real, también ocurrirá un fenómeno similar. Cuando el número de simultaneidad es demasiado alto, la CPU no puede procesar solicitudes de mensajes continuos y se requiere un cambio de contexto continuo para garantizar que cada mensaje se lea primero de la memoria para evitar la red. problemas con la tarjeta Se produjo una excepción de desbordamiento del búfer. Cuando la CPU cambia constantemente de contexto, la reasignación continua de la caché también afectará en gran medida la eficiencia de ejecución de la CPU. Esta es también una de las razones importantes del daño por avalancha del sistema.

 

Lo anterior es el mecanismo subyacente de la avalancha del sistema que he resumido en los últimos años. Por supuesto, si quieres resolver rápidamente el problema de producción, definitivamente es la habilidad de diez minutos en el escenario y diez años de trabajo fuera del escenario. Este artículo explicará primero los problemas del mecanismo relacionados con la CPU. Discutirá el mecanismo subyacente de la administración de la memoria. El próximo plan preliminar es un caso especial específicamente para Redis. También ayuda a CSDN a resolver posibles problemas de Redis. Espero que a través de esta serie de blogs, los lectores puede acumular experiencia rápidamente y ser posible tan pronto como sea posible Un viejo experto que resuelve rápidamente enfermedades intratables.

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/BEYONDMA/article/details/115264503
Recomendado
Clasificación