Function ffmpeg azure功能消耗计划高容量请求的低CPU可用性

Function ffmpeg azure功能消耗计划高容量请求的低CPU可用性,function,azure,ffmpeg,cpu-usage,serverless,Function,Azure,Ffmpeg,Cpu Usage,Serverless,我正在消费计划上运行azure队列函数;我的函数启动FFMpeg进程,因此非常占用CPU。当我在队列中同时运行少于100个项目的功能时,它可以完美地工作,azure可以扩展并为我提供大量服务器,所有任务都可以很快完成。我的问题是,一旦我开始一次处理300或400多个项目,它就会开始正常工作,但过了一段时间,CPU的利用率从80%慢慢变为10%左右-我的功能无法在只有10%CPU的情况下及时完成。这可以在下图中看到。 有人知道为什么我的函数创建的实例越多,CPU使用率就越低吗?提前谢谢你 编辑:该

我正在消费计划上运行azure队列函数;我的函数启动FFMpeg进程,因此非常占用CPU。当我在队列中同时运行少于100个项目的功能时,它可以完美地工作,azure可以扩展并为我提供大量服务器,所有任务都可以很快完成。我的问题是,一旦我开始一次处理300或400多个项目,它就会开始正常工作,但过了一段时间,CPU的利用率从80%慢慢变为10%左右-我的功能无法在只有10%CPU的情况下及时完成。这可以在下图中看到。 有人知道为什么我的函数创建的实例越多,CPU使用率就越低吗?提前谢谢你

编辑:该函数设置为每个实例一次只运行一个,但在host.json中设置为每个实例2或3个并发进程时存在问题

编辑:CPU下降在15-20台服务器上变得明显,在60台左右开始导致故障。在此之后,CPU以平均8-10%的速度触底,个人达到0-3%,服务器数量似乎无限增加(如果我在服务器上获得一些CPU,这将更有帮助)

再次感谢你,坤

我还在这篇文章的底部添加了函数代码,以防有帮助


当您使用D:\home目录时,您正在写入虚拟函数,这意味着每个实例必须不断尝试写入函数运行时的同一位置,这会导致大量I/O块。而是写入D:\local,然后将完成的文件发送到其他地方,这样就解决了这个问题,而不是每个实例不断地写入一个位置,它们只在完成时写入,然后写入一个设计用于处理高吞吐量的位置


在写入D:\local之后,我能找到的管理输入和输出的最简单方法就是将函数连接到azure存储容器,并以这种方式处理输入和输出。这样一来,对于70多个并发实例,平均CPU保持在90-100%

当您使用D:\home目录时,您正在写入虚拟函数,这意味着每个实例必须不断尝试写入函数运行时的同一位置,这会导致大量I/O块。而是写入D:\local,然后将完成的文件发送到其他地方,这样就解决了这个问题,而不是每个实例不断地写入一个位置,它们只在完成时写入,然后写入一个设计用于处理高吞吐量的位置

在写入D:\local之后,我能找到的管理输入和输出的最简单方法就是将函数连接到azure存储容器,并以这种方式处理输入和输出。这样一来,对于70多个并发实例,平均CPU保持在90-100%

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

}