【Redis】Hablando sobre los motivos de la ralentización de Redis y las soluciones de solución de problemas

        Este artículo le brinda conocimientos relevantes sobre Redis . Presenta principalmente las razones de la ralentización de Redis y los métodos de solución de problemas. El código de muestra se presenta con gran detalle en este artículo, que tiene un cierto valor de aprendizaje de referencia para el estudio o el trabajo de todos. Echemos un vistazo juntos, espero que sea útil para todos.

Causa 1: la memoria de la instancia alcanza el límite superior

Solucionar problemas de ideas

        Si su instancia de Redis establece el límite superior de memoria maxmemory, también puede hacer que Redis se ralentice.

        Cuando usamos Redis como un caché puro, generalmente establecemos un límite superior de memoria maxmemory para esta instancia y luego establecemos una estrategia de eliminación de datos. Y cuando la memoria de la instancia alcanza maxmemory, es posible que cada vez que se escriban nuevos datos, el retraso de la operación sea mayor.

causa de la desaceleración

        Cuando la memoria de Redis alcanza maxmemory, antes de escribir nuevos datos cada vez, Redis primero debe eliminar algunos datos de la instancia, de modo que la memoria de toda la instancia permanezca por debajo de maxmemory, y luego se pueden escribir nuevos datos.

        La lógica de eliminar datos antiguos también lleva tiempo, y la duración específica del tiempo depende de la estrategia de eliminación que configure:

  • allkeys-lru: independientemente de si la clave está configurada para caducar, elimine la clave a la que se accedió menos recientemente
  • volatile-lru: solo elimine la clave a la que se accedió menos recientemente con un tiempo de caducidad establecido
  • allkeys-random: independientemente de si la clave está configurada para caducar, la clave se elimina aleatoriamente
  • volátil-aleatorio: solo elimina aleatoriamente las claves con un tiempo de caducidad establecido
  • allkeys-ttl: independientemente de si la clave está configurada para caducar, elimine la clave que está a punto de caducar
  • noeviction: no elimine ninguna clave, después de que la memoria de la instancia alcance maxmeory, escriba nuevos datos y devuelva un error directamente
  • allkeys-lfu: independientemente de si la clave está configurada para caducar, elimine la clave con la frecuencia de acceso más baja (compatible con la versión 4.0+)
  • volatile-lfu: elimine solo la clave con la frecuencia de acceso más baja y establezca un tiempo de caducidad (compatible con la versión 4.0+)

        La estrategia a utilizar depende del escenario empresarial específico. Generalmente, la estrategia de eliminación allkeys-lru / volatile-lru es la más utilizada, su lógica de procesamiento es tomar aleatoriamente un lote de claves de la instancia cada vez (el número es configurable), y luego eliminar una clave con el menor acceso, y luego elimine el resto. La siguiente clave se almacena temporalmente en un grupo, y se selecciona aleatoriamente un lote de claves, en comparación con las claves en el grupo anterior, y se elimina una clave con el menor acceso. Repita esto hasta que la memoria de la instancia caiga por debajo de maxmemory.

        Cabe señalar que la lógica de eliminación de datos de redis es la misma que la de borrar claves caducadas, y además se ejecuta antes de que se ejecute realmente el comando, es decir, también aumentará el retraso de nuestra operación Redis, y cuanto mayor sea el OPS de escritura, el retraso también aumentará.

        Además, si bigkey todavía está almacenado en su instancia de Redis en este momento, llevará mucho tiempo eliminar y eliminar bigkey para liberar memoria.

        ¿Lo viste? Los peligros de bigkey están en todas partes, por lo que le recordé que trate de no almacenar bigkey.

