Azure Storage Queue очень медленно от рабочей роли в облаке, но не от моей машины - PullRequest
3 голосов
/ 27 апреля 2011

Я провожу очень простой тест с очередями, указывающими на реальное хранилище Azure, и, не знаю, почему, выполнить тест с моего компьютера гораздо быстрее, чем развернуть рабочую роль в Azure и выполнить ее там.Я не использую Dev Storage при локальном тестировании, мой .cscfg имеет строку подключения к реальному хранилищу.

Учетная запись хранения и роли находятся в одной группе соответствия.

Тест - это веб-роль и рабочая роль.Страница сообщает работнику, какой тест нужно выполнить, работник делает это и возвращает затраченное время.Этот конкретный тест показывает, сколько времени занимает получение 1000 сообщений из очереди Azure, используя пакеты из 32 сообщений.Во-первых, я тестирую запуск отладки с VS, после того как я разверну приложение в Azure и запусту его оттуда.

Результаты:

  • С моего компьютера: 34805,6495 мс.
  • Из роли Azure: 7956828.2851 мс.

Это может означать, что быстрее получать доступ к очередям извне Azure, чем изнутри, и это не имеет смысла.

IЯ тестирую так:

    private TestResult InQueueScopeDo(String test, Guid id, Int64 itemCount)
    {
        CloudStorageAccount account = CloudStorageAccount.Parse(_connectionString);
        CloudQueueClient client = account.CreateCloudQueueClient();
        CloudQueue queue = client.GetQueueReference(Guid.NewGuid().ToString());

        try
        {
            queue.Create();
            PreTestExecute(itemCount, queue);

            List<Int64> times = new List<Int64>();
            Stopwatch sw = new Stopwatch();
            for (Int64 i = 0; i < itemCount; i++)
            {
                sw.Start();
                Boolean valid = ItemTest(i, itemCount, queue);
                sw.Stop();
                if (valid)
                    times.Add(sw.ElapsedTicks);
                sw.Reset();
            }

            return new TestResult(id, test + " with " + itemCount.ToString() + " elements", TimeSpan.FromTicks(times.Min()).TotalMilliseconds,
                                                 TimeSpan.FromTicks(times.Max()).TotalMilliseconds,
                                                 TimeSpan.FromTicks((Int64)Math.Round(times.Average())).TotalMilliseconds);
        }
        finally
        {
            queue.Delete();
        }

        return null;
    }

PreTestExecute помещает 1000 элементов в очередь с 2048 байтами каждый.

И это то, что происходит в методе ItemTest для этогоtest:

    Boolean done = false;
    public override bool ItemTest(long itemCurrent, long itemCount, CloudQueue queue)
    {
        if (done)
            return false;

        CloudQueueMessage[] messages = null;

        while ((messages = queue.GetMessages((Int32)itemCount).ToArray()).Any())
        {
            foreach (var m in messages)
                queue.DeleteMessage(m);
        }

        done = true;

        return true;
    }

Я не понимаю, что я делаю неправильно, тот же код, та же строка подключения, и я получил эти результаты.

Есть идеи?

ОБНОВЛЕНИЕ:

Кажется, проблема в том, как я ее вычисляю.

Я заменил times.Add(sw.ElapsedTicks); на times.Add(sw.ElapsedMilliseconds); и этот блок:

return new TestResult(id, test + " with " + itemCount.ToString() + " elements",
TimeSpan.FromTicks(times.Min()).TotalMilliseconds,                             
TimeSpan.FromTicks(times.Max()).TotalMilliseconds,     
TimeSpan.FromTicks((Int64)Math.Round(times.Average())).TotalMilliseconds);

длявот это:

return new TestResult(id, test + " with " + itemCount.ToString() + " elements", 
times.Min(),times.Max(),times.Average());

И теперь результаты похожи, так что, очевидно, есть разница в том, как обрабатывается точность или что-то в этом роде.Я исследую это позже.

Ответы [ 2 ]

2 голосов
/ 03 мая 2011

По-видимому, проблема заключалась в различном характере тиков StopWatch и TimeSpan, о чем говорилось здесь .

Свойство Stopwatch.ElapsedTicks

Тики секундомера отличаются от DateTime.Ticks.Каждый тик в значении DateTime.Ticks представляет один интервал в 100 наносекунд.Каждый тик в значении ElapsedTicks представляет интервал времени, равный 1 секунде, деленной на частоту.

1 голос
/ 28 апреля 2011

Как ваша загрузка процессора?Возможно ли, что ваш код заскочил на процессор, а ваша рабочая станция намного быстрее вашего узла Azure?

...