2016-12-02 2 views
3

Мы протестировали функцию масштабирования функций Azure с более тяжелым консольным приложением с триггером HTTP и планом обслуживания потребления. Таким образом, мы ожидали параллельного выполнения с масштабированием. Мы запускаем консольное приложение в новом AppDomain, потому что экземпляры funcion работают в одном процессе. В консольном приложении мы выполняем операции с базами данных sqlite в памяти db.azure function scale out

Сначала мы выполнили функцию только 1 раз и измерили время выполнения. Пусть это будет x :) Мы начали непрерывно увеличивать количество параллельных потоков. Мы столкнулись с тем, что время выполнения 1 экземпляра приложения-функции в этих случаях было x * num_of_threads. Так, как если бы экземпляры функции были бы сериализованы и не выполнялись параллельно.

  1. Что может быть причиной этого? Почему они не выполняются параллельно?
  2. Какое оборудование есть по умолчанию? Это довольно медленно. Может ли он каким-то образом обновиться в Плане потребления. Почему он не был расширен? Может ли функция sg уменьшить масштаб?

Спасибо вам за помощь.

EDIT: Основной исходный код моего приложения:

using System.Net; 
using System; 

public static HttpResponseMessage Run(HttpRequestMessage req, TraceWriter log, ExecutionContext context) 
{ 

    string testThreadId = req.GetQueryNameValuePairs() 
     .FirstOrDefault(q => string.Compare(q.Key, "id", true) == 0) 
     .Value; 

    var funcId = context.InvocationId.ToString(); 

    var homePath = Environment.GetEnvironmentVariable("HOME");  


    var folderName = Path.Combine(homePath,@"site\wwwroot\JanoRunTime2"); 
    var fileName = Path.Combine(folderName,"AzureFunctionTest.exe"); 
    var configFile = Path.Combine(folderName,"AzureFunctionTest.exe.config"); 
    var setup = new AppDomainSetup(); 
    setup.ApplicationBase = folderName; 
    setup.ConfigurationFile = configFile; 
    var newDomain = AppDomain.CreateDomain("JanoTestExecutorDomain_" + funcId, null, setup); 

try{ 

     newDomain.ExecuteAssembly(fileName, new []{testThreadId, funcId});   

     return req.CreateResponse(HttpStatusCode.OK); 

    } 
    catch(Exception e){ 
      return req.CreateResponse(HttpStatusCode.InternalServerError); 
    } 
    finally{ 
     AppDomain.Unload(newDomain);   

    } 

} 

ответ

3

Запросы выполняются параллельно, но существуют различия, основанные на языке (узел однопоточный, например). Если вы хотите, чтобы некоторые рабочие нагрузки проверяли параллельное выполнение и масштабирование, существует github решений, которые вы можете развернуть here.

Ваша функция будет масштабироваться для большего количества экземпляров в нескольких условиях, но наиболее актуальной является пропускная способность: Azure Functions отслеживает, сколько запросов выполняется за единицу времени и масштабируется, если это число падает. Here - это информация о том, как работает план потребления.

Что касается аппаратного обеспечения, то идея функций и бессерверных вычислений заключается в том, чтобы удалить это соображение от разработчика. Функциональный «экземпляр» можно рассматривать как единицу вычисления с 1,5 ГБ памяти. Если вы хотите больше контролировать оборудование, вы всегда можете запускать функции в плане обслуживания приложений.

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

+0

Привет, спасибо. Так может быть сама проблема, что я выполняю свои вещи в новом appdomain? Или только когда я выполняю его async? Я использовал AppDomain.ExecuteAssembly, который, как я знаю, синхронизирован. –

+0

Глядя на [AppDomain.ExecuteAssembly] (https://msdn.microsoft.com/en-us/library/sxx9f4c2 (v = vs.110) .aspx), он фактически не создает новый AppDomain и, кажется, запускается синхронно, поэтому масштабирование должно происходить. Было бы полезно увидеть, как ваш тестовый код пытается воспроизвести. Кроме того, чтобы устранить любую путаницу, Azure Functions будет правильно обрабатывать асинхронные вызовы. Единственный сценарий, когда я могу представить потенциальные проблемы, порождает совершенно новые процессы/AppDomains/threads из функций и не ждет их завершения. –

+0

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