2010-10-07 10 views
7

Versión corta: ¿Podemos leer docenas o cientos de particiones de tablas de múltiples hilos para aumentar el rendimiento en órdenes de magnitud?Rendimiento de almacenamiento de tablas Azure a partir de lectura paralela masiva paralela

Versión larga: Estamos trabajando en un sistema que almacena millones de filas en el almacenamiento de tablas Azure. Particionamos los datos en particiones pequeñas, cada una contiene alrededor de 500 registros, lo que representa un día de datos para una unidad.

Dado que Azure no tiene una función de "suma", para extraer datos de un año, o bien tenemos que usar algo de precaching, o sumar los datos en una red Azure o rol de trabajador.

Suponiendo lo siguiente: - Lectura de una partición no afecta al rendimiento de otro - Lectura de una partición tiene un cuello de botella en base a la velocidad de la red y la recuperación del servidor

Entonces podemos tomar una conjetura que si queríamos para sumar rápidamente una gran cantidad de datos sobre la marcha (1 año, 365 particiones), podríamos usar un algoritmo masivamente paralelo y se escalaría casi perfectamente a la cantidad de hilos. Por ejemplo, podríamos usar las extensiones paralelas de .NET con más de 50 hilos y obtener un ENORME aumento de rendimiento.

Estamos trabajando en la configuración de algunos experimentos, pero quería ver si esto se ha hecho antes. Como el lado .NET está básicamente inactivo en espera en operaciones de alta latencia, esto parece perfecto para multi-threading.

+0

¿Tiene algún comentario para esto 6 años después? – mayu

+0

Sí, es una buena idea, especialmente porque los objetivos de escalabilidad han ido aumentando con el tiempo. Eche un vistazo a esta página para comprender los límites: https://docs.microsoft.com/en-us/azure/storage/storage-scalability-targets –

Respuesta

4

Existen límites impuestos a la cantidad de transacciones que se pueden realizar contra una cuenta de almacenamiento y una partición o servidor de almacenamiento en particular en un período de tiempo determinado (alrededor de 500 req/s). Entonces, en ese sentido, existe un límite razonable para la cantidad de solicitudes que puede ejecutar en paralelo (antes de que empiece a parecer un ataque DoS).

Además, en la implementación, desconfiaría de los límites de conexión simultáneos impuestos al cliente, como por System.Net.ServicePointManager. No estoy seguro de si el cliente de almacenamiento de Azure está sujeto a esos límites; pueden requerir un ajuste.

+0

El límite de 500 req/s es para cada partición. El límite para una cuenta es "algunos miles" por segundo. Usando una VM pequeña, noté muy poca mejora en el rendimiento con más de 20 subprocesos. – knightpfhor

+1

Actualización hasta ahora: en mis pruebas, pude leer 365,000 filas al usar 365 hilos, y obtuve los datos en un promedio de aproximadamente 7 segundos. Para 30,000 filas repartidas en 30 particiones con 30 hilos, tenía un promedio de 1,4 segundos. Gran victoria! –

+2

@JasonYoung ¿puedes publicar algunas muestras de código? – Alkasai