2016-11-24 16 views
1

Azure関数を評価してサムネイル画像を作成しています。より大きいイメージのソースURLはストレージキューに置かれ、キュートリガーを持つC#関数がURLを処理するために使用されます(ソースからサイズ変更、サイズ変更、および別の場所へのアップロード)。Azure関数の処理量が悪い

各関数呼び出しは処理に500msを要します。これは問題ありません。しかし、一連のテストを実行した後、私は、全体的な並列処理のスループットがそれほど高くないことを発見しました。キュー内のワークロードが1500-2000個の場合、プラットフォームは1秒あたり約10個のファンクションインスタンスしか実行しません。

スケールアウトして、プラットフォームが同時に複数の関数インスタンスを同時に実行できるようにする方法はありますか?

+0

function.jsonと機能コードを共有していただけますか?また、実行中の計画(消費/アプリケーションサービス)を明確にしてください。 – mathewc

答えて

5

消費(動的)プランで実行している場合、機能が維持されていないことがわかると、システムは自動的にさらに多くのインスタンスにスケールアウトされます。このスケールアウトは瞬間的なものではないため、新しいインスタンスの影響が見られる前に、追加されたインスタンスが追加される前または直後にテストが終了する可能性があります。 App Service(Classic)プランで実行している場合は、フロントインスタンスの数を制御し、必要な数にスケールアウトすることができます。

host.jsonファイルに設定できるキュー用の設定ノブがいくつかあり、機能アプリケーションインスタンスごとに並列度に影響します()。 queues構成セクションの下には、例えば、batchSizenewBatchThresholdを設定することができます。:

{ 
    "queues": { 
     "batchSize": 32, 
     "newBatchThreshold": 50 
    } 
} 

batchSizeをそれぞれにキューから取り出されたメッセージの数がフェッチです。バッチ内のすべてのメッセージは、次に並列処理されます。 newBatchThresholdは、メッセージの次のバッチがいつ取り出されるかを制御します。新しいバッチのメッセージは、現在処理中のメッセージの数がこのしきい値を下回った場合にのみ、キューからフェッチされます。したがって、newBatchThresholdを増やすと、より多くのメッセージを並行して処理することができます。これらの設定の詳細については、wiki hereを参照してください。

これらの設定を調整する際は、ワークロードを考慮する必要があります。たとえば、関数が非常にメモリ/ CPUを大量に使用する場合、1つのインスタンスで並列に実行する関数の数が多すぎることはありません。だから少し実験しなければならないかもしれません。

上記に加えて、スレッドがIO上で不必要にブロックされておらず、機能コード内にボトルネックが存在しないことを確認するために、関数が適切なasync関数であることを確認する必要があります自体。

関連する問題