solución

  • Evite almacenar bigkeys y reduzca el tiempo que lleva liberar memoria
  • La estrategia de eliminación se cambia a eliminación aleatoria, que es mucho más rápida que LRU (ajustada según las condiciones comerciales)
  • Divida la instancia y distribuya la presión de la eliminación de claves a múltiples instancias
  • Si está utilizando Redis 4.0 o superior, habilite el mecanismo layz-free y coloque la operación de eliminación de claves para liberar memoria en un subproceso en segundo plano (configure lazyfree-lazy-eviction = yes)

Motivo 2: las páginas de memoria grandes están habilitadas

Solucionar problemas de ideas

  • Todos sabemos que cuando las aplicaciones solicitan memoria del sistema operativo, solicitan páginas de memoria y el tamaño de página de memoria convencional es de 4 KB.
  • A partir de 2.6.38, el kernel de Linux admite el mecanismo de página enorme de memoria, que permite que las aplicaciones soliciten memoria del sistema operativo en unidades de 2 MB.
  • La unidad de memoria que la aplicación aplica al sistema operativo cada vez se vuelve más grande, pero esto también significa que se tarda más en aplicar para la memoria.

causa de la desaceleración

  • Cuando Redis está ejecutando la reescritura de RDB y AOF en segundo plano, utiliza un subproceso de bifurcación para manejarlo. Sin embargo, después de que el proceso principal bifurca el proceso secundario, el proceso principal aún puede recibir solicitudes de escritura en este momento, y las solicitudes de escritura entrantes utilizarán el método Copy On Write (copia en escritura) para operar los datos de la memoria.
  • Es decir, una vez que el proceso principal tiene datos que deben modificarse, Redis no modificará directamente los datos en la memoria existente, sino que primero copiará los datos en la memoria y luego modificará los datos en la nueva memoria. en escritura".
  • La copia en escritura también se puede entender como quién necesita escribir, quién necesita copiar primero y luego modificar.
  • La ventaja de esto es que cualquier operación de escritura realizada por el proceso principal no afectará la persistencia de los datos del proceso secundario (el proceso secundario solo conserva todos los datos en la instancia completa en el momento de la bifurcación y no se preocupa por los nuevos cambios de datos). , porque el proceso secundario solo necesita una instantánea de la memoria, que luego se conserva en el disco).
  • Pero tenga en cuenta que cuando el proceso principal está copiando datos de memoria, esta etapa implica la aplicación de nueva memoria. Si el sistema operativo abre la página de memoria grande en este momento, durante este período, incluso si el cliente solo modifica 10B de datos, Se aplicará Redis La memoria también se aplicará al sistema operativo en unidades de 2 MB, lo que llevará más tiempo para solicitar memoria, lo que aumentará el retraso de cada solicitud de escritura y afectará el rendimiento de Redis.
  • De manera similar, si la solicitud de escritura opera en una llave grande, cuando el proceso principal copia el bloque de memoria de la llave grande, la memoria solicitada en un momento será mayor y el tiempo será mayor. Se puede ver que bigkey afecta el rendimiento nuevamente aquí.

solución

Deshabilite el mecanismo de página enorme de memoria.

Primero, debe verificar si la máquina Redis ha habilitado páginas grandes:

$ cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

Si la opción de salida es siempre, significa que el mecanismo de página enorme de memoria está habilitado actualmente y debemos desactivarlo:

$ echo never > /sys/kernel/mm/transparent_hugepage/enabled

        De hecho, la ventaja del mecanismo de página enorme de memoria proporcionado por el sistema operativo es que puede reducir el número de aplicaciones de memoria hasta cierto punto.

        Pero para Redis, una base de datos que es extremadamente sensible al rendimiento y la latencia, esperamos que Redis tarde el menor tiempo posible cada vez que solicita memoria, por lo que no recomiendo habilitar este mecanismo en la máquina Redis.

Razón 3: usar el intercambio

Solucionar problemas de ideas

        Si descubre que Redis de repente se vuelve muy lento y cada operación toma cientos de milisegundos o incluso segundos, entonces debe verificar si Redis usa Swap En este caso, Redis básicamente no puede proporcionar un servicio de alto rendimiento también.

