2010-10-07 5 views
7

Kurzversion: Können wir in mehreren Threads von Dutzenden oder Hunderten von Tabellenpartitionen lesen, um die Leistung um Größenordnungen zu steigern?Azure-Tabellenspeicherleistung von massiv parallelen Threading-Leseoperationen

Lange Version: Wir arbeiten an einem System, das Millionen von Zeilen im Azure-Tabellenspeicher speichert. Wir teilen die Daten in kleine Partitionen auf, von denen jede etwa 500 Datensätze enthält, die Daten eines Tages für eine Einheit darstellen.

Da Azure kein "Summen" -Feature hat, um ein Jahr Daten zu ziehen, müssen wir entweder ein Pre-Caching verwenden oder die Daten selbst in einer Azure-Web- oder Worker-Rolle summieren.

Unter der Annahme, die folgenden: - eine Partition Lese hat keinen Einfluss auf die Leistung eines anderen - eine Partition Lese hat ein Engpass basierend auf Netzwerkgeschwindigkeit und Serverabfrage

Wir können dann, dass eine Vermutung nehmen, wenn wir wollten, Um schnell eine Menge Daten schnell zu summieren (1 Jahr, 365 Partitionen), könnten wir einen massiv parallelen Algorithmus verwenden und er würde nahezu perfekt auf die Anzahl der Threads skalieren. Zum Beispiel könnten wir die parallelen .NET-Erweiterungen mit mehr als 50 Threads verwenden und einen GROSSEN Leistungsschub erhalten.

Wir arbeiten an der Einrichtung einiger Experimente, aber ich wollte sehen, ob dies schon einmal gemacht wurde. Da die .NET-Seite im Grunde im Leerlauf ist und auf Operationen mit hoher Latenz wartet, scheint dies perfekt für Multithreading zu sein.

+0

Haben Sie 6 Jahre später einen Kommentar dazu? – mayu

+0

Ja, das ist eine gute Idee, besonders seit die Skalierbarkeitsziele im Laufe der Zeit gestiegen sind. Werfen Sie einen Blick auf diese Seite, um die Grenzen zu verstehen: https://docs.microsoft.com/en-us/azure/storage/storage-scalability-targets –

Antwort

4

Die Anzahl der Transaktionen, die in einem bestimmten Zeitraum (ca. 500 req/s) für ein Speicherkonto und eine bestimmte Partition oder einen bestimmten Speicherserver ausgeführt werden können, ist begrenzt. In diesem Sinne gibt es eine vernünftige Grenze für die Anzahl der Anfragen, die Sie parallel ausführen könnten (bevor es wie ein DoS-Angriff aussieht).

Auch in der Implementierung würde ich vorsichtig sein, die gleichzeitige Verbindung Grenzen auf dem Client auferlegt, wie durch System.Net.ServicePointManager. Ich bin mir nicht sicher, ob der Azure-Speicherclient diesen Beschränkungen unterliegt. Sie müssen möglicherweise angepasst werden.

+0

Die Grenze von 500 Req/s ist für jede Partition. Die Grenze für ein Konto ist "ein paar tausend" pro Sekunde. Bei Verwendung einer kleinen VM habe ich mit mehr als 20 Threads nur eine geringe Leistungsverbesserung festgestellt. – knightpfhor

+1

Update bisher - In meinen Tests konnte ich 365.000 Zeilen mit 365 Threads lesen, und ich habe die Daten im Durchschnitt etwa 7 Sekunden. Für 30.000 Zeilen, verteilt auf 30 Partitionen mit 30 Threads, betrug ich durchschnittlich 1,4 Sekunden. Großer Gewinn! –

+2

@JasonYoung können Sie einige Codebeispiele posten? – Alkasai

Verwandte Themen