2010-10-07 21 views
7

簡版:我們能夠以多線程方式從數十或數百個表分區中讀取數據,以便將性能提高數個數量級嗎?從大規模並行線程讀取的Azure表存儲性能

長版本: 我們正在研究在Azure表存儲中存儲數百萬行的系統。我們將數據劃分爲小分區,每個小分區包含大約500條記錄,代表一個單元的一天數據。

由於Azure沒有「總和」功能,爲了提取一年的數據,我們必須使用一些預緩存,或者在Azure網絡或工作者角色中自行彙總數據。

假設如下: - 讀的分區不會影響其他 性能 - 讀分區具有基於網絡速度和服務器檢索的瓶頸

然後,我們可以採取一個猜測,如果我們想要快速彙總大量數據(1年,365個分區),我們可以使用大規模並行算法,並且它可以幾乎完美地擴展到線程數量。例如,我們可以使用具有50多個線程的.NET並行擴展,並獲得巨大的性能提升。

我們正在設置一些實驗,但我想知道這是否已經完成。由於.NET端基本上處於等待高延遲操作的空閒狀態,這對於多線程來說似乎非常完美。

+0

這6年後你有任何評論? – mayu 2017-01-03 05:32:13

+0

是的,這完全是一個好主意,尤其是隨着時間的推移,可擴展性目標不斷提高。看看這個頁面瞭解的限制:https://docs.microsoft.com/en-us/azure/storage/storage-scalability-targets – 2017-01-03 21:15:37

回答

4

對於給定時間段內(某處大約500請求/秒)的存儲帳戶和特定分區或存儲服務器可執行的事務處理數量是有限制的。因此,從這個意義上說,對於可以並行執行的請求的數量有一個合理的限制(在它看起來像DoS攻擊之前)。

此外,在實施中,我會警惕對客戶端施加的併發連接限制,例如System.Net.ServicePointManager。我不確定Azure存儲客戶端是否受到這些限制;他們可能需要調整。

+0

500 req/s的限制是每個分區。每個帳戶的限額是「幾千」每秒。使用一個小型虛擬機,我注意到使用超過20個線程的性能改善很小。 – knightpfhor 2010-10-07 03:39:33

+1

更新到目前爲止 - 在我的測試中,我能夠通過使用365個線程讀取365,000行,並且我平均獲得了大約7秒的數據。對於使用30個線程的30,000個分區的30,000行,我平均爲1.4秒。巨大的勝利! – 2010-10-10 03:21:09

+2

@JasonYoung你可以發佈一些代碼示例嗎? – Alkasai 2014-09-24 13:46:33