2010-10-07 1 views
7

Краткая версия: Можно ли читать из десятков или сотен табличных разделов многопоточным способом для увеличения производительности на порядки?Производительность для хранения лазурных таблиц из массивно-параллельного чтения с резьбой

Длинная версия: Мы работаем над системой, которая хранит миллионы строк в хранилище таблиц Azure. Мы делим данные на небольшие разделы, каждая из которых содержит около 500 записей, что представляет собой дневную стоимость данных для единицы.

Поскольку у Azure нет функции «суммы», чтобы вытащить данные за год, мы либо должны использовать некоторое предварительное кэширование, либо суммировать данные сами в сети Azure или рабочей роли.

Предполагая следующее: - Чтение раздела не влияет на производительность другого - Чтение раздела имеет узкое место в зависимости от скорости сети и поиска сервера

Затем мы можем сделать предположение, что, если мы хотим чтобы быстро суммировать много данных «на лету» (1 год, 365 разделов), мы могли бы использовать массивный параллельный алгоритм, и он будет почти идеально масштабироваться по количеству потоков. Например, мы могли бы использовать параллельные расширения .NET с 50 + потоками и получить ОГРОМНОЕ повышение производительности.

Мы работаем над созданием некоторых экспериментов, но я хотел посмотреть, было ли это сделано раньше. Поскольку сторона .NET в основном работает без ожидания при работе с высокой задержкой, это кажется идеальным для многопоточности.

+0

У вас есть комментарий к этому 6 лет спустя? – mayu

+0

Да, это совершенно хорошая идея, тем более, что цели масштабируемости со временем увеличиваются. Взгляните на эту страницу, чтобы понять ограничения: https://docs.microsoft.com/en-us/azure/storage/storage-scalability-targets –

ответ

4

Ограничения на количество транзакций, которые могут быть выполнены против учетной записи хранилища и определенного раздела или сервера хранения за определенный период времени (где-то около 500 рек/с). Таким образом, в этом смысле существует разумное ограничение количества запросов, которые вы могли бы выполнить параллельно (прежде чем он начнет выглядеть как DoS-атака).

Кроме того, в реализации я буду опасаться одновременных ограничений подключения, наложенных на клиента, например, System.Net.ServicePointManager. Я не уверен, что клиент Azure-хранилища подвержен этим ограничениям; они могут потребовать корректировки.

+0

Предел 500 req/s предназначен для каждого раздела. Предел для учетной записи - «несколько тысяч» в секунду. Используя небольшую виртуальную машину, я заметил очень малое улучшение производительности, используя более 20 потоков. – knightpfhor

+1

Обновление до сих пор. В моем тестировании я смог прочитать 365 000 строк, используя 365 потоков, и я получил данные в среднем около 7 секунд. Для 30 000 строк, распределенных по 30 разделам с использованием 30 потоков, я составлял в среднем 1,4 секунды. Огромная победа! –

+2

@JasonYoung вы можете разместить некоторые образцы кода? – Alkasai

Смежные вопросы