causa de la desaceleración

¿Qué es el intercambio? ¿Por qué el uso de Swap hace que disminuya el rendimiento de Redis?

        Si tiene algún conocimiento sobre el sistema operativo, sabrá que para aliviar el impacto de la memoria insuficiente en la aplicación, el sistema operativo permite que una parte de los datos en la memoria se intercambien al disco para lograr el almacenamiento en búfer de la memoria utilizada por la aplicación Estos datos de memoria se intercambian Al área del disco, es Intercambiar.

        El problema es que cuando los datos de la memoria se intercambian en el disco, cuando Redis vuelve a acceder a los datos, necesita leerlos del disco. ¡La velocidad de acceso al disco es cientos de veces más lenta que la de acceso a la memoria! Especialmente para una base de datos como Redis, que tiene requisitos de rendimiento extremadamente altos y es extremadamente sensible al rendimiento, este retraso en la operación es inaceptable.

        En este punto, debe verificar el uso de memoria de la máquina Redis para confirmar si se usa Swap. Puede verificar si el proceso de Redis usa Swap de las siguientes maneras:

# 先找到 Redis 的进程 ID
$ ps -aux | grep redis-server
 
# 查看 Redis Swap 使用情况
$ cat /proc/$pid/smaps | egrep '^(Swap|Size)'

La salida es la siguiente

Tamaño: 1256 kB
Intercambio: 0 kB
Tamaño: 4 kB
Intercambio : 0 kB
Tamaño: 132 kB Intercambio: 0 kB Tamaño: 63488 kB Intercambio: 0 kB Tamaño: 132 kB Intercambio: 0 kB Tamaño: 65404 kB Intercambio: 0 kB Tamaño: 1921024 kB Intercambio: 0 kB ...









Este resultado enumerará el uso de memoria del proceso de Redis.

        El tamaño en cada fila indica el tamaño de una pieza de memoria utilizada por Redis, y Swap debajo de Size indica la cantidad de datos que se han intercambiado en el disco para esta memoria de tamaño de tamaño. Si los dos valores son iguales, significa que el Los datos en esta parte de la memoria han sido intercambiados. Completamente intercambiados al disco.

        Si solo se intercambia una pequeña cantidad de datos en el disco, por ejemplo, cada pieza de intercambio representa una pequeña proporción del tamaño correspondiente, el impacto no es grande. Si se intercambian cientos de megabytes o incluso gigabytes de memoria en el disco, entonces debe estar atento, en este caso, el rendimiento de Redis definitivamente caerá drásticamente.

solución

  • Aumente la memoria de la máquina para que Redis tenga suficiente memoria para usar
  • Organice el espacio de la memoria, libere suficiente memoria para que la use Redis y luego libere el Intercambio de Redis, para que Redis pueda reutilizar la memoria.

        El proceso de liberación del intercambio de Redis generalmente necesita reiniciar la instancia.Para evitar el impacto de reiniciar la instancia en el negocio, el cambio maestro-esclavo generalmente se realiza primero y luego se libera el intercambio del antiguo nodo maestro. , y se reinicia la instancia del nodo maestro anterior. Realice el cambio maestro-esclavo.

        Se puede ver que cuando Redis usa Swap, el rendimiento de Redis en este momento básicamente no puede cumplir con los requisitos de alto rendimiento (puede comprender que las artes marciales están abolidas), por lo que también debe prevenir esta situación con anticipación.

        El método preventivo es que necesita monitorear la memoria y el uso de Swap de la máquina Redis, alarmar cuando la memoria es insuficiente o usar Swap, y tratarlo a tiempo.

Motivo 4: sobrecarga del ancho de banda de la red 

