2016-12-02 11 views
3

Azure関数のスケールアウト機能は、HTTPトリガーとConsumption Service Planを使用して、より重量のあるコンソールアプリケーションでテストしました。私たちはスケールアウトを伴う並列実行を期待していました。 funcionインスタンスは同じプロセスで実行されているため、新しいAppDomainでコンソールアプリケーションを実行します。コンソールアプリケーションでは、メモリDB内でsqliteデータベース操作を行います。azure関数のスケールアウト

最初にこの関数を1回だけ実行し、実行時間を測定しました。それをxにしよう: 私たちは、連続して増加する数の並列スレッドを連続的に開始しました。これらのケースでは、1つの関数appインスタンスの実行時間はx * num_of_threadsでした。つまり、関数インスタンスが直列化され、並列に実行されないかのように。

  1. これはどのような理由が考えられますか?なぜ彼らは並行して実行されないのですか?
  2. デフォルトでは、どのハードウェアがありますか?それはかなり遅いです。消費計画で何とかアップグレードできますか?なぜスケールアウトされなかったのですか? sgはスケールアウト機能をブロックできますか?

ありがとうございました。

EDIT:私のアプリの基本的なソースコード:

答えて

3
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);   

    } 

} 

要求を並列に実行するが、言語に基づいて、差が(ノードは、例えば、シングルスレッドである)が存在しています。いくつかのワークロードで並列実行とスケーリングを検証したい場合は、hereを配備できるソリューションのgithubがあります。

あなたの関数は、いくつかの条件の下でより多くのインスタンスに拡張されますが、最も関連性の高いスループットです。Azure関数は、単位時間あたりに完了する要求の数を追跡し、 Hereは消費計画の仕組みに関する情報です。

ファンクションとサーバーレスコンピューティングの考え方は、開発者からその考慮事項を削除することです。関数 'インスタンス'は1.5GBのメモリで計算する単位と考えることができます。ハードウェアをよりコントロールしたい場合は、常にアプリケーションサービスプランで関数を実行できます。

作業負荷のためにこの「シリアライズされた」動作が発生している可能性があります。まったく新しいAppDomainでCPU依存ワークロードを起動して戻った場合、この関数はまだ作業中であることを追跡できないことがあります。この場合、スループットのスケーリング条件を満たさずにCPUを最大限に活用することができます。

+0

こんにちは、ありがとう。だから私は新しいappdomainで私のものを実行する問題自体が可能性がありますか?それとも、私はそれを非同期に実行するのですか?私はAppDomain.ExecuteAssemblyを使用していますが、私が知っているのは同期です。 –

+0

[AppDomain.ExecuteAssembly](https://msdn.microsoft.com/en-us/library/sxx9f4c2(v = vs.110).aspx)を見ると、実際には新しいAppDomainは作成されず、実行されているように見えますスケーリングが発生するはずです。再現しようとすると、テストコードが表示されるのが便利です。 また、混乱を解消するため、Azure関数は非同期呼び出しを適切に処理します。潜在的な問題を想像できる唯一のシナリオは、関数から完全に新しいプロセス/ AppDomains /スレッドを生成し、その完了を待つことがないということです。 –

+0

私のアプリケーションのソースコードを追加しました。私は、新しいappdomainが作成され、コンソールアプリケーションが同期して実行されると思う。 –

関連する問題