Я разрабатываю веб-сервис с использованием ASP.NET MVC3.
Один из методов HTTP API получает изображение из тела запроса POST и нуждается в его сохранении на диске для дальнейшей обработки.
Начало метода выглядит так:
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Interlocked.Increment(ref _generateCount);
byte[] fileBuffer;
using (Stream inputStream = Request.InputStream)
{
if (inputStream.Length == 0)
{
Trace.WriteLine("Submitted file is empty", "Warning");
inputStream.Close();
Interlocked.Decrement(ref _generateCount);
return new HttpStatusCodeResult(400, "Content is empty");
}
fileBuffer = new byte[inputStream.Length];
inputStream.Read(fileBuffer, 0, (int)inputStream.Length);
inputStream.Close();
}
stopwatch.Stop()
... (storing the fileBuffer on disk & quite CPU intensive processing on the file)
Я размещаю службу в небольшом экземпляре Azure.
Теперь странное поведение у меня возникает, когда я выполняю параллельные запросы к сервису.
Допустим, я выдаю первый запрос, а второй - через 5 секунд. Как вы видите, я использую секундомер для мониторинга производительности. Для первого запроса ElapsedTime будет очень маленьким (менее одной секунды), но для второго он обычно читается ок. 14 секунд!
Обратите внимание, что среднее время обработки одного запроса составляет ок. 25 секунд (и достигает 40+ при обработке нескольких запросов), поэтому я читаю свой поток ввода через 14 секунд, хотя первый запрос еще не завершен.
Как я могу объяснить эту задержку?
Спасибо