2010-10-07 3 views
7

Version courte: Peut-on lire des dizaines ou des centaines de partitions de table de manière multithread pour augmenter les performances de plusieurs ordres de grandeur?Azure Performances du stockage de table à partir de la lecture filaire massivement parallèle

Version longue: Nous travaillons sur un système qui stocke des millions de lignes dans le stockage de table Azure. Nous partitionnons les données en petites partitions, chacune contenant environ 500 enregistrements, ce qui représente un jour de données pour une unité. Comme Azure n'a pas de fonction "somme", pour extraire une année de données, nous devons soit utiliser une pré-mise en cache, soit additionner nous-mêmes les données dans un rôle Web ou de travail Azure.

En supposant que les éléments suivants: - La lecture d'une partition n'affecte pas les performances d'un autre - La lecture d'une partition a un goulot d'étranglement en fonction de la vitesse du réseau et la récupération du serveur

On peut alors faire une supposition que si nous voulions Pour additionner rapidement un grand nombre de données à la volée (1 an, 365 partitions), nous pourrions utiliser un algorithme massivement parallèle et il s'agirait presque parfaitement du nombre de threads. Par exemple, nous pourrions utiliser les extensions parallèles .NET avec plus de 50 threads et obtenir une augmentation de performance énorme.

Nous travaillons sur la mise en place de certaines expériences, mais je voulais voir si cela a déjà été fait. Puisque le côté .NET est essentiellement inactif en attente d'opérations à latence élevée, cela semble parfait pour le multi-threading.

+0

Avez-vous des commentaires pour cette 6 années plus tard? – mayu

+0

Oui, c'est une bonne idée, d'autant plus que les objectifs d'évolutivité ont augmenté au fil du temps. Jetez un oeil à cette page pour comprendre les limites: https://docs.microsoft.com/en-us/azure/storage/storage-scalability-targets –

Répondre

4

Le nombre de transactions pouvant être effectuées sur un compte de stockage et sur une partition ou un serveur de stockage particulier pendant une période donnée (environ 500 req/s) est limité. Donc, dans ce sens, il y a une limite raisonnable au nombre de requêtes que vous pourriez exécuter en parallèle (avant que cela commence à ressembler à une attaque DoS).

En outre, lors de la mise en œuvre, je me méfierais des limites de connexion simultanées imposées au client, comme par exemple System.Net.ServicePointManager. Je ne suis pas sûr si le client de stockage Azure est soumis à ces limites; ils pourraient nécessiter un ajustement.

+0

La limite de 500 req/s est pour par partition. La limite pour un compte est "quelques milliers" par seconde. En utilisant une petite VM, j'ai remarqué très peu d'amélioration des performances en utilisant plus de 20 threads. – knightpfhor

+1

Mise à jour jusqu'à présent - Dans mes tests, j'ai été capable de lire 365 000 lignes en utilisant 365 threads, et j'ai obtenu les données en moyenne environ 7 secondes. Pour 30 000 lignes réparties sur 30 partitions utilisant 30 threads, j'étais en moyenne 1,4 secondes. Énorme victoire! –

+2

@JasonYoung pouvez-vous poster des échantillons de code? – Alkasai

Questions connexes