0

消費プランで Azure キュー関数を実行しています。私の関数は FFMpeg プロセスを開始するため、非常に CPU を集中的に使用します。キュー内のアイテムが 100 未満の場合に一度に関数を実行すると、完全に機能し、Azure がスケールアップして十分な数のサーバーが提供され、すべてのタスクが非常に迅速に完了します。私の問題は、一度に 300 または 400 を超える項目を実行し始めると、正常に開始されますが、しばらくすると CPU の使用率が 80% から約 10% にゆっくりと変化することです。私の関数は 10% の CPU で時間内に終了できません。これは、下の画像で確認できます。関数が作成するインスタンスが増えるほど、CPU 使用率が低下する理由を知っている人はいますか? 前もって感謝します

編集: 関数はインスタンスごとに一度に 1 つだけ実行するように設定されていますが、host.json でインスタンスごとに 2 つまたは 3 つの同時プロセスに設定すると問題が発生します。

編集: CPU の低下はサーバー 15 ~ 20 で顕著になり、60 前後で障害が発生し始めます。その後、CPU は平均 8 ~ 10% で底を打ち、個人は 0 ~ 3% に達し、サーバー数は増加するようです。無制限 (サーバーに CPU があればもっと便利です)

もう一度ありがとう、クアン。

役立つ場合に備えて、この投稿の最後に関数コードも追加しました。

ライブ メトリック CPU

CPU使用率g

using System.Net;
using System;
using System.Diagnostics;
using System.ComponentModel;

public static void Run(string myQueueItem, TraceWriter log)
{
    log.Info($"C# Queue trigger function processed a request: {myQueueItem}");
    //Basic Parameters
        string ffmpegFile = @"D:\home\site\wwwroot\CommonResources\ffmpeg.exe";
        string outputpath = @"D:\home\site\wwwroot\queue-ffmpeg-test\output\";
        string reloutputpath = "output/";
        string relinputpath = "input/";
        string outputfile = "video2.mp4";
        string dir =  @"D:\home\site\wwwroot\queue-ffmpeg-test\";

    //Special Parameters

        string videoFile = "1 minute basic.mp4";
        string sub = "1 minute sub.ass";
    //guid tmp files

        // Guid g1=Guid.NewGuid();
        // Guid g2=Guid.NewGuid();
        // string f1 = g1 + ".mp4";
        // string f2 = g2 + ".ass";
        string f1 = videoFile;
        string f2 = sub;
    //guid output - we will now do this at the caller level
        string g3 = myQueueItem;
        string outputGuid = g3+".mp4";
    //get input files
    //argument
        string tmp = subArg(f1, f2, outputGuid );
    //String.Format("-i \"" + @"input/tmp.mp4" + "\" -vf \"ass = '" + sub + "'\" \"" + reloutputpath +outputfile + "\" -y");
    log.Info("ffmpeg argument is: "+tmp);


    //startprocess parameters
    Process process = new Process();
    process.StartInfo.FileName = ffmpegFile;
    process.StartInfo.Arguments =  tmp;
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;
    process.StartInfo.WorkingDirectory = dir;
    //output handler

    process.OutputDataReceived += new DataReceivedEventHandler(
        (s, e) => 
        { 
            log.Info("O: "+e.Data);
        }
    );
    process.ErrorDataReceived += new DataReceivedEventHandler(
        (s, e) => 
        { 
            log.Info("E: "+e.Data);
        }
    );
    //start process
    process.Start();
    log.Info("process started");
    process.BeginOutputReadLine();
    process.BeginErrorReadLine();
    process.WaitForExit();
}
public static void getFile(string link, string fileName, string dir, string relInputPath){
    using (var client = new WebClient()){
        client.DownloadFile(link, dir + relInputPath+ fileName);
        }

}
public static string subArg(string input1, string input2, string output1){
    return String.Format("-i \"" + @"input/" +input1+ "\" -vf \"ass = '" + @"input/"+input2 + "'\" \"" + @"output/" +output1 + "\" -y");

}
4

1 に答える 1