Solucionar problemas de ideas

        Si ha evitado los escenarios anteriores que causaron problemas de rendimiento y Redis se ha estado ejecutando de manera estable durante mucho tiempo, pero después de un cierto punto en el tiempo, la operación de Redis repentinamente comienza a ralentizarse y continúa todo el tiempo. ¿él?

        En este momento, debe verificar si el ancho de banda de la red de la máquina Redis está sobrecargado y si existe una situación en la que una instancia ocupa el ancho de banda de la red de toda la máquina.

causa de la desaceleración

Cuando el ancho de banda de la red está sobrecargado, el servidor experimentará un retraso en la transmisión de paquetes y pérdida de paquetes en la capa TCP y la capa de red.

        Además de la memoria operativa, el alto rendimiento de Redis radica en la E/S de la red. Si hay un cuello de botella en la E/S de la red, también afectará gravemente el rendimiento de Redis.

solución

  • Confirmar a tiempo que la instancia de Redis ocupe todo el ancho de banda de la red, si pertenece al acceso comercial normal, es necesario expandir o migrar la instancia a tiempo para no afectar otras instancias de esta máquina por exceso de tráfico de esta instancia.
  • A nivel de operación y mantenimiento, debe aumentar el monitoreo de varios indicadores de la máquina Redis, incluido el tráfico de la red, y alarmar con anticipación cuando el tráfico de la red alcanza un cierto umbral, para confirmar y expandir en el tiempo.

Razón 5: Otras razones

1) Conexiones cortas frecuentes

Su aplicación comercial debe usar conexiones largas para operar Redis para evitar conexiones cortas frecuentes.

        Las conexiones cortas frecuentes harán que Redis dedique mucho tiempo al establecimiento y la liberación de la conexión, y el protocolo de enlace de tres vías y el protocolo de enlace de cuatro vías de TCP también aumentarán la demora de acceso.

2) Monitoreo de operación y mantenimiento

También mencioné anteriormente que para poder predecir la ralentización de Redis con anticipación, es fundamental hacer un buen trabajo en un monitoreo perfecto.

        De hecho, el monitoreo consiste en recopilar varios indicadores de tiempo de ejecución de Redis. El método habitual es que el programa de monitoreo recopile información de Redis INFO regularmente y luego realice una visualización de datos y una alarma de acuerdo con los datos de estado en la información INFO.

        Lo que necesito recordarle aquí es que no debe tomarlo a la ligera al escribir algunos scripts de monitoreo o al usar componentes de monitoreo de código abierto.

        Al escribir secuencias de comandos de supervisión para acceder a Redis, intente utilizar conexiones largas para recopilar información de estado y evitar conexiones cortas frecuentes. Al mismo tiempo, también debe prestar atención a controlar la frecuencia de acceso a Redis para evitar afectar las solicitudes comerciales.

        Al usar algunos componentes de monitoreo de código abierto, es mejor comprender los principios de implementación de estos componentes y configurarlos correctamente para evitar errores en los componentes de monitoreo, lo que genera una gran cantidad de operaciones a corto plazo en Redis y afecta el rendimiento de Redis.

        Nos sucedió en ese momento que cuando el DBA usaba algunos componentes de código abierto, debido a problemas de configuración y uso, el programa de monitoreo se establecía y desconectaba con frecuencia de Redis, lo que resultaba en una respuesta lenta de Redis.

3) Otros programas compiten por los recursos

        Lo último que quiero recordarte es que tu máquina Redis debe estar dedicada y solo debe usarse para implementar instancias de Redis, no implementar otras aplicaciones, tratar de proporcionar un entorno relativamente "silencioso" para Redis y evitar que otros programas ocupen la CPU. memoria y recursos de disco, lo que resulta en recursos insuficientes asignados a Redis y se ve afectado.

Resumir:

Los siguientes puntos hacen que Redis disminuya la velocidad:

  • Límite de memoria de instancia alcanzado
  • Habilitar páginas enormes
  • Intercambio abierto
  • sobrecarga del ancho de banda de la red
  • otras razones

Supongo que te gusta

Origin blog.csdn.net/gongzi_9/article/details/127004980
Recomendado
Clasificación