gpt4 book ai didi

function - ffmpeg azure 函数消耗计划高容量请求的 CPU 可用性较低

转载 作者:行者123 更新时间:2023-12-04 23:08:27 24 4
gpt4 key购买 nike

我正在消费计划上运行 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,这会更有帮助)

再次感谢,爨。

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

live metrics cpu

CPU useageg

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

}

最佳答案

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

在写入 D:\local 后,我发现管理输入和输出的最简单方法就是将函数连接到 azure 存储容器并以这种方式处理细节。这样做可以使 70 个以上并发实例的平均 CPU 利用率保持在 90-100%。

关于function - ffmpeg azure 函数消耗计划高容量请求的 CPU 可用性较低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47373834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com