Algunos sistemas Linux se vuelven muy lentos cuando Redis está cargando un gran conjunto de datos

14

Recibí un informe de un usuario de Redis, y no estoy seguro de qué responder ya que no soy un experto en el área de Linux y su programador, sin embargo, nosotros (como el proyecto Redis) tenemos que resolver este tipo de problemas especialmente En el futuro, como con Redis Cluster, tendremos muchas instancias de Redis ejecutándose al mismo tiempo en un solo cuadro. Entonces estoy pidiendo ayuda aquí.

Problema:

  • Kernel: "Linux redis1 2.6.32-305-ec2 # 9-Ubuntu SMP jue 15 abr 08:05:38 UTC 2010 x86_64 GNU / Linux"
  • abundante RAM libre, ningún otro proceso realiza E / S significativas.
  • Importante , ejecutarse en una gran instancia EC2, no en un servidor real. Nunca vi algo así en un entorno no virtualizado. La instancia de EC2 fue: "Instancia extragrande de memoria alta 17.1 GB de memoria, 6.5 ECU (2 núcleos virtuales con 3.25 unidades de cómputo EC2 cada uno), 420 GB de almacenamiento de instancia local, plataforma de 64 bits" .

Básicamente, una vez que reinicia una gran instancia de Redis, el sistema se volverá tan lento que ya no podrá escribir en el shell. Cuando Redis carga una instancia, usa el 100% de la CPU (carga los datos lo más rápido posible) y lee el archivo dump.rdb secuencialmente. La E / S no es particularmente alta ya que la carga está vinculada a la CPU, no a la E / S.

¿Por qué demonios una caja con dos CPU y mucha RAM, sin elementos intercambiados en el disco, básicamente debería dejar de funcionar con esta carga de trabajo?

Tengo la impresión de que esto tiene mucho que ver con el hecho de que es una instancia de EC2, por lo que está relacionada con la tecnología de virtualización utilizada, ya que cargo todas las veces conjuntos de datos Redis de 24 GB en mi caja sin ningún problema (incluso con otras instancias de Redis corriendo con alta carga).

Gracias por cualquier pista!

Salvatore

Editar : agregando algunos comentarios que recibí de Twitter:

de @ezmobius: @antirez lo primero que debe hacer es probarlo desde / mnt o las unidades efímeras locales para ver si tiene escasez de EBS, el segundo es asegurarse de que no sea la "primera penalización de escritura" (google) y si es así primero necesita dd 0 en el disco.

de @dvirsky: @antirez Estoy ejecutando muchas instancias de redis en exactamente tales nodos ec2. He notado cierta desaceleración en bgsave pero no este fenómeno.

antirez
fuente

Respuestas:

4

El resultado de 'top' podría arrojar algunas pistas. Hay un campo cerca de la esquina superior izquierda llamado '% robado' que refleja la cantidad de CPU de hardware desviada a otros invitados en la misma caja física. He visto este tipo de ralentizaciones cuando el hipervisor decide asignar más CPU a otro invitado, especialmente cuando estoy realizando una tarea intensiva de CPU de larga ejecución.

No estoy seguro si ese es tu problema o no, pero vale la pena verificarlo.

Kevin Smith
fuente
Gracias Kevin, esto es muy interesante y no estaba al tanto de esto.
antirez
2

He tenido el mismo problema en una instancia EC2. Probablemente no esté relacionado con Redis: ocurre cuando hay un IO alto (p. Ej., Cuando redis está cargando un archivo de volcado).

Eche un vistazo a este hilo en los foros de Amazon: https://forums.aws.amazon.com/thread.jspa?messageID=215406

He experimentado con diferentes núcleos / imágenes y ahora funciona bien (en un antiguo núcleo 2.6.21).

Marek
fuente
Gracias mhdk, creo que también está relacionado con la virtualización + el planificador de Linux. Incluso con E / S de disco lento, no puedo ver ninguna razón por la cual otros procesos se bloquearían si no están utilizando el disco y no tienen páginas intercambiadas. Probablemente valga la pena probar diferentes núcleos / configuraciones de planificador.
antirez
2

Debe verificar el robo de la CPU ( xx.x%sten el lado derecho de la línea de la CPU) que se topmuestra cuando experimenta la carga del 100% y el shell congelado. Steal representa la cantidad de sus ciclos de CPU reales robados de su máquina por un hipervisor y entregados a otra máquina. El robo de CPU solo es relevante en entornos virtualizados. Tuve ese problema exacto con micro instancias y que básicamente hizo que mi instancia fuera inutilizable durante aproximadamente 1 hora más o menos (hasta que mi tarea terminara ofc) si hacía tareas intensivas de CPU.

Puede encontrar más información sobre este tema leyendo esta publicación en Greg's Ramblings . Aunque si tomas la palabra de Greg, esto debería estar sucediendo solo en micro instancias.

Shinnok
fuente