Ответ 1
Как и у вас, у меня было много проблем с производительностью с блочными блоками, хотя они и не были такими серьезными. Похоже, вы сделали домашнее задание, и я вижу, что вы делаете все по книге.
Несколько вещей, чтобы проверить:
- Убедитесь, что ваша виртуальная машина не подкачивается (вы можете проверить удаленный рабочий стол). Например, сверхмалая виртуальная память объемом 768 МБ действительно слишком мала для любого практического использования, если вы спросите меня.
- Установите собственные ограничения на подключение, особенно если вы используете небольшие виртуальные машины.
ServicePointManager.DefaultConnectionLimit
. - Увеличенные страницы увеличат производительность.
- Пишите в несколько потоков (например, используйте
Task
/async
/await
, особенно если у вас есть много дел).
О, и еще одна вещь:
- Не используйте эмулятор для такого рода вещей. Эмулятор не является хорошим представлением о реальном Лазуре, и, конечно же, о нем. тесты.
Основная причина, по которой вы получаете доступ, медленна, потому что вы делаете все синхронно. Тесты на microsoft доступ к блокам в нескольких потоках, что даст большую пропускную способность.
Теперь Azure также знает, что производительность является проблемой, поэтому они попытались смягчить проблему, поддерживая хранение с помощью локального кэширования. Что в основном происходит здесь, так это то, что они пишут локальные данные (f.ex. в файле), затем разбивают задачи на части, а затем используют несколько потоков для записи всего в хранилище blob. Библиотека хранения данных - одна из таких библиотек. Однако при их использовании вы всегда должны иметь в виду, что у них разные ограничения долговечности (например, включение "кэширования записи" на ваш локальный ПК) и может нарушить способ настройки вашей распределенной системы (если вы читаете и пишете то же самое хранилище от нескольких виртуальных машин).
Почему...
Вы попросили "почему". Чтобы понять, почему хранилище памяти медленное, вам нужно понять, как это работает. Сначала я хотел бы отметить, что эта презентация от Microsoft Azure, которая объясняет, как работает хранилище Azure.
Первое, что вы должны понимать, это то, что хранилище Azure поддерживается распределенным набором (вращающихся) дисков. Из-за ограничений долговечности и согласованности они также обеспечивают, чтобы "большинство голосов" записывалось в стабильное хранилище. Для производительности несколько уровней системы будут иметь кеши, которые будут в основном читать кеши (опять же из-за ограничений долговечности).
Теперь команда Azure не публикует все. К счастью для меня, 5 лет назад моя предыдущая компания создала подобную систему в меньших масштабах. У нас были подобные проблемы с производительностью, такие как Azure, и система была очень похожа на презентацию, которую я связал выше. Как таковой, я думаю, что могу объяснить и немного рассказать о том, где узкие места. Для ясности я буду отмечать разделы как предположения, где я думаю, что это подходит.
Если вы пишете страницу в хранилище blob, вы фактически настраиваете серию соединений TCP/IP, храните страницу в нескольких местах, и когда принимается большинство голосов, вы даете "хорошо" клиенту. Теперь в этой системе есть несколько узких мест:
- Вам потребуется настроить серию TCP/IP-соединений по всей инфраструктуре. Настройка их будет стоить времени.
- Конечным точкам хранилища будет необходимо выполнить поиск диска в нужном месте и выполнить операцию.
- Георепликация, конечно, займет больше времени, чем локальная репликация.
- [спекулировать] Мы также обнаружили, что много времени было потрачено во время фазы буферизации.
Число (1), (2) и (3) здесь достаточно хорошо известно. Число (4) здесь фактически является результатом (1) и (2). Обратите внимание: вы не можете просто бросить бесконечное количество запросов на вращающиеся диски; ну... на самом деле вы можете, но тогда система придет к остановке. Таким образом, для того, чтобы решить эту проблему, диск ищет от разных клиентов, как правило, планируются таким образом, что вы ищете только, если знаете, что можете писать все (чтобы минимизировать дорогостоящие поиски). Однако здесь есть проблема: если вы хотите повысить пропускную способность, вам нужно начать поиск, прежде чем у вас есть все данные, - и если вы не получите данные достаточно быстро, другие запросы должны ждать дольше. Здесь также лежит дилемма: вы можете либо оптимизировать для этого (иногда это может повредить пропускную способность каждого клиента и останавливать всех остальных, особенно со смешанными рабочими нагрузками) или буферизировать все, а затем искать и писать все сразу (это проще, но добавляет некоторые латентность для всех). Из-за огромного количества клиентов, с которыми работает Azure, я подозреваю, что они выбрали последний подход, который добавляет больше латентности в полный цикл записи.
Независимо от этого, большая часть времени, вероятно, будет потрачена на (1) и (2). Фактические пакеты данных и записи данных являются довольно быстрыми. Чтобы дать вам приблизительную оценку: вот некоторые часто используемые тайминги.
Итак, это оставляет нам один вопрос: зачем писать материал в нескольких потоках гораздо быстрее?
Причина этого на самом деле очень проста: если мы пишем материал в нескольких потоках, есть большая вероятность, что мы храним фактические данные на разных серверах. Это означает, что мы можем перенести наше узкое место с "ожидания поиска и ожидания установки сети" на "пропускную способность". И пока наша клиентская VM может справиться с этим, очень вероятно, что инфраструктура также сможет справиться с этим.